注意:这不是我遇到的问题,但这是我想了解的事情(只是因为我想成为一个更好的人,并进一步扩大人类理解的视野)。
在Raymond Chen的书的附赠章节中,
Raymond 给出了声卡驱动程序中的错误示例:
在硬件中断时调用的原始函数在 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); } }
零售代码中不仅有剩余的调试内容,而且还在硬件中断时调用非中断安全函数。如果
wsprintf
函数被丢弃,系统将在硬件中断中出现段不存在故障,从而导致相当快的死亡。
现在,如果我正在查看该代码,我不会猜到调用库函数wsprintf会是一个问题。如果我的驱动程序代码需要使用 Win32 API 会怎样?
什么是段故障?我理解页面错误的概念:我需要的代码位于已换出到硬盘驱动器的页面上,并且需要在代码执行继续之前从硬盘驱动器返回。当我们在设备驱动程序的中断中时,什么是段错误?
页面错误是段错误的保护模式吗?如何避免段错误?Windows 是否会换出设备驱动程序代码?我将如何阻止“ wsprintf 被丢弃”?什么会导致 wsprintf 被“丢弃”?什么是“丢弃”?丢弃有什么好处?当它有东西未被丢弃时
为什么从驱动程序内部调用 API 调用不好,如何解决它?