DCH-Compliant驅動程式套件範例

本文說明 DCHU 驅動程式範例 如何套用 DCH 設計原則。 您可以使用它作為模型,將 DCH 設計原則套用至您自己的驅動程式套件。

如果您想要範例存放庫的本機複本,請從 Windows-driver-samples複製。

範例的某些部分可能會使用指示詞和 API,這些指示詞和 API 僅適用于特定版本的 Windows 10 和更新版本。 請參閱 裝置和驅動程式安裝 ,以查看支援指定指示詞的作業系統版本。

必要條件

閱讀本節之前,您應該先熟悉 DCH 設計原則

概觀

此範例提供兩個硬體合作夥伴 Contoso (系統建置者、OEM) 和 Fabrikam (裝置製造商,或 IHV) 共同作業,以建立符合 CONtoso 即將推出的裝置 DCH 規範的驅動程式。 有問題的裝置是 OSR USB FX2 學習套件。 在過去,Fabrikam 會撰寫一個舊版驅動程式套件,該套件已自訂為特定的 Contoso 產品系列,然後將它交給 OEM 來處理服務。 這會導致大量的維護負荷,因此 Fabrikam 決定重構程式碼,並改為建立符合 DCH 規範的驅動程式套件。

使用宣告式區段/指示詞,並適當地隔離 INF

首先,Fabrikam 會檢閱 DCH 相容驅動程式套件中無效 的 INF 區段和指示詞清單 。 在此練習中,Fabrikam 注意到他們在驅動程式套件中使用其中許多區段和指示詞。

其驅動程式 INF 會註冊可套用平臺相依設定和檔案的共同安裝程式。 這表示驅動程式套件大於其大小,而且當 Bug 只影響運送驅動程式的 OEM 系統子集時,很難為驅動程式提供服務。 此外,大部分的 OEM 特定修改都與品牌有關,因此 Fabrikam 需要在每次新增 OEM 時或次要問題影響 OEM 系統的子集時更新驅動程式套件。

Fabrikam 會移除非宣告式區段和指示詞,並使用 InfVerif 工具來確認新的驅動程式套件 INF 檔案遵循宣告式 INF 需求。

使用擴充功能 INF 將驅動程式套件元件化

接下來,Fabrikam 會將 OEM 合作夥伴專屬的自訂 (,例如 Contoso) 從基底驅動程式套件分割成 擴充功能 INF

下列程式碼片段會從 [ osrfx2_DCHU_extension.inx ]更新,指定 Extension 類別,並將 Contoso 識別為提供者,因為它們會擁有擴充驅動程式套件:

[Version]
...
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = Contoso
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
...

在 [ osrfx2_DCHU_base.inx ]中,Fabrikam 會指定下列專案:

[OsrFx2_AddReg]
HKR, OSR, "OperatingMode",, "Default" ; FLG_ADDREG_TYPE_SZ
HKR, OSR, "OperatingParams",, "None" ; FLG_ADDREG_TYPE_SZ

在 [ osrfx2_DCHU_extension.inx ]中,Contoso 會覆寫基底所設定的 OperatingParams 登錄值,並新增 OperatingExceptions

[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"

擴充功能一律會在基底 INF 之後處理,但不會有明確的順序。 如果基底 INF 更新為較新版本,則在安裝新的基底 INF 之後,仍會重新套用擴充功能。

從 INF 檔案安裝服務

Fabrikam 會使用 Win32 服務來控制 OSR 面板上的 LED。 他們會將此元件視為裝置核心功能的一部分,因此會將其納入其基底 INF ([ osrfx2_DCHU_base.inx ]) 。 您可以在 INF 檔案中指定 AddService 指示詞,以宣告方式新增和啟動此使用者模式服務 (usersvc) :

[OsrFx2_Install.NT]
CopyFiles = OsrFx2_CopyFiles

[OsrFx2_Install.NT.Services]
AddService = WUDFRd, 0x000001fa, WUDFRD_ServiceInstall    ; Flag 0x2 sets this as the service for the device
AddService = osrfx2_DCHU_usersvc,, UserSvc_ServiceInstall

[UserSvc_ServiceInstall]
DisplayName = %UserSvcDisplayName%
ServiceType = 0x10                                ; SERVICE_WIN32_OWN_PROCESS
StartType = 0x3                                   ; SERVICE_DEMAND_START
ErrorControl = 0x1                                ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\osrfx2_DCHU_usersvc.exe
AddTrigger = UserSvc_AddTrigger                   ; AddTrigger syntax is only available in Windows 10 Version 2004 and above

[UserSvc_AddTrigger]
TriggerType = 1                                   ; SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
Action = 1                                        ; SERVICE_TRIGGER_ACTION_SERVICE_START
SubType = %GUID_DEVINTERFACE_OSRFX2%              ; Interface GUID
DataItem = 2, "USB\VID_0547&PID_1002"             ; SERVICE_TRIGGER_DATA_TYPE_STRING

[OsrFx2_CopyFiles]
osrfx2_DCHU_base.dll
osrfx2_DCHU_filter.dll
osrfx2_DCHU_usersvc.exe

根據案例,這類服務也可以安裝在元件或擴充功能 INF 中。

使用元件從驅動程式套件安裝舊版軟體

Fabrikam 具有先前使用共同安裝程式安裝的可執行檔 osrfx2_DCHU_componentsoftware.exe 。 此舊版軟體會顯示面板所設定的登錄機碼,OEM 需要此機碼。 這是僅針對桌上出版本在 Windows 上執行的 GUI 型可執行檔。 為了安裝它,Fabrikam 會建立個別的元件驅動程式套件,並在其擴充功能 INF 中新增它。

來自 [ osrfx2_DCHU_extension.inx ] 的下列程式碼片段會使用 AddComponent 指示詞來建立虛擬子裝置:

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall


[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

然後,在元件 INF [ osrfx2_DCHU_component.inx ]中,Fabrikam 會指定 AddSoftware 指示詞來安裝選擇性可執行檔:

[OsrFx2Component_Install.NT.Software]
AddSoftware = osrfx2_DCHU_componentsoftware,, OsrFx2Component_SoftwareInstall

[OsrFx2Component_SoftwareInstall]
SoftwareType = 1
SoftwareBinary = osrfx2_DCHU_componentsoftware.exe
SoftwareArguments = <<DeviceInstanceId>>
SoftwareVersion = 1.0.0.0

[OsrFx2Component_CopyFiles]
osrfx2_DCHU_componentsoftware.exe

Win32 應用程式的原始程式碼包含在範例中。

元件驅動程式套件只會在桌面 SKU 上散發,因為Windows 硬體開發人員中心儀表板中設定的目標。 如需詳細資訊,請參閱將驅動程式發佈至 Windows Update

允許與硬體支援應用程式通訊

Fabrikam 想要提供 GUI 型隨附應用程式作為 Windows 驅動程式套件的一部分。 因為 Win32 型隨附應用程式不能是 Windows 驅動程式套件的一部分,所以他們會將其 Win32 應用程式移植到通用 Windows 平臺 (UWP) ,並將應用程式與裝置配對

下列程式碼片段 osrfx2_DCHU_base/device.c 顯示基底驅動程式套件如何將自訂功能新增至裝置介面實例:

    WDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData = { 0 };
    static const wchar_t customCapabilities[] = L"CompanyName.yourCustomCapabilityName_YourStorePubId\0";

    WDF_DEVICE_INTERFACE_PROPERTY_DATA_INIT(&PropertyData,
                                            &GUID_DEVINTERFACE_OSRUSBFX2,
                                            &DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities);

    Status = WdfDeviceAssignInterfaceProperty(Device,
                                              &PropertyData,
                                              DEVPROP_TYPE_STRING_LIST,
                                              sizeof(customCapabilities),
                                              (PVOID)customCapabilities);

範例) 中未包含的新應用程式 (是安全的,而且可以在 Microsoft Store 中輕鬆地更新。 在 UWP 應用程式就緒後,Contoso 會使用 DISM - 部署映像服務與管理 ,在 Windows Desktop 版本映射上預先載入應用程式。

緊密結合多個 INF 檔案

在理想情況下,基底、延伸模組和元件之間應該有強式版本控制合約。 在獨立服務這三個套件 (「鬆散結合」案例) 有一些服務優點,但有一些案例需要組合在單一驅動程式套件中, (「緊密結合」) ,因為版本設定合約不佳。 此範例包含這兩種案例的範例:

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_component.inf

這個指示詞也可以用來協調多重功能裝置中 INF 檔案的安裝。 如需詳細資訊,請參閱 複製 INF 檔案

注意

雖然基底驅動程式可以裝載擴充功能 (,並以出貨標籤中的基底驅動程式為目標) ,但與另一個驅動程式配套的擴充功能無法發佈至擴充功能硬體識別碼。

從驅動程式存放區執行

為了更輕鬆地更新驅動程式,Fabrikam 會盡可能使用dirid 13,將驅動程式存放區指定為複製驅動程式檔案的目的地。 使用目的地目錄值 13 可能會導致驅動程式更新程式期間的穩定性改善。 以下是 [ osrfx2_DCHU_base.inx ]:

[DestinationDirs]
OsrFx2_CopyFiles = 13 ; copy to Driver Store

如需如何從驅動程式存放區動態尋找和載入檔案的詳細資訊,請參閱 從驅動程式存放區執行 頁面。

摘要

下圖顯示 Fabrikam 和 Contoso 為其 DCH 相容的驅動程式所建立的驅動程式套件。 在鬆散結合的範例中,他們會在Windows 硬體開發人員中心儀表板上建立三個不同的提交:一個用於基底、一個用於延伸模組,另一個用於元件。 在緊密結合的範例中,他們會提出兩個提交:基底和延伸模組/元件。

擴充功能、基底和元件驅動程式套件。

元件 INF 會在元件硬體識別碼上相符,而基底和延伸模組將會比對面板的硬體識別碼。

另請參閱

使用 Windows 驅動程式消費者入門

使用擴充功能 INF 檔案

osrfx2_DCHU_base.inx

「鬆散結合」 osrfx2_DCHU_component.inx

「鬆散結合」 osrfx2_DCHU_extension.inx

「緊密結合」osrfx2_DCHU_component.inx

「緊密結合」osrfx2_DCHU_extension.inx