使用组件 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,开发人员应对相应的 [UmPass.*] 节的每个可能的 [ DDInstall.*] 节使用 DDInstall 节中的 Include/Needs INF 指令,如下所示,无论 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 指令部分中的 <<DeviceInstanceID>>
SoftwareArguments 值。
然后,可执行文件可以从其传入参数列表中检索软件组件的设备实例 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 入门。
有关安装类的详细信息,请参阅 供应商可用的系统定义的设备安装类。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈