从 Windows INF 文件中提取 HID
Extracting HID from Windows INF File
我正在尝试为 Windows 驱动程序安装解析大量 INF 文件。
我收集了大量适用于各种设备(生物识别、蓝牙、视频等)的驱动程序 -- 所有这些驱动程序的创建日期和内容各不相同。
我正在尝试解析这些文件,以便我可以输入文件内容和 return PCI 和 PCI-E 设备的 Hardware ID which is formatted like this for USB devices, and this。
我的问题是这些值在各自的 INF 文件中的位置似乎没有任何特定的顺序或标准化。
例如,这个来自 Intel 的蓝牙驱动程序开始如下:
[Version]
Signature = "$WINDOWS NT$"
Class = Bluetooth
ClassGuid = {e0cbf06c-cd8b-4647-bb8a-263b43f0f974}
Provider = %PROVIDER_NAME%
CatalogFile = ibtusb.cat
DriverVer = 07/06/2018,20.70.1.1
[SourceDisksNames]
1=%SOURCEDISK1%,,,
[SourceDisksFiles]
ibtusb.sys = 1
ibtfw.dat = 1
[DestinationDirs]
ibtusb.Copy = 12 ; drivers
firmware.Copy = 12
;
; Driver Information
;
[Manufacturer]
%COMPANY_NAME% = Device,NTamd64.10.0...16299
[Device.NTamd64.10.0...16299]
;---Start VID_PIDS section---
%iBT_USB% = ibtusb, USB\VID_8087&PID_0025&REV_0001
%iBT_USB% = ibtusb, USB\VID_8087&PID_0025&REV_0002
;---End VID_PIDS section---
注意设备 ID (USB\VID_8087&PID_0025
) 是如何存储在 [Device.NTamd64.10.0...16299]
键下的。
在这一行:%COMPANY_NAME% = Device,NTamd64.10.0...16299
设备ID设置为%COMPANY_NAME%
,由itbtusb,
分隔
但是,如果我将此布局与 Nokia 蓝牙驱动程序进行比较,例如,它是完全不同的:
[Version]
Signature="$Windows NT$"
Class=CustomUSBDevices
ClassGuid={a503e2d3-a031-49dc-b684-c99085dbfe92}
Provider=%Manufacturer%
CatalogFile=%DriverBaseName%.cat
DriverVer=05/15/2012,2.4.0.4
[ClassInstall32]
AddReg=ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,,%DeviceManagerCategory%
HKR,,Icon,,"-20"
[Manufacturer]
%Manufacturer%=DeviceList, NTamd64
[ControlFlags]
ExcludeFromSelect=*
[DeviceList]
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064C
[DeviceList.NTamd64]
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064C
这次,设备 ID 存储在 [DeviceList]
和 [DeviceList.NTamd64]
键下。
[DeviceList]
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064C
[DeviceList.NTamd64]
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064C
有了这个我有一些一般性的问题:
- 有什么万无一失的提取方法吗?
- 我发现可以在
[Manufacturer]
键中找到包含硬件 ID 的数据的键名 -- 总是这样吗?
- 设备ID总是第二个值吗? (以逗号分隔)
- Microsoft document/define/recommend 供应商是否有这种行为?
如果需要说明,请提出修改建议或发表评论。
谢谢!
使用 InfVerif
utility that comes as part of the Windows Driver Kit 的输出可能更容易。您无需安装 Visual Studio 或任何其他软件即可使用它。
它需要一个 /info
标志,以一致的格式打印设备信息。例如,运行 它在我当前机器上的随机 inf 文件中:
xusb22.inf Information
INF Hash: e41db3fe2103ee21
Family ID: Microsoft-xusb22.inf
Device: Xbox 360 Controller for Windows
Hardware ID: USB\Vid_045E&Pid_028E
Service: xusb22
Section Name: CC_Install
Architecture: amd64
Device: Xbox 360 Wireless Receiver for Windows
Hardware ID: USB\Vid_045E&Pid_0719
Service: xusb22
Section Name: CC_Install
Architecture: amd64
Device: Xbox 360 Controller for Windows
Hardware ID: USB\MS_COMP_XUSB10
Service: xusb22
Section Name: CC_Install
Architecture: amd64
...
以下是一些您可能会觉得有用的 MSDN link:
General Syntax Rules for INF Files
您要查找的部分称为 Models 部分,它们确实在 Manufacturer 部分中定义 - 这在来自上面 link 的 Models 部分文档:
Each models-section-name must be listed in the INF Manufacturer
section of the INF file. There can be one or more entries in any
per-manufacturer Models section, depending on how many devices (and
drivers) the INF file installs for a particular manufacturer.
这是记录在案的 Models 部分语法(来自相同的 link):
[models-section-name] |
[models-section-name.TargetOSVersion] (Windows XP and later versions of Windows)
device-description=install-section-name[,hw-id][,compatible-id...]
[device-description=install-section-name[,hw-id][,compatible-id]...] ...
如果您想手动解析 INF,您可能还会发现此处列出的一些有用的 Windows SetupAPI 实用程序:
Extracting File Information from the INF file
如果您有兴趣提取仅与特定 OS 版本相关的信息,这些 API 也可能有用:
SetupDiGetActualSectionToInstallEx
最后,如果您只对硬件 ID 感兴趣,使用 @cody 提到的 InfVerif WDK 工具 /info
标志可能确实是最好的方法解决您的问题,因为该工具将为您完成所有必要的解析。
我正在尝试为 Windows 驱动程序安装解析大量 INF 文件。
我收集了大量适用于各种设备(生物识别、蓝牙、视频等)的驱动程序 -- 所有这些驱动程序的创建日期和内容各不相同。 我正在尝试解析这些文件,以便我可以输入文件内容和 return PCI 和 PCI-E 设备的 Hardware ID which is formatted like this for USB devices, and this。
我的问题是这些值在各自的 INF 文件中的位置似乎没有任何特定的顺序或标准化。
例如,这个来自 Intel 的蓝牙驱动程序开始如下:
[Version]
Signature = "$WINDOWS NT$"
Class = Bluetooth
ClassGuid = {e0cbf06c-cd8b-4647-bb8a-263b43f0f974}
Provider = %PROVIDER_NAME%
CatalogFile = ibtusb.cat
DriverVer = 07/06/2018,20.70.1.1
[SourceDisksNames]
1=%SOURCEDISK1%,,,
[SourceDisksFiles]
ibtusb.sys = 1
ibtfw.dat = 1
[DestinationDirs]
ibtusb.Copy = 12 ; drivers
firmware.Copy = 12
;
; Driver Information
;
[Manufacturer]
%COMPANY_NAME% = Device,NTamd64.10.0...16299
[Device.NTamd64.10.0...16299]
;---Start VID_PIDS section---
%iBT_USB% = ibtusb, USB\VID_8087&PID_0025&REV_0001
%iBT_USB% = ibtusb, USB\VID_8087&PID_0025&REV_0002
;---End VID_PIDS section---
注意设备 ID (USB\VID_8087&PID_0025
) 是如何存储在 [Device.NTamd64.10.0...16299]
键下的。
在这一行:%COMPANY_NAME% = Device,NTamd64.10.0...16299
设备ID设置为%COMPANY_NAME%
,由itbtusb,
但是,如果我将此布局与 Nokia 蓝牙驱动程序进行比较,例如,它是完全不同的:
[Version]
Signature="$Windows NT$"
Class=CustomUSBDevices
ClassGuid={a503e2d3-a031-49dc-b684-c99085dbfe92}
Provider=%Manufacturer%
CatalogFile=%DriverBaseName%.cat
DriverVer=05/15/2012,2.4.0.4
[ClassInstall32]
AddReg=ClassInstall_AddReg
[ClassInstall_AddReg]
HKR,,,,%DeviceManagerCategory%
HKR,,Icon,,"-20"
[Manufacturer]
%Manufacturer%=DeviceList, NTamd64
[ControlFlags]
ExcludeFromSelect=*
[DeviceList]
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064C
[DeviceList.NTamd64]
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064C
这次,设备 ID 存储在 [DeviceList]
和 [DeviceList.NTamd64]
键下。
[DeviceList]
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstall, USB\VID_0421&PID_064C
[DeviceList.NTamd64]
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064B
%NokiaBH907%=DriverInstallX64, USB\VID_0421&PID_064C
有了这个我有一些一般性的问题:
- 有什么万无一失的提取方法吗?
- 我发现可以在
[Manufacturer]
键中找到包含硬件 ID 的数据的键名 -- 总是这样吗? - 设备ID总是第二个值吗? (以逗号分隔)
- Microsoft document/define/recommend 供应商是否有这种行为?
如果需要说明,请提出修改建议或发表评论。
谢谢!
使用 InfVerif
utility that comes as part of the Windows Driver Kit 的输出可能更容易。您无需安装 Visual Studio 或任何其他软件即可使用它。
它需要一个 /info
标志,以一致的格式打印设备信息。例如,运行 它在我当前机器上的随机 inf 文件中:
xusb22.inf Information
INF Hash: e41db3fe2103ee21
Family ID: Microsoft-xusb22.inf
Device: Xbox 360 Controller for Windows
Hardware ID: USB\Vid_045E&Pid_028E
Service: xusb22
Section Name: CC_Install
Architecture: amd64
Device: Xbox 360 Wireless Receiver for Windows
Hardware ID: USB\Vid_045E&Pid_0719
Service: xusb22
Section Name: CC_Install
Architecture: amd64
Device: Xbox 360 Controller for Windows
Hardware ID: USB\MS_COMP_XUSB10
Service: xusb22
Section Name: CC_Install
Architecture: amd64
...
以下是一些您可能会觉得有用的 MSDN link:
General Syntax Rules for INF Files
您要查找的部分称为 Models 部分,它们确实在 Manufacturer 部分中定义 - 这在来自上面 link 的 Models 部分文档:
Each models-section-name must be listed in the INF Manufacturer section of the INF file. There can be one or more entries in any per-manufacturer Models section, depending on how many devices (and drivers) the INF file installs for a particular manufacturer.
这是记录在案的 Models 部分语法(来自相同的 link):
[models-section-name] |
[models-section-name.TargetOSVersion] (Windows XP and later versions of Windows)
device-description=install-section-name[,hw-id][,compatible-id...]
[device-description=install-section-name[,hw-id][,compatible-id]...] ...
如果您想手动解析 INF,您可能还会发现此处列出的一些有用的 Windows SetupAPI 实用程序:
Extracting File Information from the INF file
如果您有兴趣提取仅与特定 OS 版本相关的信息,这些 API 也可能有用:
SetupDiGetActualSectionToInstallEx
最后,如果您只对硬件 ID 感兴趣,使用 @cody 提到的 InfVerif WDK 工具 /info
标志可能确实是最好的方法解决您的问题,因为该工具将为您完成所有必要的解析。