使用组件 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(无论是否组件)都与软件组件设备相匹配:
- 可使用 AddService 指令来指定 Win32 用户服务。
- 可使用 INF AddReg 指令和 INF CopyFiles 指令安装软件。
- 不需要函数驱动程序服务。
- 用户可独立于父设备进行卸载。
可以在适用于通用驱动程序的驱动程序包安装工具包中找到组件 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。
接下来,如果软件组件的目标是通用目标平台,请按以下流程操作:
- 使用软件组件的设备实例 ID 调用 CM_Locate_DevNode 以检索设备句柄。
- 调用 CM_Get_Parent 以检索该设备父级的句柄。 此父设备是使用 INF AddComponent 指令添加软件组件的设备。
- 然后,要获取父设备的设备实例 ID,请在 CM_Get_Parent 中的句柄上调用 CM_Get_Device_ID。
如果软件组件仅针对桌面目标平台,请按照以下步骤操作:
- 调用 SetupDiCreateDeviceInfoList 以创建空的设备信息集。
- 使用软件组件设备的设备实例 ID 调用 SetupDiOpenDeviceInfo。
- 使用
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 入门。
有关安装程序类的详细信息,请参阅适用于供应商的系统定义的设备安装程序类。