使用组件 INF 文件

如果希望在 Windows 10 中包含与设备一起使用的用户模式软件,则可以使用以下选项来创建符合 DCH 的驱动程序

方法 场景
硬件支持应用 (HSA) 以 UWP 应用形式打包的设备附加软件,由 Microsoft Store 提供交付和服务。 推荐的方法。
软件组件 设备加载项软件是 MSI 或 EXE 二进制文件、Win32 服务或使用 AddReg 和 CopyFiles 安装的软件。 引用的二进制文件只能在桌面版(家庭版、专业版和企业版)上运行。 引用的二进制文件无法在 Windows 10S 上运行。

软件组件是一个独立的驱动程序包,可安装一个或多个软件模块。 所安装的软件可提高设备的价值,但并非设备基本功能所必需,也不需要相关的功能驱动程序服务。

本页提供软件组件使用指南。

入门

要创建组件,扩展程序 INF 文件会在 INF DDInstall.Components 部分中指定 INF AddComponent 指令一次或多次。 对于扩展 INF 文件中引用的每个软件组件,系统都会创建一个虚拟软件枚举子设备。 多个驱动程序包可以引用同一个软件组件。

只要启动父设备,虚拟设备子设备就可以像其他设备一样独立更新。 建议从服务的角度出发,将功能分成尽可能多的不同组别,然后为每个组别创建一个软件组件。

将为每个软件组件提供一个 INF 文件。

如果软件组件 INF 指定了 AddSoftware 指令,则组件 INF:

  • 必须是一个通用 INF 文件
  • 必须指定 SoftwareComponent 安装程序类。

可以指定 AddSoftware 指令一次或多次。

注意

使用 AddSoftware 指令类型 2 时,不需要使用组件 INF。 该指令可在任何 INF 中成功使用。 但是,必须在组件 INF 中使用类型 1 的 AddSoftware 指令。

此外,任何 INF(无论是否组件)都与软件组件设备相匹配:

可以在适用于通用驱动程序的驱动程序包安装工具包中找到组件 INF 的示例。

注意:要使软件枚举组件设备正常运行,必须启动其父设备。 如果父设备没有可用的驱动程序,则驱动程序开发人员可以创建自己的驱动程序,也可以选择使用直通驱动程序“umpass.sys”。 此驱动程序包含在 Windows 中,除了启动设备外,实际上不执行任何操作。 为了使用 umpass.sys,开发人员应使用 DDInstall 部分中的 Include/Needs INF 指令,将每个可能的 [DDInstall.*] 部分对应到相应的 [UmPass.*] 部分,如下所示,无论 INF 是否为该节指定了任何指令:

[DDInstall]
Include=umpass.inf
Needs=UmPass
; also include any existing DDInstall directives

[DDInstall.HW]
Include=umpass.inf
Needs=UmPass.HW
; also include any existing DDInstall.HW directives

[DDInstall.Interfaces]
Include=umpass.inf
Needs=UmPass.Interfaces
; also include any existing DDInstall.Interfaces directives

[DDInstall.Services]
Include=umpass.inf
Needs=UmPass.Services
; also include any existing any DDInstall.Services directives

从软件组件访问设备

要检索与软件组件关联的设备实例 ID,请使用 INF AddSoftware 指令部分中的 SoftwareArguments 值和 <<DeviceInstanceID>> 运行时上下文变量。

然后,可执行文件就可以从输入的参数列表中获取软件组件的设备实例 ID。

接下来,如果软件组件的目标是通用目标平台,请按以下流程操作:

  1. 使用软件组件的设备实例 ID 调用 CM_Locate_DevNode 以检索设备句柄。
  2. 调用 CM_Get_Parent 以检索该设备父级的句柄。 此父设备是使用 INF AddComponent 指令添加软件组件的设备。
  3. 然后,要获取父设备的设备实例 ID,请在 CM_Get_Parent 中的句柄上调用 CM_Get_Device_ID

如果软件组件仅针对桌面目标平台,请按照以下步骤操作:

  1. 调用 SetupDiCreateDeviceInfoList 以创建空的设备信息集。
  2. 使用软件组件设备的设备实例 ID 调用 SetupDiOpenDeviceInfo
  3. 使用 DEVPKEY_Device_Parent 调用 SetupDiGetDeviceProperty 以检索父设备的设备实例 ID。

示例

以下示例展示了如何使用软件组件,使用图形卡的可执行文件来安装控制面板。

驱动程序包 INF 文件

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
Provider    = %CONTOSO%
DriverVer   = 06/21/2006,1.0.0.0
CatalogFile = ContosoGrfx.cat
PnpLockdown = 1

[Manufacturer]
%CONTOSO%=Contoso,NTx86

[Contoso.NTx86]
%ContosoGrfx.DeviceDesc%=ContosoGrfx, PCI\VEN0001&DEV0001

[ContosoGrfx.NT]
;empty

[ContosoGrfx.NT.Components]
AddComponent = ContosoControlPanel,, Component_Inst

[Component_Inst]
ComponentIDs = VID0001&PID0001&SID0001

[Strings]
CONTOSO = "Contoso Inc."
ContosoGrfx.DeviceDesc = "Contoso Graphics Card Extension"

软件组件 INF 文件

[Version]
Signature   = "$WINDOWS NT$"
Class       = SoftwareComponent
ClassGuid   = {5c4c3332-344d-483c-8739-259e934c9cc8}
Provider    = %CONTOSO%
DriverVer   = 06/21/2006,1.0.0.0
CatalogFile = ContosoCtrlPnl.cat
PnpLockdown = 1

[SourceDisksNames]
1 = %Disk%,,,""

[SourceDisksFiles]
ContosoCtrlPnl.exe = 1

[DestinationDirs]
DefaultDestDir = 13

[Manufacturer]
%CONTOSO%=Contoso,NTx86

[Contoso.NTx86]
%ContosoCtrlPnl.DeviceDesc%=ContosoCtrlPnl, SWC\VID0001&PID0001&SID0001

[ContosoCtrlPnl.NT]
CopyFiles=ContosoCtrlPnl.NT.Copy

[ContosoCtrlPnl.NT.Copy]
ContosoCtrlPnl.exe

[ContosoCtrlPNl.NT.Services]
AddService = , %SPSVCINST_ASSOCSERVICE%

[ContosoCtrlPnl.NT.Software]
AddSoftware = ContosoGrfx1CtrlPnl,, Software_Inst

[Software_Inst]
SoftwareType = 1
SoftwareBinary = %13%\ContosoCtrlPnl.exe
SoftwareArguments = <<DeviceInstanceID>>
SoftwareVersion = 1.0.0.0

[Strings]
SPSVCINST_ASSOCSERVICE = 0x00000002
CONTOSO = "Contoso"
ContosoCtrlPnl.DeviceDesc = "Contoso Control Panel"

组件 INF 的驱动程序验证和提交流程与常规 INF 相同。 有关详细信息,请参阅 Windows HLK 入门

有关安装程序类的详细信息,请参阅适用于供应商的系统定义的设备安装程序类

另请参阅

INF AddComponent 指令

INF AddSoftware 指令

INF DDInstall.Components 部分

INF DDInstall.Software 部分