注:这不是一个问题,我遇到,但它是我 就好理解了(只是因为我 想成为一个更好的人,并 人类进一步 的地平线理解)。Win32 DDK:从驱动程序中断调用API是否错误?
在Raymond Chen的book的奖金章,
alt text http://ecx.images-amazon.com/images/I/51UE9zCS%2B2L._SL500_AA240_.jpg
雷蒙德给出了声卡驱动程序中错误的例子:
原有的功能,称为在 硬件中断时间,看起来像这样在DDK :
void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg, DWORD dwParam1, DWORD dwParm2) { if (pPostAlloc->dwCallback) DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags), pPortalloc->hMidi, msg, dwParam1, dwParam2); }
其功能的版本看起来 这样的:
void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg, DWORD dwParam1, DWORD dwParm2) { char szBuf[80]; if (pPostAlloc->dwCallback) { wsprintf(szBuf, " Dc(hMidi=%X,wMsg=%X)", pPortalloc->hMidi, msg); #ifdef DEBUG OutputDebugString(szBuf); #endif DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags), pPortalloc->hMidi, msg, dwParam1, dwParam2); } }
不仅是有零售代码调试吃剩的东西,但它是 在调用硬件中断时间noninterrupt-安全功能 。如果
wsprintf
函数曾经得到 丢弃,则系统将在 硬件中断内发生 段不存在的故障,导致很快死亡。
现在,如果我在看那个代码,我不会猜到一个调用库函数wsprintf会是一个问题。如果我的驱动程序代码需要使用Win32 API,会发生什么情况?
什么是段错误?我了解页面错误的概念:我需要的代码位于已交换到硬盘驱动器的页面上,并且需要在代码执行继续之前从硬盘驱动器恢复。当我们处于设备驱动程序的中断时,什么是segment fault?
是页面错误保护模式相当于段故障的?如何避免段错误? Windows是否换出设备驱动程序代码?我将如何阻止“wsprintf被丢弃”?什么会导致wsprintf被“丢弃”?什么是“丢弃”?丢弃的优点是什么?什么时候发生什么un丢弃
为什么从一个驱动程序里调用一个API调用不好,以及如何解决它?
请注意,上面的MIDI东西是不是司机的东西。使用MIDI堆栈的代码在用户模式下运行100%,因此下面答案中的大部分注释并不特别相关。 – 2010-01-07 01:01:10
我不想抄袭太多雷蒙德的书,但故事开头,称它从Windows 95推出的时代是 - 遥想当年PC蜂鸣器是由8254 PIC运行:P – 2010-01-07 01:24:15