Windows驅動開發入門指引

   1.  前言git

因工做上項目的須要,筆者須要作驅動相關的開發,以前並無接觸過相關的知識,折騰一段時間下來,功能如需實現了,也積累了一些經驗和見解,因此在此作番總結。github

對於驅動開發的開發指引,微軟官方文檔網站已經提供了很詳細的教程文檔,而且在Github上提供了一系列典型的例程源碼用於開發人員參考。開發人員在具有必定的驅動概念知識後,經過參考官方例程能夠很容易實現擁有特定功能的驅動應用程序。windows

Windows驅動程序入門: https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/api

Github: https://github.com/Microsoft/Windows-driver-samples網絡

 

   2.  驅動類型數據結構

 驅動分爲以下幾種類型:app

  • 設備函數驅動程序
  • 設備篩選器驅動程序
  • 軟件驅動程序
  • 文件系統篩選器驅動程序
  • 文件系統驅動程序

驅動程序不是必定須要與硬件通信,若是須要訪問操做系統核心數據,每每應用程序沒有足夠的權限,這種狀況則須要在內核模式下進行訪問。就上面5種驅動類型,筆者參考着微軟的驅動例子開發過 鼠標鍵盤設備過濾驅動網絡過濾軟件驅動程序,因此對驅動開發的理解仍在淺水區,如在閱讀過程當中發現有誤的地方,還請不吝指出。框架

採用的驅動類型關乎到代碼的實現(需不須要考慮PNP和電源管理)和驅動的安裝( NT式驅動程序以 service 的形式運行,其餘驅動須要採用通用的INF文件安裝),微軟的官方文檔這樣提到:ide

有關軟件驅動程序,你的兩個選項爲 KMDF 和內核模式 Windows NT 驅動程序模型。 使用 KMDF 和內核模式 Windows NT 模型,你能夠編寫驅動程序,而無需考慮即插即用 (PnP) 和電源管理。 你能夠改成專心於驅動程序的首要任務上。 使用 KMDF,你沒必要考慮 PnP 和電源,由於框架會爲你處理 PnP 和電源。 使用內核模式 Windows NT 模型,你沒必要考慮 PnP 和電源,由於內核模式服務在與 PnP 和電源管理徹底無關的環境中運行。函數

   3.  開發環境

 

Visual Studio + WDK(Windows Driver Kit)

其中WDK須要本身手動下載安裝

筆者是在Windows平臺上開發,使用的開發環境爲 Visual Studio 2013 + WDK 8.1

 

   4.  實現方式

 

WDM vs WDF

對於剛接觸驅動開發的新手來講,筆者不建議採用WDM(Windows 驅動程序模型)進行開發。目前在網上能找到的關於驅動開發的中文書籍基本上都是圍繞WDM模式進行講述的,而關於WDF(Windows 驅動框架)開發的書籍寥寥無幾,《竹林溪徑——深刻淺出Window驅動開發》和《Developing Drivers with the Windows Driver Foundation》算是兩本講述基於WDF開發驅動的書籍,二者都能在網上找到電子書資源。

 

基於WDF的驅動開發

WDF的開發須要遵循必定的規則,開發實現時須要考慮較多的細節,因爲篇幅有限,筆者憑着本身的經驗暫且稍作列舉,後續將寫一篇針對WDF驅動開發的文章。

  • PNP和電源管理(WDF已經幫忙封裝了大部分的接口);
  • 各類對象:驅動對象,設備對象,WDF對象,文件對象,隊列對象;
  • 驅動上下文:有時稱爲設備擴展,用於存儲特定設備對象的相關信息的數據結構;
  • 對象的釋放:須要考慮不一樣性質對象釋放的時機;
  • 中斷請求級別:處理不當易致使藍屏;
  • 分頁與非分頁內存;
  • 同步鎖:回調同步鎖、框架等待鎖、自旋鎖、中斷鎖等;
  • 日誌跟蹤記錄: 調試的必備,能夠採用 WPP(Windows軟件追蹤預處理器)或簡單的 DebugPrint 輸出
  • 與應用程序的通信:控制代碼、IRQ,請求隊列

 

   5.  驅動安裝

 

測試環境下安裝驅動前

開發的驅動程序沒有進行簽名或者採用測試簽名,則須要在設備上開啓測試模式,具體操做爲:打開控制檯,輸入:

bcdedit /set testsigning on

回車,會提示:操做成功完成。 而後重啓設備,開機後會在電腦桌面右下方顯示有「測試模式」字樣內容的水印。

若是要關閉測試模式,則需在控制檯輸入:

bcdedit /set testsigning off

回車,一樣會提示:操做成功完成。 重啓設備後則會發現桌面右下角的水印消失。

 

以服務的形式運行

NT式的驅動程序容許以 service 的形式運行, 服務安裝的例程能夠參考 WDF Sample 中的 Eventdrv 工程,或者參考我寫的關於進程網絡監控的驅動例程開源代碼

 

使用INF文件安裝

設備相關的驅動安裝能夠選擇INF進行安裝,INF安裝文件的編寫建議從 WDF Sample 中找到合適的INF文件進行修改,若是你想了解INF的語法,能夠參考這裏

  • 經過設備管理器手工安裝

打開控制檯,輸入 devmgmt 回車,這是打開設備管理器的其中一種方式,其餘方式好比右鍵系統菜單欄圖標都可以打開任務管理器,只是使用命令行的方式比較少見,這裏特地記錄一下。找到感興趣的 設備節點,右鍵 屬性(或更新驅動程序軟件),切換到 驅動程序,能夠進行感興趣的操做。這裏所看到所提供的選項,後續等你熟悉了驅動安裝的接口後,你會發現都有對應的接口對應每一個功能選項。

  • 經過程序實現自動安裝

能夠參考 WDF Sample 中的Driver Install Frameworks API (DIFxAPI) SampleDevice Console (DevCon) Tool 兩個工程,分別提供了不一樣調用接口的驅動安裝方式,Device Console (DevCon) Tool 生成的devcon.exe 是一個功能強大的工具,不只可用於驅動(包)的安裝和卸載,還能夠獲取設備的硬件ID,描述符以及設備所安裝的驅動列表等信息,開發人員能夠從中一窺究竟。

在驅動的安裝過程當中,系統會自動記錄安裝的日誌,在INF目錄(路徑通常在 C:\Windows\inf下)下能夠找到兩個日誌文件 setupapi.app.logSetupapi.dev.log ,查看這兩個日誌文件有利於理解驅動安裝的執行過程,同時也有利於排查驅動安裝過程當中出現的異常。

驅動的安裝涉及到驅動文件的校驗(保證驅動文件的完整性和合法性),驅動的優先級計算(選擇最優的驅動去匹配當前識別到的新的設備),驅動的放置目錄(Driver Store)等內容。開發人員熟悉驅動安裝邏輯有利於驅動的開發,感興趣能夠經過此處進行了解。

 

   6.  驅動簽名

 

測試環境

經過VS集成開發環境建立 Driver 解決方案後會生成兩個項目,右鍵屬性打開 XXX Package,左側選中 Driver Signing ,在右側欄 Sign Mode 選擇 Test Sign,在 Test Certificate選擇 <Create test certificate...>,則在編譯時會自動生成測試簽名證書。

 

生產環境

從Win10開始,驅動文件包不只須要進行擴展驗證 (EV) 代碼簽名,還須要提交到硬件開發中心儀表盤,具體操做指南能夠參考此處,你能夠在該文檔上找到驅動簽名所需的任何內容。

相關文章
相關標籤/搜索