dowsNT上,驅動程序被稱為KernelDriverMode驅動程序。
筆者認為這個Mode是指一種驅動程序的結構和
運作的規范),有過不同的名稱。比如在Windows9x上的驅動程序,都叫做VXD,而在WindowsNT上的驅動
程序被稱為KDM驅動程序,Windows98~2000這個時期出現的新模型叫做WDM。
Windows的驅動模型概念,本來是就驅動程序的行為而言的。比如WDM驅動,必須要滿足提供n種被要
求的特性(如電源管理、即插即用)才被稱為"WDM驅動"。如果不提供這些功能,那麼統一稱為NT式驅動。
同樣的,WDF驅動也有它的一系列規范。
但是本書采用簡單的區分方法。將一切在Windows2000~WindowsVista下能正常運作且未調用WDF相
關的內核API函數的驅動都稱為傳統型驅動(包括NT式和WDM)。如果調用了WDF相關的內核API則稱為WD
F驅動。
請注意:WDF驅動是可以調用傳統型驅動所調用的內核API的,WDF可以視為傳統型的升級版。
模型的發展並不是和操作系統版本的升級齊步走的,而是有一個逐漸替代的過程。比如Windows98已
經支持部分的WDM驅動程序,但是又支持一部分的VXD驅動。而到了Windows2000,則VXD這種驅動程序完
全被淘汰了。KDM則是WDM的前身。WDM是在KDM的基礎上增加了一些新的特性,制定了一些新的規范而造
就的。絕大部分函數調用都是通用的。當然,Windows9x系列的內核完全不同,所以VXD與之相比,就沒
有一個內核API函數是一樣的。
故而隨著Windows9x的失寵,VXD難逃徹底被淘汰的命運。WindowsNT則發展成了後來的Windows版本
,KDM也變成了WDM而存在下來。當然,微軟不會閒著,現在又推出了新的WDF。讀者又不得不擔心:本書
是用WDM寫的還是用WDF寫的呢?會不會剛剛學完又被淘汰呢?
和VXD不同,從KDM到WDM再到WDF是一脈相承的,基本上KDM程序員在學習WDM時已經占盡了便宜。到
WDF也不例外,WDF與其說是新的驅動開發模型,還不如說是在已有的內核API和數據結構的基礎上,又封
裝出一套讓使用者覺得更簡單、更易用的以Wdf-開頭的一組API。因此,讀者大可不必擔心WDF的發展會
讓前面學習傳統型驅動的努力付之東流。一個典型的例子是:大約在1991年到1992年間發布首個版本的
硬盤上層過濾diskperf的代碼,18年過去了,今天依然可以編譯並正常在最新版本的Vista上運行。
本書對於大部分無法找到WDF實例的章節,都采用了傳統型驅動進行說明。比如磁盤過濾、文件系統
過濾和網絡中間層驅動。此外為了從簡單入手,對於入門級的兩個例子(串口和鍵盤)也使用了傳統型
驅動。但是虛擬磁盤和虛擬網卡(第5章和第11章),使用了WDF版本的例子,請讀者注意識別。
服務控制管理程序 SCM
類似於linux的守護進程(在linux或者unix操作系統中在系統的引導的時候會開啟很多服務,這些服務
就叫做守護進程)
windows服務在系統啟動是加載,用戶需在服務控制平台開啟或者關閉服務
Driver Service是服務的一個特例,遵循windows服務的協議
加載和諧在NT驅動分為四個步驟:
1.為NT驅動創建新的服務
2.開啟此項服務
3.關閉此項服務
4.刪除NT驅動創建的服務
以上四個步驟都是通過SCM組建的服務來實現的。
IO請求包-IRP
IRP(IO請求包)用於win32和驅動程序通訊,NT內核有一個組件叫做IO管理器。IO管理器負責IRP的分發
,驅動程序裡創建好設備並且創建好符號鏈接後,Win32就可以加載驅動了。而要讓一個驅動可以處理I
RP,必需給驅動添加IRP處理例程。
添加的方法就是再DriverEntry裡面對驅動對象DriverObject操作。該參數是一個指針,指向驅動對象,
驅動對象內部有一個MajorFunction數組,該數組的類型是
NTSTATUS (*PDRIVER_DISPATCH) (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) 。這是一個函數指
針,指向每個IRP對於的處理例程。最後就是為所有需要處理的IRP實現對應的例程。