共用方式為


DCH 相容的驅動程式套件範例

本文說明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 想要在 Windows 驅動程式套件中提供 GUI 型隨附應用程式。 由於 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市集中輕鬆更新。 在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