共用方式為


使用擴展 INF 檔案

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

系統會藉由將裝置的硬體識別碼和相容識別碼與適用於該系統的擴充 INF 中的 Models 區段中指定的識別碼進行匹配,來識別特定裝置的可能擴充 INF。

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

為了說明,請考慮下列情境,這是一個假設的裝置,其中包含三個擴充的 INF 檔:

顯示如何選取基底 INF 和擴充 INF 的圖表。

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

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

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

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

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

建立擴充功能 INF

以下是您需要將 INF 定義為擴充 INF 的項目。

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

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. 提供 ExtensionId 項目於 [Version] 區段中。 為擴充功能 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 檔案可能會提供較不特定的裝置 ID,例如相容 ID,以便在更多裝置上自定義設定。

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

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

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

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

卸載擴充功能驅動程式

若要從系統移除擴充驅動程式套件並將其從使用該套件的任何裝置中卸載,請使用PnPUtildelete-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,,"{00001111-aaaa-2222-bbbb-3333cccc4444}"
HKCR,AppID\{00001111-aaaa-2222-bbbb-3333cccc4444},,,"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 驅動程式

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