我正在尝试解析Windows驱动程序安装的大量INF文件。
我有大量用于各种设备(生物识别技术,蓝牙,视频等)的驱动程序 - 所有驱动程序都有不同的创建日期和内容。我正在尝试解析这些文件,以便我可以输入文件内容并返回为USB设备的格式化的硬件ID,以及用于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, USBVID_8087&PID_0025&REV_0001
%iBT_USB% = ibtusb, USBVID_8087&PID_0025&REV_0002
;---End VID_PIDS section---
注意设备ID(USBVID_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, USBVID_0421&PID_064B
%NokiaBH907%=DriverInstall, USBVID_0421&PID_064C
[DeviceList.NTamd64]
%NokiaBH907%=DriverInstallX64, USBVID_0421&PID_064B
%NokiaBH907%=DriverInstallX64, USBVID_0421&PID_064C
这次,设备ID存储在[DeviceList]
和[DeviceList.NTamd64]
键下。
[DeviceList]
%NokiaBH907%=DriverInstall, USBVID_0421&PID_064B
%NokiaBH907%=DriverInstall, USBVID_0421&PID_064C
[DeviceList.NTamd64]
%NokiaBH907%=DriverInstallX64, USBVID_0421&PID_064B
%NokiaBH907%=DriverInstallX64, USBVID_0421&PID_064C
有了我有一些一般性问题:
- 有什么可提取此问题的万无一失的方法?
- 我已经意识到包含硬件ID的数据的关键名称可以在
[Manufacturer]
密钥中找到 - 这始终是这种情况吗? - 设备ID 始终第二个值?(由逗号隔开)
- Microsoft文档/定义/向供应商推荐此行为?
如果需要澄清,请建议编辑或发表评论。
谢谢!
,作为Windows驱动程序套件的一部分,消耗InfVerif
实用程序的输出可能会更容易。您无需使用Visual Studio或其他任何其他内容即可使用它。
采用/info
标志,该标志以一致的格式打印设备信息。例如,在当前计算机上的随机INF文件上运行它:
xusb22.inf Information
INF Hash: e41db3fe2103ee21
Family ID: Microsoft-xusb22.inf
Device: Xbox 360 Controller for Windows
Hardware ID: USBVid_045E&Pid_028E
Service: xusb22
Section Name: CC_Install
Architecture: amd64
Device: Xbox 360 Wireless Receiver for Windows
Hardware ID: USBVid_045E&Pid_0719
Service: xusb22
Section Name: CC_Install
Architecture: amd64
Device: Xbox 360 Controller for Windows
Hardware ID: USBMS_COMP_XUSB10
Service: xusb22
Section Name: CC_Install
Architecture: amd64
...
这是一些MSDN链接,您可能会发现有用:
INF制造商部分
INF模型部分
查看INF文件
INF文件的一般语法规则
您要查找的部分称为模型 e节,实际上是在制造商 exection中定义的 - 这在模型中提到了这一点面链接的部分文档:
必须在INF制造商中列出每个型号的名称 INF文件的部分。任何条目都可以有一个或多个条目 每个制造商模型部分,具体取决于多少个设备(和 驱动程序)INF文件为特定制造商安装。
这是已记录的 models 节语法(来自同一链接):
[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文件中提取文件信息
如果您有兴趣提取仅与特定OS版本相关的信息,则这些API也可能使用:
setupDigetactualModelsSection
setupDigetactualSectionToInstallex
最后,如果您只是对硬件ID感兴趣,则使用 infverif WDK工具/info
标志@Cody提到的Flag确实可能是解决问题的最佳方法,因为该工具将可以做到所有必要的解析。