共用方式為


使用擴充功能 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 旗標。 這可讓擴充驅動程式套件從裝置卸載,而不需要移除基底驅動程式套件。

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

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 驅動程式

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