使用组件 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:

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

备注

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

此外,任何 INF (组件或不) 软件组件设备上的匹配:

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

注意:为了使软件枚举组件设备正常运行,必须启动其父设备。 如果没有可用于父设备的驱动程序,驱动程序开发人员可以创建自己的驱动程序,并选择性地利用直通驱动程序“umpass.sys”。 此驱动程序包含在 Windows 中,实际上除了启动设备之外,也不执行任何操作。 为了使用umpass.sys,开发人员应在每个可能的 [ DDInstall.*] 节中使用 DDInstall 节 中的 Include/Needs INF 指令,以对应的 [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. 使用 调用 SetupDiGetDevicePropertyDEVPKEY_Device_Parent 以检索父级的设备实例 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

[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

[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 节