Windows的驅動開發模型

whatday發表於2013-06-27
在Windows的不同版本上開發的驅動程式“模型”(模型這個詞語應該來源於單詞“Mode”。在Windows NT上,驅動程式被稱為Kernel Driver Mode驅動程式。筆者認為這個Mode是指一種驅動程式的結構和運作的規範),有過不同的名稱。比如在Windows 9x上的驅動程式,都叫做VXD,而在Windows NT上的驅動程式被稱為KDM驅動程式,Windows 98~2000這個時期出現的新模型叫做WDM。

        Windows的驅動模型概念,本來是就驅動程式的行為而言的。比如WDM驅動,必須要滿足提供n種被要求的特性(如電源管理、即插即用)才被稱為WDM驅動。如果不提供這些功能,那麼統一稱為NT式驅動。同樣的,WDF驅動也有它的一系列規範。

        但是本書採用簡單的區分方法。將一切在Windows 2000~Windows Vista下能正常運作且未呼叫WDF相關的核心API函式的驅動都稱為傳統型驅動(包括NT式和WDM)。如果呼叫了WDF相關的核心API則稱為WDF驅動。
請注意:WDF驅動是可以呼叫傳統型驅動所呼叫的核心API的,WDF可以視為傳統型的升級版。

        模型的發展並不是和作業系統版本的升級齊步走的,而是有一個逐漸替代的過程。比如Windows 98已經支援部分的WDM驅動程式,但是又支援一部分的VXD驅動。而到了Windows 2000,則VXD這種驅動程式完全被淘汰了。KDM則是WDM的前身。WDM是在KDM的基礎上增加了一些新的特性,制定了一些新的規範而造就的。絕大部分函式呼叫都是通用的。當然,Windows 9x系列的核心完全不同,所以VXD與之相比,就沒有一個核心API函式是一樣的。

        故而隨著Windows 9x的失寵,VXD難逃徹底被淘汰的命運。Windows NT則發展成了後來的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版本的例子,請讀者注意識別。

本文摘自《寒江獨釣:Windows核心安全程式設計》

發展過程:NT式驅動-》WDM驅動-》WDF驅動

相關文章