Извлечение HID из файла Windows INF - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь проанализировать большое количество файлов INF для установки драйверов Windows.

У меня есть большая коллекция драйверов для различных устройств (биометрия, Bluetooth, видео и т. Д.) - все с разными датами создания и содержанием. Я пытаюсь проанализировать эти файлы так, чтобы я мог ввести содержимое файла и вернуть Идентификатор оборудования , который отформатирован как this для USB-устройств и this для Устройства PCI и PCI-E.

Моя проблема в том, что, похоже, не существует какого-либо определенного порядка или стандартизации для размещения этих значений в соответствующем INF-файле.

Например, этот драйвер Bluetooth от 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---

Обратите внимание, как идентификатор устройства (USB\VID_8087&PID_0025) хранится под ключом [Device.NTamd64.10.0...16299].

В этой конкретной строке: %COMPANY_NAME% = Device,NTamd64.10.0...16299

Идентификатор устройства установлен равным %COMPANY_NAME% и отделяется itbtusb,

Однако, если я сравню этот макет с драйвером Nokia Bluetooth, например, он будет совершенно другим:

[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

На этот раз идентификатор устройства сохраняется под клавишами [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] - это всегда так?
  • Всегда ли идентификатор устройства является вторым значением? (через запятую)
  • Документирует ли / определяет / рекомендует ли Microsoft такое поведение для поставщиков?

Если требуется уточнение, предложите отредактировать или оставить комментарий.

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Вот некоторые ссылки MSDN, которые могут оказаться полезными:

INF Раздел производителя

Раздел моделей INF

Просмотр INF-файла

Общие правила синтаксиса для файлов INF

Разделы, которые вы ищете, называются Модели , которые действительно определены в разделах Изготовитель - это упоминается в документации Модели . по ссылке выше:

Каждое название раздела модели должно быть указано в 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-файла

Если вы заинтересованы в извлечении информации, относящейся только к конкретной версии ОС, эти API также могут быть полезны:

SetupDiGetActualModelsSection

SetupDiGetActualSectionToInstallEx

Наконец, если вам просто интересны идентификаторы оборудования, использование флага InfVerif WDK /info, упомянутого @cody, действительно может быть лучшим способом решения вашей проблемы, поскольку инструмент сделайте все необходимые для вас разборы.

1 голос
/ 10 марта 2019

Может быть проще использовать выходные данные утилиты InfVerif, входящей в состав 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

...
...