注:これは私が経験している問題ではありませんが、理解したいことです(私がより良い人間になり、人間の理解の地平をさらに広げたいという理由だけで)。
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の呼び出しが問題になるとは思いもしませんでした。ドライバーコードでWin32APIを使用する必要がある場合はどうなりますか?
セグメンテーション違反とは何ですか?ページフォールトの概念を理解しています。必要なコードは、ハードドライブにスワップアウトされたページにあり、コードの実行を続行する前にハードドライブから戻る必要があります。デバイスドライバーの割り込み内にいるときのセグメンテーション違反とは何ですか?
ページフォールトは、セグメントフォールトと同等の保護モードですか?セグメンテーション違反を回避するにはどうすればよいですか?Windowsがデバイスドライバーコードを交換することはありますか?「wsprintfが破棄されるのを防ぐにはどうすればよいですか?」wsprintfが「破棄」される原因は何ですか?「廃棄」とは何ですか?廃棄することの美徳は何ですか?何かが捨てられていないとき
ドライバーの内部からAPI呼び出しを呼び出すのはなぜ悪いのですか、そしてそれをどのように回避するのでしょうか?