使用扩展 INF 文件
在 Windows 10 之前,Windows 会为指定设备选择安装一个驱动程序包。 这生成了大型的复杂驱动程序包,其中包含针对所有场景和配置的代码,并且每个次要更新都需要对整个驱动程序包进行更新。 从 Windows 10 开始,可将 INF 功能拆分为多个组件,其中每个组件都可以独立提供服务。 安装在设备上的核心驱动程序包现在称为基础驱动程序包,它由系统进行处理,其方式与低于 Windows 10 的版本处理驱动程序包的方式相同。 要扩展基本驱动程序包的功能,请在单独的驱动程序包中提供扩展 INF。 一个扩展 INF:
可由不同公司提供,并独立于基础 INF 进行更新。
使用与基本 INF 相同的 INF 语法,但可以扩展基本 INF 以进行自定义或专业化。
提升设备的价值,但并非基本驱动程序包运行的必要条件。 在没有扩展 INF 的情况下,系统必须能够仅使用基本驱动程序包启动和连接网络。 系统内置的输入设备(如键盘)必须至少具备基本功能,而无需任何扩展 INF。
必须是一个通用 INF 文件。
每个设备都必须安装一个基本驱动程序包,还可以选择安装一个或多个与之相关的扩展 INF。 如果设备上没有安装基本驱动程序包,扩展 INF 就无法安装。
使用扩展 INF 的典型情况包括:
修改基本驱动程序包中提供的设置,如自定义设备友好名称或修改硬件配置设置。
通过指定 INF AddComponent 指令和提供 component INF 文件来创建一个或多个软件组件。
提供针对系统型号或外形规格的特定设置,以增强设备的体验或功能,如硬件校准数据。
在设备堆栈中添加筛选器驱动程序。
可以在下面的示例中找到其中一些情况的示例代码。 另请参阅符合 DCH 的驱动程序包示例,其中介绍了 DCHU 通用驱动程序示例如何使用扩展 INF。
扩展 INF 和基本驱动程序包如何协同工作
在设备安装过程中,扩展 INF 中的设置会在基本驱动程序包中的设置之后应用。 因此,如果扩展 INF 和基本驱动程序包指定了相同的设置,则会应用扩展 INF 中的版本。 同样,如果基本驱动程序包发生了变化,则扩展 INF 将保留并应用于新的基本驱动程序包。 如果在同一设备上安装了多个扩展 INF,则不会预先确定扩展 INF 的应用顺序,因此一个扩展 INF 无法确定性地替代不同扩展 INF 提供的值。 针对相同设备的不同扩展 INF 不应尝试更改相同的设置。
在基本驱动程序包中加入注释,说明哪些条目可以被扩展 INF 替代,以及适用的参数值范围和限制条件,这样会很有帮助。
指定 ExtensionId
编写扩展 INF 时,会生成一个名为 ExtensionId 的特殊 GUID,它是 INF 的 [Version] 部分中的一个条目。
系统通过将设备的硬件 ID 和兼容 ID 与适用于该系统的型号部分中的扩展 INF 中指定的 ID 进行匹配,从而确定特定设备可能使用的扩展 INF。
在指定相同 ExtensionId 值的所有可能扩展 INF 中,系统只选择一个进行安装,并将其设置应用于基本驱动程序包的设置之上。 INF 中指定的驱动程序日期和驱动程序版本依次用于在具有相同 ExtensionId 的多个扩展 INF 中选择单个 INF。
为了说明问题,请考虑以下情况,其中包括一个假设设备,该设备具有三个扩展 INF:
ExtensionId 值 {A}
和 {B}
显示在大括号中,每个基本驱动程序包的排名显示在横幅功能区中。
首先,系统会选择具有最佳排名和最高版本的基本驱动程序包。
接下来,系统会处理可用的扩展 INF。 其中两个的 ExtensionId 值为 {B}
,一个的 ExtensionId 值为 {A}
。 从前两项来看,驱动程序的日期是相同的。 下一个决定性因素是驱动程序版本,因此系统会选择使用 v2.0 的扩展 INF。
具有唯一 ExtensionId 值的扩展名 INF 也会被选中。 系统会应用设备的基本驱动程序包,然后应用该设备的两个扩展 INF。
扩展 INF 文件总是在基本驱动程序包之后应用,但没有确定应用扩展 INF 的顺序。
创建扩展 INF
以下是将 INF 定义为扩展 INF 所需的条目。
在 Version 部分中为 Class 和 ClassGuid 指定这些值。 有关安装程序类的详细信息,请参阅适用于供应商的系统定义的设备安装程序类。
[Version] ... Class = Extension ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57} ...
在 [Version] 部分中提供 ExtensionId 条目。 为扩展 INF 的初始版本生成新的 GUID,或在初始扩展 INF 的后续更新中重复使用上次的 GUID。
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
组织只能使用自己拥有的 ExtensionID。 有关注册扩展 ID 的信息,请参阅 Windows 硬件开发人员中心仪表板中的管理硬件提交。
如果要更新扩展 INF,请保持 ExtensionId 不变,并递增 DriverVer 指令指定的版本和日期。 对于给定的 ExtensionId 值,PnP 会选择具有最高 DriverVer 的 INF。
注意
如果扩展 INF 以 Windows 10 S 为目标,请参阅 S 模式下的 Windows 10 驱动程序要求,了解有关在该版本 Windows 上安装驱动程序的信息。
在 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,以便在更多设备上自定义设置。
CHID 目标可用于无法使用四部分硬件 ID 或限制性不够强的情况。
不要用
SPSVCINST_ASSOCSERVICE
来定义服务。 扩展 INF 无法为设备提供函数驱动程序。 但扩展 INF 可以定义其他服务,如设备的筛选器驱动程序。 有关指定服务的详细信息,请参阅 INF AddService 指令。
在大多数情况下,扩展 INF 驱动程序包与基本驱动程序会被包分开提交给硬件开发中心。 有关如何打包扩展 INF 的示例以及示例代码的链接,请参阅符合 DCH 的驱动程序包示例。
扩展 INF 的驱动程序验证和提交流程与基本驱动程序包相同。 有关详细信息,请参阅 Windows HLK 入门。
卸载扩展驱动程序
要从系统中删除扩展驱动程序包,并从使用该程序包的设备上卸载它,请使用带有 uninstall
标记的 PnPUtil 的 delete-driver
命令。 这样就可以在不删除基本驱动程序包的情况下,从设备上卸载扩展驱动程序包。
找到要卸载的驱动程序包的 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。
相关文章
Using a Universal INF File(使用通用 INF 文件)