使用擴充功能 INF 檔案

在Windows 10之前,Windows 已選取單一驅動程式套件,以針對指定的裝置進行安裝。 這會導致包含所有案例和組態程式碼的大型複雜驅動程式套件,而每個次要更新都需要更新整個驅動程式套件。 從Windows 10開始,您可以將 INF 功能分割成多個元件,每個元件都可以獨立服務。 安裝在裝置上的核心驅動程式套件現在稱為基底驅動程式套件,而且由系統處理的方式與在Windows 10之前處理驅動程式套件的方式相同。 若要擴充基底驅動程式套件的功能,請在不同的驅動程式套件中提供擴充 INF。 擴充功能 INF:

  • 可由不同的公司提供,並獨立于基底 INF 進行更新。

  • 使用與基底 INF 相同的 INF 語法,但可以擴充基底 INF 以進行自訂或特製化。

  • 增強裝置的值,但 不需要 基底驅動程式套件才能運作。 如果沒有擴充功能 INF,系統必須能夠只使用基底驅動程式套件來開機並聯機到網路。 系統內建的輸入裝置,例如鍵盤,必須能夠以至少基本功能運作,而不需要任何擴充 INF。

  • 必須是 通用 INF 檔案

每個裝置都必須安裝一個基底驅動程式套件,而且可以選擇性地有一或多個與其相關聯的擴充功能 INF。 如果沒有基底驅動程式套件,擴充功能 INF 將無法安裝在裝置上。

您可能會使用擴充功能 INF 的一般案例包括:

  • 修改基底驅動程式套件中提供的設定,例如自訂裝置易記名稱或修改硬體組態設定。

  • 藉由指定 INF AddComponent 指示 詞並提供 元件 INF 檔案來建立一或多個軟體元件。

  • 提供系統模型或表單規格的特定設定,以增強裝置的體驗或功能,例如硬體校正資料。

  • 將篩選驅動程式新增至裝置堆疊。

您可以在下列範例中找到其中一些案例的範例程式碼。 另請參閱 DCH 相容驅動程式套件範例,其中說明 DCHU 通用驅動程式範例 如何使用擴充功能 INF。

擴充功能 INF 和基底驅動程式套件如何搭配運作

在裝置安裝期間,擴充功能 INF 中的設定會在基底驅動程式套件中的設定之後套用。 因此,如果擴充功能 INF 和基底驅動程式套件指定相同的設定,則會套用擴充功能 INF 中的版本。 同樣地,如果基底驅動程式套件變更,擴充功能 INF 會保留並套用至新的基底驅動程式套件。 如果相同裝置上安裝多個擴充功能 INF,則不會預先決定套用擴充功能 INF 的順序,因此一個擴充功能 INF 無法確定覆寫不同擴充功能 INF 所提供的值。 以相同裝置為目標的不同擴充功能 INF 不應嘗試改變相同的設定。

在基底驅動程式套件中包含批註,描述哪些專案可由延伸模組 INF 覆寫,以及適用的參數值範圍和條件約束。

指定 ExtensionId

當您撰寫擴充功能 INF 時,會產生稱為 ExtensionId的特殊 GUID,這是 INF [ 版本] 區段中的專案。

系統會將裝置的硬體識別碼和相容識別碼比對套用至該系統之 Models 區段中延伸模組 INF 中指定的識別碼,來識別特定裝置的可能擴充功能 INF。

在指定相同 ExtensionId 值的所有可能擴充 INF 中,系統只會選取一個來安裝,並將其設定套用至基底驅動程式套件的其中一個。 在 INF 中指定的驅動程式日期和驅動程式版本會依該順序使用,在具有相同 ExtensionId的多個擴充 INF 之間選擇單一 INF。

為了說明,請考慮下列案例,其中包含有三個擴充功能 INF 的假設裝置:

顯示如何選取基底 INF 和延伸模組 INF 的圖表。

ExtensionId{A}{B} 會以大括弧顯示,而每個基底驅動程式套件的排名會顯示在橫幅功能區中。

首先,系統會選取具有最佳排名和最高版本的基底驅動程式套件。

接下來,系統會處理可用的擴充功能 INF。 兩個 具有 ExtensionId{B} ,一個具有 ExtensionId{A} 。 從前兩個,假設驅動程式日期相同。 下一個 tiebreaker 是驅動程式版本,因此系統會選取具有 v2.0 的擴充功能 INF。

也會選取具有唯一 ExtensionId 值的擴充 INF。 系統會套用裝置的基底驅動程式套件,然後套用該裝置的兩個擴充功能 INF。

擴充功能 INF 檔案一律會在基底驅動程式套件之後套用,但沒有決定套用擴充 INF 的順序。

建立擴充功能 INF

以下是您需要將 INF 定義為擴充 INF 的專案。

  1. Version區段中為ClassClassGuid指定這些值。 如需安裝類別的詳細資訊,請參閱 廠商可用的系統定義裝置安裝類別

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. [Version]區段中提供ExtensionId專案。 針對擴充功能 INF 的初始版本產生新的 GUID,或針對初始延伸模組 INF 的後續更新重複使用最後一個 GUID。

    ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
    

組織只能使用它所擁有的 ExtensionID 。 如需註冊擴充功能識別碼的詳細資訊,請參閱管理Windows 硬體開發人員中心儀表板中的硬體提交

  1. 如果您要更新擴充功能 INF,請保留 ExtensionId 相同,並遞增 DriverVer 指示詞所指定的版本和日期。 針對指定的 ExtensionId 值,PnP 會選取具有最高 DriverVer的 INF。

    注意

    如果您的擴充功能 INF 以 Windows 10 S 為目標,請參閱 S模式驅動程式需求中的Windows 10,以取得該版本 Windows 上驅動程式安裝的相關資訊。

  2. [INF 模型] 區段中,指定一或多個符合目標裝置的硬體和相容識別碼。 這些硬體和相容的識別碼不需要符合基底驅動程式套件的識別碼。 一般而言,擴充功能 INF 會列出比基底驅動程式套件更明確的硬體識別碼,目標是進一步強化特定驅動程式組態。 例如,基底驅動程式套件可能會使用兩部分 PCI 硬體識別碼,而擴充功能 INF 則指定四部分 PCI 硬體識別碼,如下所示:

    [DeviceExtensions.NTamd64]
    %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
    

    或者,擴充功能 INF 可能會列出與基底驅動程式套件相同的硬體識別碼,例如,如果裝置已縮小目標,或基底驅動程式套件已經列出最特定的硬體識別碼。

    在某些情況下,擴充功能 INF 可能會提供較不特定的裝置識別碼,例如相容的識別碼,以便跨更廣泛的裝置組自訂設定。

    如果四部分硬體識別碼無法使用或限制不足,則可以使用CHID 目標

  3. 請勿使用 SPSVCINST_ASSOCSERVICE 定義服務。 擴充功能 INF 無法提供裝置的函式驅動程式。 不過,擴充功能 INF 可以定義其他服務,例如裝置的篩選驅動程式。 如需指定服務的詳細資訊,請參閱 INF AddService 指示詞

在大部分情況下,您會將擴充功能 INF 驅動程式套件與基底驅動程式套件分開提交至硬體開發人員中心。 如需如何封裝擴充功能 INF 和範例程式碼連結的範例,請參閱 DCH 相容驅動程式套件範例

驅動程式驗證和提交程式與基底驅動程式套件的擴充功能 INF 相同。 如需詳細資訊,請參閱Windows HLK 消費者入門

卸載擴充功能驅動程式

若要從系統移除擴充驅動程式套件,並使用它從任何裝置卸載,請使用PnPUtil 的delete-driver 命令搭配 uninstall 旗標。 這可讓擴充功能驅動程式套件從裝置卸載,而不需要移除基底驅動程式套件。

尋找要卸載並使用 pnputil /delete-driver oem<#>.inf /uninstall 之驅動程式套件的 oem < # > .inf 名稱。

pnputil /enum-drivers 可用來協助識別適當的 oem < # > .inf 名稱。

範例 1:使用擴充功能 INF 設定裝置易記名稱

在一個常見的案例中,裝置製造商 (IHV) 提供基底驅動程式套件,然後系統建立者 (OEM) 提供擴充功能 INF,以補充,在某些情況下會覆寫基底驅動程式套件的組態和設定。 下列程式碼片段是完整的擴充功能 INF,示範如何設定裝置易記名稱。

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %CONTOSO%
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
DriverVer   = 05/28/2013,1.0.0.0
CatalogFile = delta.cat
PnpLockdown = 1

[Manufacturer]
%CONTOSO% = DeviceExtensions,NTamd64

[DeviceExtensions.NTamd64]
%Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX

[DeviceExtension_Install]
; No changes

[DeviceExtension_Install.HW]
AddReg = FriendlyName_AddReg

[FriendlyName_AddReg]
HKR,,FriendlyName,, "New Device Friendly Name"

[Strings]
CONTOSO              = "Contoso"
Device.ExtensionDesc = "Sample Device Extension"

範例 2:使用擴充功能 INF 安裝其他軟體

下列程式碼片段是 適用于通用驅動程式的驅動程式套件安裝工具組中隨附的完整擴充功能 INF。 此範例會使用 INF AddComponent 指示 詞來建立安裝服務和可執行檔的元件。 如需您可以在元件 INF 中執行之動作的詳細資訊,請參閱 使用元件 INF 檔案

若要在線上存取此檔案,請參閱 osrfx2_DCHU_extension.inx

;/*++
;
;Copyright (c) Microsoft Corporation.  All rights reserved.
;
;   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;   PURPOSE.
;
;Module Name:
;
;    osrfx2_DCHU_extension.INF
;
;Abstract:
;
;    Extension inf for the OSR FX2 Learning Kit
;
;--*/

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %ManufacturerName%
ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}
CatalogFile = osrfx2_DCHU_extension.cat
DriverVer   = 05/16/2017,15.14.36.721
PnpLockdown = 1

[Manufacturer]
%ManufacturerName% = OsrFx2Extension, NT$ARCH$

[OsrFx2Extension.NT$ARCH$]
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_045e&Pid_94aa&mi_00
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_0547&PID_1002

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_usersvc.inf

[OsrFx2Extension_Install.NT.HW]
AddReg = OsrFx2Extension_AddReg
AddReg = OsrFx2Extension_COMAddReg

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

; Add all registry keys to successfully register the
; In-Process ATL COM Server MSFT Sample.
[OsrFx2Extension_COMAddReg]
HKCR,AppID\ATLDllCOMServer.DLL,AppID,,"{9DD18FED-55F6-4741-AF25-798B90C4AED5}"
HKCR,AppID\{9DD18FED-55F6-4741-AF25-798B90C4AED5},,,"ATLDllCOMServer"
HKCR,ATLDllCOMServer.SimpleObject,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,ATLDllCOMServer.SimpleObject\CurVer,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,ATLDllCOMServer.SimpleObject.1,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject.1\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084},,,"SimpleObject Class"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,,%REG_EXPAND_SZ%,"%%SystemRoot%%\System32\ATLDllCOMServer.dll"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,ThreadingModel,,"Apartment"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\ProgID,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\Programmable,,%FLG_ADDREG_KEYONLY%
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\TypeLib,,,"{9B23EFED-A0C1-46B6-A903-218206447F3E}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\VersionIndependentProgID,,,"ATLDllCOMServer.SimpleObject"

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

[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

[OsrFx2Extension_ComponentInstall_UserSvc]
ComponentIds=VID_045e&PID_94ac

[Strings]
ManufacturerName = "Contoso"
OsrFx2.ExtensionDesc = "OsrFx2 DCHU Device Extension"
REG_EXPAND_SZ = 0x00020000
FLG_ADDREG_KEYONLY = 0x00000010

如需如何使用擴充功能 INF 來安裝篩選驅動程式的詳細資訊,請參閱 裝置篩選驅動程式排序

為了改善擴充性,我們建議 IHV 將選擇性功能放在 擴充功能 INF 範本中。

回溯相容性

基底驅動程式套件的任何變更都必須經過徹底測試,以確保它不會中斷現有擴充功能 INF 的回溯相容性。

管理基底驅動程式套件時,請遵循下列最佳做法:

  • 程式碼批註和設計檔中的檔參數值範圍和條件約束。 未來的變更必須符合指定的範圍。
  • 若要支援新的範圍,請新增選擇性參數, (沒有預設值) 。

提交延伸模組 INF 以進行認證

如需如何在硬體開發人員中心使用擴充功能 INF 的詳細資訊,請參閱 Windows 硬體開發人員中心儀表板中的使用擴充功能 INF

在合作夥伴中心使用擴充功能 INF

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

使用通用 INF 檔案

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

適用于通用驅動程式的驅動程式套件安裝工具組