使用扩展 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 的 [版本] 部分中的条目。

系统通过将设备的硬件 ID 和兼容 ID 与适用于该系统的 “模型” 部分中的扩展 INF 中指定的 ID 进行匹配,来标识特定设备的可能扩展 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. “版本”部分中为“Class”和“ClassGuid”指定这些值。 有关安装类的详细信息,请参阅 供应商可用的系统定义的设备安装程序类

    [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 。 有关注册扩展 ID 的信息,请参阅管理Windows 硬件开发人员中心仪表板中的硬件提交

  1. 如果要更新扩展 INF,请保持 ExtensionId 不变,并递增 DriverVer 指令指定的版本和日期。 对于给定 的 ExtensionId 值,PnP 选择具有最高 DriverVer 的 INF。

    注意

    如果扩展 INF 面向 Windows 10 S,请参阅 S 模式驱动程序要求中的Windows 10,了解有关该版本的 Windows 上的驱动程序安装的信息。

  2. “INF 模型”部分中,指定一个或多个与目标设备匹配的硬件和兼容 ID。 这些硬件和兼容 ID 不需要与基本驱动程序包的 ID 匹配。 通常,扩展 INF 会列出比基本驱动程序包更具体的硬件 ID,目的是进一步专用化特定的驱动程序配置。 例如,基本驱动程序包可能使用由两部分构成的 PCI 硬件 ID,而扩展 INF 指定由四部分构成的 PCI 硬件 ID,如下所示:

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

    或者,扩展 INF 可能会列出与基本驱动程序包相同的硬件 ID,例如,如果设备已面向较窄,或者如果基本驱动程序包已列出最具体的硬件 ID。

    在某些情况下,扩展 INF 可能会提供不太具体的设备 ID(如兼容 ID),以便在更广泛的设备集中自定义设置。

    如果无法提供由四部分构成的硬件 ID 或限制不够,则可以使用 CHID 目标

  3. 不要使用 SPSVCINST_ASSOCSERVICE定义服务。 扩展 INF 无法为设备提供函数驱动程序。 但是,扩展 INF 可以定义其他服务,例如设备的筛选器驱动程序。 有关指定服务的详细信息,请参阅 INF AddService 指令

在大多数情况下,你将将扩展 INF 驱动程序包与基本驱动程序包分开提交到硬件开发人员中心。 有关如何打包扩展 INF 的示例和示例代码的链接,请参阅 符合 DCH 的驱动程序包示例

扩展 INF 的驱动程序验证和提交过程与基本驱动程序包相同。 有关详细信息,请参阅 Windows HLK 入门

卸载扩展驱动程序

若要从系统中删除扩展驱动程序包并从使用它的任何设备中卸载它,请使用带有 uninstall 标志的 delete-driverPnPUtil 命令。 这允许从设备中卸载扩展驱动程序包,而无需删除基本驱动程序包。

查找要卸载的驱动程序包的 oem<#>.inf 名称并使用 pnputil /delete-driver oem<#>.inf /uninstall

pnputil /enum-drivers 可用于帮助标识适当的 oem<#>.inf 名称。

示例 1:使用扩展 INF 设置设备友好名称

在一种常见方案中,设备制造商 (IHV) 提供基本驱动程序包,然后系统生成器 (OEM) 提供扩展 INF,该扩展 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 的驱动程序包示例

Using a Universal INF File(使用通用 INF 文件)

Windows 驱动程序入门

通用驱动程序的驱动程序包安装工具包