模塊化的設(shè)備驅(qū)動程序設(shè)計方法
NTSTATUSDriverEntry(INPDRIVER_OBJECT
}
4應用程序與驅(qū)動程序之間的同步
一般在設(shè)備驅(qū)動程序中用中斷服務例程來訪問和操作硬件設(shè)備,它利用應用程序傳遞過來的數(shù)據(jù)進行中斷操作。為了保證外界設(shè)備正常工作,在驅(qū)動程序中一定要有一個緩沖區(qū)來存儲一定數(shù)量的數(shù)據(jù)。例如在數(shù)控加工中,讓機床切一個圓,必須保證機床在切這個圓時的動作連續(xù),如果沒有一個緩沖區(qū)存儲一定數(shù)量的數(shù)據(jù),就有可能出現(xiàn)驅(qū)動程序等待應用程序傳遞數(shù)據(jù),從而造成機床的暫時停頓。然而如果在驅(qū)動程序中開一個緩沖區(qū)來存儲數(shù)據(jù),也會產(chǎn)生一個問題:應用程序傳遞的數(shù)據(jù)與這些數(shù)據(jù)的執(zhí)行之間有一定的時間差,導致應用程序不知道設(shè)備正在進行什么操作。為了解決這個問題,也就是要保證應用程序與驅(qū)動程序之間的同步。有了這個同步信號,可以讓應用程序了解設(shè)備正在進行何種操作。解決同步問題可以用Event對象。
具體方法:在驅(qū)動程序中創(chuàng)建內(nèi)核的Event對象,但是又因為驅(qū)動程序和應用程序分別運行于核心層和用戶層,因此他們之間要看到對方定義的事件相對比較困難,必須要有一個專門的事件名存放空間。這里有一個命名方法可以使用戶層和核心層都可看到Event對象,事件命名應為L\BaseNamedObjects\xxx形式。
在核心層用IoCreateNotificationEvent創(chuàng)建一個Event對象,用KeSetEvent把Event對象設(shè)置為Signal。用戶層用OpenEvent創(chuàng)建Event對象,這個Event對象名一定要與在核心層創(chuàng)建的Event對象名一樣,然后用戶層用WaitForSingleObject等待Event對象的狀態(tài)為Signal,一旦Event對象的狀態(tài)為Signal,讓應用程序訪問一次驅(qū)動程序,從而可以讓應用程序知道設(shè)備正在進行的操作,保證應用程序與驅(qū)動程序之間的同步。
5設(shè)備驅(qū)動程序的安裝
設(shè)備驅(qū)動程序的安裝可以分為:手動安裝、非標準驅(qū)動程序的最終用戶安裝和標準驅(qū)動程序的最終用戶安裝。這里主要介紹前兩種方法。
5.1手動安裝
主要用于驅(qū)動程序的開發(fā)過程中,主要執(zhí)行以下的基本步驟:
(1)把編譯好的*.sys文件拷貝到系統(tǒng)的%SystemRoot%\system32\drivers目錄下。
(2)在注冊表中加入合適的項:
(3)使用控制面板中的Device應用小程序啟動驅(qū)動程序。
5.2非標準驅(qū)動程序的最終用戶安裝
主要是使用下面一些Win32API調(diào)用建立自己的安裝程序:
(1)CopyFile把驅(qū)動程序文件(包括一些自己定義的參數(shù)文件)拷貝到指定的目錄。
(2)RegCreateKeyEx和RegSetValueEx在Registry中建立驅(qū)動程序需要的鍵和值。
(3)CreateService和StartService創(chuàng)建和啟動驅(qū)動程序。
(4)OpenService和DeleteService來卸載驅(qū)動程序。
6結(jié)論
通過模塊化的方法介紹了驅(qū)動程序的寫法、驅(qū)動程序的開發(fā)環(huán)境和安裝,給讀者一個清晰的驅(qū)動程序的開發(fā)過程,有助于初學者快速抓住驅(qū)動程序開發(fā)的框架。
評論