模塊化的設備驅動(dòng)程序設計方法
NTSTATUSDriverEntry(INPDRIVER_OBJECT




}
4應用程序與驅動(dòng)程序之間的同步
一般在設備驅動(dòng)程序中用中斷服務(wù)例程來(lái)訪(fǎng)問(wèn)和操作硬件設備,它利用應用程序傳遞過(guò)來(lái)的數據進(jìn)行中斷操作。為了保證外界設備正常工作,在驅動(dòng)程序中一定要有一個(gè)緩沖區來(lái)存儲一定數量的數據。例如在數控加工中,讓機床切一個(gè)圓,必須保證機床在切這個(gè)圓時(shí)的動(dòng)作連續,如果沒(méi)有一個(gè)緩沖區存儲一定數量的數據,就有可能出現驅動(dòng)程序等待應用程序傳遞數據,從而造成機床的暫時(shí)停頓。然而如果在驅動(dòng)程序中開(kāi)一個(gè)緩沖區來(lái)存儲數據,也會(huì )產(chǎn)生一個(gè)問(wèn)題:應用程序傳遞的數據與這些數據的執行之間有一定的時(shí)間差,導致應用程序不知道設備正在進(jìn)行什么操作。為了解決這個(gè)問(wèn)題,也就是要保證應用程序與驅動(dòng)程序之間的同步。有了這個(gè)同步信號,可以讓?xiě)贸绦蛄私庠O備正在進(jìn)行何種操作。解決同步問(wèn)題可以用Event對象。
具體方法:在驅動(dòng)程序中創(chuàng )建內核的Event對象,但是又因為驅動(dòng)程序和應用程序分別運行于核心層和用戶(hù)層,因此他們之間要看到對方定義的事件相對比較困難,必須要有一個(gè)專(zhuān)門(mén)的事件名存放空間。這里有一個(gè)命名方法可以使用戶(hù)層和核心層都可看到Event對象,事件命名應為L(cháng)\BaseNamedObjects\xxx形式。
在核心層用IoCreateNotificationEvent創(chuàng )建一個(gè)Event對象,用KeSetEvent把Event對象設置為Signal。用戶(hù)層用OpenEvent創(chuàng )建Event對象,這個(gè)Event對象名一定要與在核心層創(chuàng )建的Event對象名一樣,然后用戶(hù)層用WaitForSingleObject等待Event對象的狀態(tài)為Signal,一旦Event對象的狀態(tài)為Signal,讓?xiě)贸绦蛟L(fǎng)問(wèn)一次驅動(dòng)程序,從而可以讓?xiě)贸绦蛑涝O備正在進(jìn)行的操作,保證應用程序與驅動(dòng)程序之間的同步。
5設備驅動(dòng)程序的安裝
設備驅動(dòng)程序的安裝可以分為:手動(dòng)安裝、非標準驅動(dòng)程序的最終用戶(hù)安裝和標準驅動(dòng)程序的最終用戶(hù)安裝。這里主要介紹前兩種方法。
5.1手動(dòng)安裝
主要用于驅動(dòng)程序的開(kāi)發(fā)過(guò)程中,主要執行以下的基本步驟:
(1)把編譯好的*.sys文件拷貝到系統的%SystemRoot%\system32\drivers目錄下。
(2)在注冊表中加入合適的項:

(3)使用控制面板中的Device應用小程序啟動(dòng)驅動(dòng)程序。
5.2非標準驅動(dòng)程序的最終用戶(hù)安裝
主要是使用下面一些Win32API調用建立自己的安裝程序:
(1)CopyFile把驅動(dòng)程序文件(包括一些自己定義的參數文件)拷貝到指定的目錄。
(2)RegCreateKeyEx和RegSetValueEx在Registry中建立驅動(dòng)程序需要的鍵和值。
(3)CreateService和StartService創(chuàng )建和啟動(dòng)驅動(dòng)程序。
(4)OpenService和DeleteService來(lái)卸載驅動(dòng)程序。
6結論
通過(guò)模塊化的方法介紹了驅動(dòng)程序的寫(xiě)法、驅動(dòng)程序的開(kāi)發(fā)環(huán)境和安裝,給讀者一個(gè)清晰的驅動(dòng)程序的開(kāi)發(fā)過(guò)程,有助于初學(xué)者快速抓住驅動(dòng)程序開(kāi)發(fā)的框架。
評論