姜靈利
摘 要:當前的電腦操作系統中Windows的應用最為廣泛,作為操作硬件最基礎的軟件接口,設備驅動程序具有重要的作用。文章主要針對當前所使用的設備驅動程序的設計經驗進行了討論,給出了五種通知應用程序方案,并針對其原理進行了分析,希望能夠同廣大設計者進行交流共同促進程序的完善和進步。
關鍵詞:設備驅動程序;應用程序;方法C
在操作系統的應用中,穩定性是系統的基礎性要求,另外要求系統應用程序具有可移植特性,但是在Windows系統中,應用程序無法直接進行硬件資源的訪問,而是需要通過設備驅動程序。而硬件設備由驅動程序進行直接操作,應用程序想要控制硬件設備便需要同驅動程序之間形成雙向通訊。該雙向通訊主要包含兩方面內容。首先是應用程序需要向驅動程序進行數據的傳輸;其次,則是驅動程序向應用程序進行消息的傳遞。二者相比較,應用程序向驅動程序進行數據傳輸的較容易實現,只需要CreateFile函數將驅動程序句柄獲得后,就可以使用。而后期,驅動程序在完成對設備的控制后,需要進行數據的采集,繼而通知應用程序,將數據傳遞走。
驅動程序在完成數據的收集后,對應用程序的通知具有重要的作用,因而結合實際系統運行情況以及應用狀況,文章對該環節進行了總結,提出了五種方法,在以下內容中予以說明。主要針對APC、VxD、消息方式以及異步I/O和WDM五種方式的原理展開了探討。
1 APC
APC即通常縮成的異步過程調用方式,在應用過程中通過CreateFile函數,Win32系統對驅動程序進行動態加載,繼而采用backFunc函數進行定義,同時將該函數地址通過DeviceIoControl作為參數傳遞至驅動程序。獲取地址后,驅動程序會將該參數保存在全局變量中,并對應用程序線程句柄進行獲取,通過對Get_Cur_Thread_
Handle函數的調用,得到句柄后,將其保存在全局變量中,當滿足應用個條件后,調用VWIN32_QueueUserApc函數,進行消息的發送,完成同應用程序的通訊。需要注意的是該函數所具有的參數摘要數量為三,其中兩個為已經注冊的參數。當消息為應用程序鎖接收后,應用程序會自動對回調函數進行調用。回調函數的主要作用為處理消息,由驅動程序對其參數進行輸入。
2 VxD
所謂的VxD方式即事件方式,該種方式的應用需要應用程序首先進行時間句柄的創建,通過Win32程序創建的句柄被稱作Ring3句柄。虛擬驅動往往會使用Ring0句柄,因此需要該句柄的創建。其中,動態鏈接庫Kernel32.dll為非公開動態鏈接庫,由LoadLibrary函數進行加載,從而得到其句柄。并在動態鏈接庫中確定OpenVxDHandle函數,通過調用GetProcAddress予以實現。繼而進行Ring3句柄和Ring0句柄之間的轉換,由OpenVxDHandle函數實現。通過CreateFile函數應用程序即可完成對驅動程序的加載。完成上述步驟后,將RING0時間句柄通過相關函數向事件方式進行傳遞;并進行輔助線程的創建,待信號接通。一旦滿足條件,那么VxD中Ring0事件會觸發Ring3事件信號。那么該種情況下,應用程序就可以對該消息進行接受處理,從而完成應用程序同驅動程序之間的數據、信息交流,達到對基層硬件的控制目的。
3 消息方式
通過CreateFile函數的調用,應用程序可以對驅動程序予以動態加載。完成加載后,通過相關函數調用將句柄傳至VxD,繼而通過該句柄對窗體進行消息發送。完成上述內容后,通過對SHELL_Pos
tMessage函數的調用,VxD可以完成同應用程序之間的消息傳送。并通過對消息的自定義保證函數的成功應用,并且其定義同樣需要在應用程序中進行;另外對于定義的消息處理函數需要在循環中予以定義,從而快速對其進行處理。應用程序窗體句柄為SHELL_PostMessage函數的第一個參數,而第二個參數則作為Win32的消息ID號,剩余參數用作處理發送消息的函數參數以及回調函數參數。應用程序完成消息的接收后對其進行處理。
4 異步I/O方式
Win32應用程序首先調用CreateFile函數加載設備驅動程序。在調用該函數時,將倒數第2個參數設置為FILE_ATTRIBUTE_NO
RMAL|FILE_FLAG_OVERLAPPED,表示以后可以對文件進行重疊I/O操作。當設備驅動程序文件創建成功后,創建一個初始態為無信號、需要手動復位的事件,并且將這個事件傳給類型為OVERLAPPED的數據結構。然后,將Overlapped作為一個參數,傳給DeviceIoControl函數。設備驅動程序把這個I/O請求包(IRP)設置為掛起狀態,并且設置一個取消例程。假如當前IRP隊列為空,則將這個IRP傳送給StartIo例程;否則,將它放到IRP隊列中。設備驅動程序做完這些工作后,結束這個DeviceIoControl的處理,于是Win32應用程序可能不等待IRP處理完,就從DeviceIoControl的調用中返回。通過判定返回值,得到IRP的處理情況。假如當前IRP處于掛起狀態,則主程序先做一些其他的工作,然后調用WaitForSingleObject或WaitForMultipleObject函數等待Overlapped中的事件成為有信號狀態。設備驅動程序在適當的時候處理排隊的IRP,處理完成后,調用IoCompleteRequest函數。完成上述步驟后,該函數會對Overlapped信號狀態進行調整,使得其時間信號轉變為有信號狀態。而應用程序根據信號狀態的轉變會立刻進行相應,不再進行等待,同時將事件信號狀態進行復位,使之恢復為無信號,繼而對GetOverlappedResult進行調用。
5 WDM
該方式即事件方式,由應用程序首先進行事件的創建,繼而將句柄傳至驅動程序,完成事件句柄的傳送后,創建輔助線程。待事件信號狀態轉變。驅動程序獲得由應用程序傳輸的句柄后,將其轉換為事件指針并寄存,方便其對硬件設備的控制使用。當具有操作條件后,驅動程序會改變事件信號狀態,則應用程序會接受到該消息,并進行處理,由輔助線程進行傳輸。此外需要注意,若該程序事件不能再被使用,那么應當將指針解除。
6 結束語
當前的操作系統中,作為硬件的操作接口,驅動程序起到了關鍵作用。通過驅動程序能夠進行I/Ohuozhe DMA、甚至是終端硬件以及內存訪問,而向上則可以提供用戶接口。通過驅動程序將硬件同應用程序分開,從而使得軟件具有可移植性,而不依賴于硬件。文章通過對五種驅動程序同應用程序支架的通知方法進行了分析。前三種方式應用基礎主要為VxD,而后兩種則是WDM。通過實際的應用可以表明,這五種通知方式都能夠保證驅動程序對應用程序進行信息的通知傳遞。
參考文獻
[1]孫磊.Windows系列操作系統下的底層驅動技術在實時控制系統中的應用[D].中國科學院研究生院(西安光學精密機械研究所),2007.
[2]劉仁峰.基于PCI總線的嵌入式設備驅動程序設計與研究[D].華中科技大學,2004.