WDK(Windows Driver Kit)是一種徹底集成的驅動程序開發系統,它包含 Windows DDK,用於測試 Wi
ndows 驅動器的可靠性和穩定性.linux
WDM 是 Win32設備驅動程序體系結構程序員
Windows設備驅動程序,過去是WDM(Windows Driver Model)框架,編程複雜,初學者難以掌握其編程
要領。爲了解決這一問題,微軟對WDM驅動程序的架構作了改進,造成了全新的WDF(Windows Driver F
oundation)框架結構。它提供了面向對象和事件驅動的驅動程序開發框架,大大下降了開發難度。從現
在開始,掌握Windows設備驅動程序的開發人員,由過去的「專業」人士,將變爲「普通」大衆。編程
WDF驅動程序包括兩個類型,一個是內核級的,稱爲KMDF(Kernel-Mode Driver Framework),爲SYS
文件;另外一個是用戶級的,稱爲UMDF(User-Mode Driver Framework),爲DLL文件。windows
Windows的驅動開發模型數組
在Windows的不一樣版本上開發的驅動程序 "模型"(模型這個詞語應該來源於單詞「Mode」。在Win
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實現對應的例程。