共用方式為


教學課程:根據範本撰寫通用 Windows 驅動程式 (KMDF)

本文說明如何使用核心模式驅動程式架構(KMDF)撰寫通用 Windows 驅動程式。 你可以先用 Microsoft 的 Visual Studio 範本,然後在另一台電腦上部署並安裝驅動程式。

先決條件

  • 請遵循步驟來安裝 Windows 驅動程式套件 (WDK)。 當您安裝 WDK 時,會包含適用於 Windows 偵錯工具。

  • 安裝 Visual Studio 2022。 當您安裝 Visual Studio 2022 時,請選取具有 C++ 工作負載的 Desktop 開發,然後在 [個別元件] 底下 新增:

    • MSVC v143 - VS 2022 C++ ARM64/ARM64EC Spectre 漏洞緩解的函式庫(最新)
    • MSVC v143 - VS 2022 C++ x64/x86 Spectre 緩解函式庫(最新)
    • 使用最新的 v143 組建工具和 Spectre 風險降低功能的 C++ ATL(ARM64/ARM64EC)
    • 最新 v143 編譯工具 C++ ATL,配有 Spectre 風險降低功能(x86 & x64)
    • C++ MFC 使用適用於 Spectre 脆弱性緩解措施的最新 v143 編譯工具 (ARM64/ARM64EC)
    • 最新 v143 版建置工具的 C++ MFC,具有 Spectre 緩解措施(x86 & x64)
    • Windows 驅動程式套件

建立和建置驅動程式

  1. 開啟 Visual Studio Microsoft。 在 [檔案] 功能表上,選擇 [新增 > 專案]。

  2. 在 [[建立新專案] 對話框中,選取左側下拉式清單中 C++,選擇中間下拉式清單中的 [Windows],然後在右側下拉式清單中選擇 [驅動程式]。

  3. 從項目類型清單中選取 核心模式驅動程式 (KMDF)。 選取 [下一步]。

    新項目對話框的螢幕快照,其中顯示已選取核心模式驅動程式。

    提示

    如果您在 Visual Studio 中找不到驅動程式專案範本,WDK Visual Studio 擴充功能並未正確安裝。 若要解決此問題,請啟動 Visual Studio Installer,選取 [修改],在 [個別元件] 索引卷標中新增 Windows 驅動程式套件,然後選取 [修改]。

  4. 在 [設定新專案] 對話框中,於 [項目名稱] 字段中輸入 “KmdfDriver”。

    注意

    當您建立新的 KMDF 或 UMDF 驅動程式時,您必須選取具有 32 個字元或更少字元的驅動程式名稱。 此長度限制定義於 wdfglobals.h 中。  

  5. 在 [位置] 字段中,輸入您要在其中建立新項目的目錄。

  6. 檢查 將方案與專案放在相同的目錄中,然後選取 [建立 ]。

    項目組態對話框的螢幕快照。

    Visual Studio 會建立一個專案和方案。 您可以在 [方案總管] 視窗中看到它們。 (如果解決方案總管視窗看不到,請從檢視選單中選擇解決方案總管。)該解決方案有一個名為 KmdfDriver 的驅動程式專案。 若要檢視驅動程式原始程式碼,請開啟 原始程式檔底下的任何檔案,。 Driver.c 和 Device.c 是不錯的起點。

    方案總管的螢幕快照,顯示驅動程式專案中的檔案。

  7. 在 [方案總管] 視窗中,選取並按住 [KmdfDriver],然後選擇 [[屬性]。 流覽至 [設定屬性] > [驅動程序設定] > [一般],請注意,目標平臺 預設為 Universal。

  8. 若要建置驅動程式,請從 [建置] 功能表選擇 [建置方案]。 Microsoft Visual Studio 會在 [輸出] 視窗中顯示建置進度。 (如果輸出視窗看不到,請從檢視選單選擇輸出。)

    確認組建輸出包含:

    >    Driver is 'Universal'.
    

    當你確認解決方案成功建置後,就可以關閉 Visual Studio。

  9. 若要查看建置的驅動程式,請在 [檔案總管] 中,移至您的 KmdfDriver 資料夾,然後移至 x64\Debug\KmdfDriver。 目錄包含下列檔案:

    • KmdfDriver.sys--核心模式驅動程式檔案
    • KmdfDriver.inf——一個 Windows 安裝驅動程式時會用到的資訊檔案

部署驅動程式

一般而言,當您測試和偵錯驅動程式時,調試程式和驅動程式會在不同的計算機上執行。 執行除錯程式的電腦稱為 主電腦,而執行驅動程式的電腦稱為 目標電腦。 目標電腦也稱為 測試電腦。 如需偵錯驅動程式的詳細資訊,請參閱 Windows 偵錯工具

到目前為止,你是用 Visual Studio 在主機電腦上建立驅動程式。 現在您需要設定目標計算機。

  1. 請遵循 布建電腦以進行驅動程式部署和測試中的指示,

    提示

    當您依照步驟自動使用網路纜線佈建目標計算機時,請記下埠和密鑰。 這些資料通常會在除錯步驟後面使用。 在這個例子中,我們使用 50000 作為埠, 1.2.3.4 作為金鑰。

    在實際的驅動程序偵錯案例中,我們建議使用 KDNET 產生的密鑰。 如需更多有關如何使用 KDNET 產生隨機金鑰的資訊,請參閱 Debug Drivers - Step by Step Lab (Sysvad Kernel Mode) 文章。

  2. 在主計算機上,在 Visual Studio 中開啟您的方案。 您可以在 KmdfDriver 資料夾中雙擊方案檔案 KmdfDriver.sln。

  3. 在 [方案總管] 視窗中,選取並按住 [KmdfDriver] 專案,然後選擇 [屬性]。

  4. 在 [KmdfDriver 套件屬性頁] 視窗中,在左窗格中,移至 [設定屬性] [> 驅動程式安裝] [> 部署]

  5. 在部署 之前,請先檢查移除先前的驅動程式版本。

  6. 針對 遠端電腦名稱,選取您設定用於測試和偵錯的計算機名稱。 在此練習中,我們使用名為 MyTestComputer 的計算機。

  7. 選取 [硬體標識符驅動程式更新],然後輸入驅動程式的硬體標識符。 在此練習中,硬體標識碼為 Root\KmdfDriver。 選取 [確定]

    kmdfdriver 套件屬性頁視窗的螢幕快照,其中顯示已選取的部署驅動程式安裝

    注意

    在這個練習中,硬體識別碼並不能識別出實體硬體。 在裝置樹狀結構中,將虛構裝置識別為根節點的子節點。 對於實體硬體,不要選擇 硬體識別驅動程式更新;請選擇 安裝並驗證。 您會在驅動程式的資訊 (INF) 檔案中看到硬體識別碼。 在 [方案總管] 視窗中,移至 [KmdfDriver > 驅動程式檔案],然後按兩下 [KmdfDriver.inf]。 硬體標識碼位於 [Standard.NT$ARCH$]。

    [Standard.NT$ARCH$]
    %KmdfDriver.DeviceDesc%=KmdfDriver_Device, Root\KmdfDriver
    
  8. 在 [建置] 功能表上,選擇 [部署解決方案]。 Visual Studio 會自動將安裝並執行驅動程式所需的檔案複製到目標計算機。

    當您部署驅動程式時,驅動程式檔案會複製到測試計算機上的 %Systemdrive%\drivertest\drivers 資料夾。 如果在部署期間發生問題,您可以檢查檔案是否已複製到測試計算機。 確認 .inf、.cat、test cert 和 .sys 檔案,以及任何其他必要檔案都存在於 %systemdrive%\drivertest\drivers 資料夾中。

    如需部署驅動程式的詳細資訊,請參閱 將驅動程式部署至測試電腦

安裝驅動程式

當你的 KMDF 驅動程式部署到目標電腦後,接著你安裝驅動程式。 當您先前使用 自動 選項布建目標計算機時,Visual Studio 會設定目標計算機,以在布建程式中執行測試簽署的驅動程式。 現在,您只需要使用 DevCon 工具安裝驅動程式。

  1. 在主計算機上,流覽至 WDK 安裝中的 [工具] 資料夾,並找出 DevCon 工具。 例如,請檢視下列資料夾:

    C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe

    將 DevCon 工具複製到遠端電腦。

  2. 在目標電腦上,流覽至包含驅動程式檔案的資料夾,然後執行DevCon工具,以安裝驅動程式。

    1. 以下是你用來安裝驅動程式的 devcon 工具的一般語法:

      devcon 安裝 <INF 檔案><硬體識別碼>

      安裝此驅動程式所需的 INF 檔案為 KmdfDriver.inf。 INF 檔案包含用來安裝驅動程式二進位檔的硬體識別碼,KmdfDriver.sys。 請注意,硬體識別碼 Root\KmdfDriver位於 INF 文件中。

    2. 以系統管理員身分開啟命令提示字元視窗。 瀏覽至驅動程式套件資料夾,然後輸入下列命令:

      devcon 安裝 kmdfdriver.inf root\kmdfdriver

      如果您收到無法辨識 devcon 的錯誤訊息,請嘗試將路徑新增至 devcon 工具。 例如,如果您將它複製到目標計算機上名為 C:\Tools的資料夾,請嘗試使用下列命令:

      c:\tools\devcon 安裝 kmdfdriver.inf root\kmdfdriver

      此時會出現一個對話框,指出測試驅動程式是未簽署的驅動程式。 選取 [仍然安裝此驅動程式] 以繼續進行。

      驅動程式安裝警告的螢幕快照。

偵錯驅動程式

現在你在目標電腦上安裝了 KMDF 驅動程式,從主機遠端連接除錯器。

  1. 在主電腦上,以系統管理員身分開啟命令提示字元視窗。 變更為 WinDbg.exe 目錄。 請使用作為 Windows 套件安裝一部分的 Windows 驅動程式套件(WDK)中的 x64 版本 WinDbg.exe。 以下是 WinDbg.exe的預設路徑:

    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

  2. 使用下列命令啟動 WinDbg 以連線到目標電腦上的核心偵錯會話。 埠和金鑰的值應該與您用來佈建目標電腦的值相同。 我們使用 50000 作為埠, 1.2.3.4 作為鍵,這些值是在部署階段使用。 k 旗標表示這是核心偵錯會話。

    WinDbg -k net:port=50000,key=1.2.3.4

  3. 在 [偵錯] 功能表上,選擇 [中斷]。 主電腦上的偵錯程式會介入到目標計算機。 在 [調試程式命令] 視窗中,您可以看到核心偵錯命令提示字元:kd>

  4. 此時,你可以透過在 kd-> 提示符輸入指令來嘗試除錯器。 例如,您可以嘗試下列命令:

  5. 若要讓目標計算機再次執行,請 從 [偵錯] 功能表選擇 [Go],或按 “g”,然後按 “enter”。

  6. 若要停止偵錯會話,請 從 [偵錯] 功能表選擇 [[卸離偵錯]

    重要

    請確保你先按「go」指令讓目標電腦重新執行,然後再退出除錯器,否則目標電腦會因為還在和除錯器溝通而對你的滑鼠鍵盤操作毫無反應。

如需驅動程式偵錯過程的詳細逐步解說,請參閱 偵錯通用驅動程式 - 一步一步實驗室(Echo Kernel-Mode)

如需遠端偵錯的詳細資訊,請參閱 使用 WinDbg遠端偵錯。

使用驅動程式模組架構 (DMF)

驅動程式模組架構 (DMF) 是 WDF 的延伸模組,可為 WDF 驅動程式開發人員啟用額外的功能。 它可協助開發人員更快速地撰寫任何類型的 WDF 驅動程式。

DMF 即架構允許建立稱為 DMF 模組的 WDF 物件。 這些 DMF 模組的程式代碼可以在不同的驅動程式之間共用。 此外,DMF 還附帶一套我們為驅動程式開發的 DMF 模組函式庫,認為能為其他驅動開發者帶來價值。

DMF 不會取代 WDF。 DMF 是搭配 WDF 使用的第二個架構。 使用 DMF 的開發者仍使用 WDF 及其所有原語來撰寫裝置驅動程式。

如需詳細資訊,請參閱 驅動程式模組架構 (DMF)