使用扩展 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,该 GUID 是 INF 的 [版本] 部分中的一个条目。

系统通过将设备的硬件 ID 和兼容的设备 ID 与适用于该系统的 模型 部分中扩展 INF 中指定的设备 ID 相匹配来标识特定设备的可能扩展 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. [版本] 部分中提供 ExtensionId 条目。 为扩展 INF 的初始版本生成新的 GUID,或重复使用最后一个 GUID 来更新初始扩展 INF。

    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 上的驱动程序安装的信息。

  1. “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 目标

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

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

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

卸载扩展驱动程序

若要从系统中删除扩展驱动程序包,并使用它从任何设备卸载它,请使用 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

[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”。