WDK

WDK

(Windows Driver Kit)是一種完全集成的驅動程序開發系統,它包含Windows Driver Device Kit (DDK),用於測試 Windows 驅動器的可靠性和穩定性。

簡介


目前微軟最新版本為Windows Driver Kit 8 Consumer Preview 支持 Windows 8, Windows 7,和 Windows Vista.
包括:
Windows 驅動程序基礎 (WDF) 簡化了 Windows 驅動程序的開發和支持。
頭文件重構(Windows Vista 和更高版本)通過提供更簡單的目錄結構、避免聲明衝突以及對所有支持的 Windows 版本使用單一頭文件集,減小頭文件的複雜性。
可安裝文件系統 (IFS) 工具包將頭、庫、示例以及文檔作為 WDK 的一部分分發。
驗證程序和靜態分析工具(如 PREfast 和靜態驅動程序驗證程序)幫助您在編譯時查找 bug。

源代碼編譯

在微軟官網上下載 WDK 開發包,裡面有 WDK 編譯器,鏈接器,配置工具,如NMAKE。然後,用記事本寫 C 或 C++ 文件,編譯,鏈接就 OK 了。WDK 庫是一定要的,否則頭文件,導入庫都沒有,就無法編譯了。至於編譯器和連接器,其實就是普通的 cl.exe 和 link.exe 兩個工具,和 VS 中的 VC 編譯鏈接器是同一個。編譯的方法是:在自己的目錄如 c:\wdkdemo 中有個待編譯的 wdkdemo.c ,那麼需要在這個目錄里加入兩個文件,一個是 makefile (無後綴名)的固定文件名,內容也是固定的:INCLUDE $(NTMAKEENV)\makefile.def另外一個文件是 sources (無後綴名)的固定文件名,內容為:targettype=drivertargetname=objsources=wdkdemo.c這兩個文件都是讓nmake 工具配置用的,最終調用合適的編譯器和鏈接器開關來編譯出 sys。WDK包有個 build 命令行工具,當配置好了以上兩個文件后。雙擊 build 工具,進入到 c:\wdkdemo 目錄,輸入命令 build 回車,然後只要 wdkdemo.c 源代碼正確,就會生成 sys 文件了。

sys文件安裝

在網上下載個免費的驅動安裝工具,這個不難吧,一般調試用的驅動,建議在安裝的時候,千萬記得要選擇手動模式,因為自啟動模式,如果驅動有BUG ,會導致藍屏,重啟機器后,驅動因自啟動又被載入,導致再次藍屏。

調試

在微軟官網下個 windbg ,但 windbg 需要調試機和被調試機模式,因此 windbg 最好配合 vmware 來使用。我感覺,sys 文件編譯是很麻煩的。不如編譯應用程序,只要一個 VS 可以搞定大部分的事情。驅動開發需要很多關於其他工具的知識。譬如,用記事本或者NOTEPAD++編輯源代碼感覺很吃力,因為 VS 沒有驅動開發的項目,因此 VS 不直接支持驅動開發,當然,可以進行配置,但 VS 配置驅動是很麻煩的。另外, windbg 有很多的調試命令,當然常規的命令一般4、5個就夠用了。VMWARE 的配置也是很麻煩的,當初,我自己研究了很長時間,網上雖然有教程,但都是講得不全面,譬如要配置10個地方,網上都是只說7、8個,導致 VMWARE 配置不成功。驅動開發還有 DRIVER STUDIO 這麼一個 IDE 可以使用,另外還有 IRPTRACE ,DEVICE TREE , DEBUG VIEWER 等工具。我開發驅動的工具是 VMWARE + VS2010 + WDK + WINDBG + WINOBJ + IRPTRACE + DEBUG VIEWER 這幾個。

使用

WDK+WIN7+VS使用:首先,新建一個WIN32控制台工程,選擇空項目。然後新建一個.cpp文件。接下去所有的項目屬性不要修改,需要修改的地方如下,至於有些修改的含義,就不多說了,一說又一大堆。VS 中配置 WDK 選項:(假定 WDK 安裝目錄為 C:\WinDDK\7600.16385.1,機器上的配置如下:
一、C/C++
1.常規*附加包含目錄:編輯添加3個路徑,分別對應WDK安裝目錄\INC子目錄中的三個目錄:crt,api,ddk。最終在附加包含目錄的內容為:C:\WinDDK\7600.16385.1\inc\api;C:\WinDDK\7600.16385.1\inc\ddk;C:\WinDDK\7600.16385.1\inc\crt調試信息格式:C7兼容 /Z7
2.預處理器*WIN32;DBG;_X86_;WINVER=0x0501
3.代碼生成*啟用最小重新生成:否*基本運行時檢查:默認值運行庫:多線程調試(/MTd)*緩衝區安全檢查:否(/GS-)
4.高級調用約定:__stdcall (/Gz)
二、鏈接器
1.常規輸出文件:$(OutDir)\$(ProjectName).sys*啟用增量鏈接:否(/INCREMENTAL:NO)附加庫目錄:編輯添加1個路徑,對應WDK安裝目錄\LIB\WXP\I386,最終的附加庫目錄的內容為:C:\WinDDK\7600.16385.1\lib\wxp\i386。注意,如果是WIN7系統,子目錄把 WXP 改成WIN7
2.輸入*附加依賴項:ntoskrnl.lib*忽略所有默認庫:是(/NODEFAULTLIB)
3.清單文件清單文件:否
4.系統子系統:本機(/SUBSYSTEM:NATIVE)*驅動程序:驅動程序(/DRIVER)。注意,如果是WDM類型驅動,改成 WDM (/DRIVER:WDM)。
5.高級入口點:DriverEntry隨機地址:默認值數據執行保護(DEP):默認值以上帶 * 的意識為,內容可以根據項目的具體分化,可以有所變動。當然啦,變動,肯定是基於你對該選項的理解基礎上進行變更的。譬如附加依賴項一般需要ntoskrnl.lib ,如果使用了第三方庫里的函數,那需要再添加其他的 lib 庫。譬如想啟用緩衝區安全檢查,那除了開關設置以外,必須在附加依賴項開關加上 bufferoverflowU.lib 這個庫,因為安全檢查函數由 bufferoverflowU.lib 導出。