注:這不是一個問題,我遇到,但它是我 就好理解了(只是因爲我 想成爲一個更好的人,並 人類進一步 的地平線理解)。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