-1

我正在尝试为 Windows 驱动程序安装解析大量 INF 文件。

我收集了大量适用于各种设备(生物识别、蓝牙、视频等)的驱动程序——所有这些驱动程序都有不同的创建日期和内容。我正在尝试解析这些文件,以便我可以输入文件内容并返回硬件 ID ,硬件 ID对于 USB 设备和PCI 和 PCI-E 设备的格式如下所示。

我的问题是,这些值在相应的 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,

但是,如果我将此布局与诺基亚蓝牙驱动程序进行比较,例如,它是完全不同的:

[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

有了这个,我有一些一般性的问题:

  • 有没有万无一失的方法来提取这个?
  • 我已经意识到可以在密钥中找到包含硬件 ID 的数据的密钥名称[Manufacturer]——总是这样吗?
  • 设备 ID总是第二个值吗?(用逗号分隔)
  • Microsoft 是否为供应商记录/定义/推荐这种行为?

如果需要澄清,请提出编辑建议或发表评论。

谢谢!

4

2 回答 2

2

使用作为Windows Driver KitInfVerif一部分提供的实用程序的输出可能更容易。您无需安装 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

...
于 2019-03-09T21:06:02.337 回答
2

以下是一些您可能会觉得有用的 MSDN 链接:

INF 制造商部分

INF 模型部分

查看 INF 文件

INF 文件的一般语法规则

您要查找的部分称为模型部分,它们确实在制造商部分中定义 - 这在上面链接的模型部分文档中提到:

每个模型部分名称都必须列在 INF 文件的 INF 制造商部分中。每个制造商模型部分中可以有一个或多个条目,具体取决于 INF 文件为特定制造商安装的设备(和驱动程序)数量。

这是记录在案的模型部分语法(来自同一链接):

[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 实用程序,如下所列:

从 INF 文件中提取文件信息

如果您有兴趣提取仅与特定操作系统版本相关的信息,这些 API 也可能有用:

SetupDiGetActualModelsSection

SetupDiGetActualSectionToInstallEx

最后,如果您只对硬件 ID 感兴趣,使用@cody 提到的 InfV ​​erif WDK 工具/info标志可能确实是解决您的问题的最佳方法,因为该工具将为您完成所有必要的解析。

于 2019-03-09T22:56:58.117 回答