Windows驅動開發入門指引

来源:https://www.cnblogs.com/liaoguifa/archive/2018/05/17/9049859.html
-Advertisement-
Play Games

1. 前言 因工作上項目的需要,筆者需要做驅動相關的開發,之前並沒有接觸過相關的知識,折騰一段時間下來,功能如需實現了,也積累了一些經驗和看法,所以在此做番總結。 對於驅動開發的開髮指引,微軟官方文檔網站已經提供了很詳細的教程文檔,並且在Github上提供了一系列典型的常式源碼用於開發人員參考。開發 ...


   1.  前言

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

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

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

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

 

   2.  驅動類型

 驅動分為如下幾種類型:

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

驅動程式不是一定需要與硬體通訊,如果需要訪問操作系統核心數據,往往應用程式沒有足夠的許可權,這種情況則需要在內核模式下進行訪問。就上面5種驅動類型,筆者參考著微軟的驅動例子開發過 滑鼠鍵盤設備過濾驅動網路過濾軟體驅動程式,所以對驅動開發的理解仍在淺水區,如在閱讀過程中發現有誤的地方,還請不吝指出。

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

有關軟體驅動程式,你的兩個選項為 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) 代碼簽名,還需要提交到硬體開發中心儀錶盤,具體操作指南可以參考此處,你可以在該文檔上找到驅動簽名所需的任何內容。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我首先安裝的是ubuntu kylin(中文名優麒麟) 1.電腦右鍵選擇管理磁碟,壓縮捲設置空閑空間(第7步分區用) 2.重啟時fn+f1進入bios設置界面。 3.關閉安全模式和快速啟動,將boot的啟動設置為uefi啟動方式,U盤設為啟動第一優先順序。 4.用ultraiso製作啟動U盤 5.下 ...
  • 目錄 一、什麼是Linux 二、常用基礎指令 2.1、vi編輯 2.2、Linux文件類型 2.3、常用指令:增、刪、改、查、其他 三、Linux的目錄和許可權 3.1、目錄 3.2、許可權 3.3、修改許可權 一、什麼是Linux Linux是操作系統:Windos、Mac、Linux、Unix\ Li ...
  • LAMP的環境 需要先準備好LAMP的環境 由於之前我已經使用yum完整安裝過一套Zabbix,說實話,yum安裝的路徑亂七八糟的,真不如二進位包安裝自己配置清晰,先全部卸載相關組件,確保是一個乾凈的環境 重新安裝一遍,記錄一下,否則時間長了又忘了具體的過程了。 二進位包下載 wget http:/ ...
  • Ubuntu之開發環境的搭建 初學Linux,今天反覆卸載與重裝微軟商店的Ubuntu好幾次,終於解鎖了在Ubuntu上搭建開發環境的正確姿勢, 搭建了一個非常簡單的開發環境;簡單到什麼地步呢?只是簡單地配置了一下編輯器,安裝了幾款編譯器。 而就是這樣一個簡單的開發環境,對於現在的我來說足夠用了。 ...
  • 一)安裝Centos 7系統 介紹:VMware Workstation是一個虛擬PC的軟體,利用VMware工作站,可以在現有的操作系統上虛擬出一個或多個環境。相當於模擬出多台新的PC,可以讓你同時運行多個windows系統,Linux系統,DOS系統。 安裝:百度上有破解版的,自行下載,要的私聊 ...
  • 去年購入一臺華碩FL8000U,性能很是不錯,但是硬體只能相容win10,不支持win7(linux倒是可以,但是始終用不順手),win10裡面雜七雜八的確實很多,本人重度強迫症+潔癖+極簡主義,所以經過百度並且摸索掌握了一切凈化win10的技巧。主要分為關閉update,關閉defencer,關閉 ...
  • 這裡介紹的是linux比較高級的東西,如:用戶管理、用戶組管理、文件管理等。 ...
  • 問題: 由於工作,需要,不斷得進行掛在硬碟重裝系統,NFS 系統給了我一個很好的解決方案。於是決定寫一篇博客,防止以後再次使用的時候,能夠很快得重新建立NFS 文件系統。 調研: NFS(Network File System)即網路文件系統,是FreeBSD支持的文件系統中的一種,它允許網路中的計 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...