摘 要 在目前流行的Windows操作系統中,設備驅動程序是操縱硬件的最底層軟件接口。筆者結合個人經驗,在此分享設備驅動程序設計過程中的一些經驗,給出設備驅動程序通知應用程序的4種方法,具體說明每種方法的原理和實現過程,希望能夠給設備驅動程序的設計者提供一些幫助。
關鍵字 Windows系統 驅動程序 通知應用程序 設計 方法
中圖分類號: TP316 文獻標識碼:A
1 前言
操作系統的穩定性及可移植性是務必要優先確保的,為此Windows操作系統不支持應用程序直接訪問系統的硬件資源,而是必須借助于相應的設備驅動程序。設備驅動程序可以直接操作硬件,假如應用程序和設備驅動程序之間實現了雙向通信,也就達到了應用程序控制底層硬件設備的目的。
2 通知應用程序設計四種方法
鑒于設備驅動程序通知應用程序的重要性,本人結合一些經驗,對它進行了總結,歸納出5種方法摘要:異步過程調用(APC)、事件方式(VxD)、消息方式、異步I/O方式和事件方式(WDM)。下面分別說明這幾種方式的原理。
2.1 異步過程調用(APC)
Win32應用程序使用CreateFile()函數動態加載設備驅動程序,然后定義一個回調函數backFunc(),并且將回調函數的地址%26amp;backFunc()作為參數,通過DeviceIoControl()傳送給設備驅動程序。回調函數的輸入參數是由設備驅動程序填入的,回調函數在這里主要是對消息進行處理。
2.2 事件方式(VxD)
首先,Win32應用程序創建一個事件的句柄,稱其為Ring3句柄。由于虛擬設備驅動程序使用事件的Ring0句柄,因此,需要創建Ring0句柄。用LoadLibrary()函數加載未公開的動態鏈接庫Kernel32.dll,獲得動態鏈接庫的句柄。然后,調用GetProcAddress(), 找到函數OpenVxDHandle()在動態鏈接庫中的位置。接著,用OpenVxDHandle()函數將Ring3事件句柄轉化為Ring0事件句柄。Win32應用程序用CreateFile()函數加載設備驅動程序。
2.3 消息方式
Win32應用程序調用CreateFile()函數動態加載虛擬設備驅動程序。加載成功后,通過調用DeviceIoControl()函數將窗體句柄傳送給VxD,VxD利用這個句柄向窗體發消息。當條件滿足時,VxD調用SHELL_PostMessage()函數向Win32應用程序發送消息。SHELL_PostMessage()函數的第一個參數為Win32窗體句柄,第二個參數為消息ID號,第三、四個參數為發送給消息處理函數的參數,第五、六個參數為回調函數和傳給它的參數。Win32應用程序收到消息后,對消息進行處理。
2.4 事件方式(WDM)
Win32應用程序首先創建一個事件,然后將該事件句柄傳給設備驅動程序,接著創建一個輔助線程,等待事件的有信號狀態,自己則接著干其他事情。設備驅動程序獲得該事件的句柄后,將它轉換成能夠使用的事件指針,并且把它寄存起來,以便后面使用。
3 結語
在目前流行的Windows操作系統中,設備驅動程序是操縱硬件的最底層軟件接口。它向上提供和硬件無關的用戶接口,向下直接進行I/O、硬件中斷、DMA和內存訪問等操作。它將應用程序和硬件細節屏蔽開來,使軟件不依靠于硬件并且可在多個不同的平臺之間移植。這4種方法都經過實際測試。測試結果表明,它們都能夠達到設備驅動程序通知應用程序的目的。
參考文獻
[1] 李和平. 基于DSP的ICT圖像重建系統探究. 北京摘要: 北京航空航天大學機械工程及自動化學院, 2002
[2] (美)Chris Cant. Windows WDM設備驅動程序開發指南. 孫義, 馬莉波, 國雪飛等譯. 北京摘要: 機械工業出版社 2000
[3] 歐青立,徐建波,李方敏,等. 虛擬設備驅動程序VxD的探究和開發. 計算機工程,2003