Как вы получаете необработанные данные дескриптора от устройства USB HID в Windows?

Как вы получаете необработанные данные дескриптора от устройства HID в Windows?

Фон:

Мне нужно получить производителя, название продукта и серийный номер с устройства HID в Windows. Я использую hid.dll для доступа к устройствам с помощью функции видели здесь. Мой вопрос очень похож к этому. Я могу получить строку производителя и строку продукта от НЕКОТОРЫХ устройств HID, но большинство из них не может вернуть эти данные, возвращая значение HidD_GetManufacturerString false. Тем не менее, я ЗНАЮ, что эти устройства имеют строковую информацию в своих дескрипторах, потому что я могу ее увидеть используя USBTreeView.

Интересно то, что даже для устройств, которые возвращают имена производителей и продуктов, значения, которые я получаю через hid.dll, сильно отличаются от значений, которые я вижу с помощью вышеуказанного инструмента, который получает необработанные данные с устройства USB.

Например, контроллер Xbox 360:

Via USB Tree View:
Device Description       : Xbox 360 Controller for Windows
Language 0x0409          : "©Microsoft Corporation"iProduct                 : 0x02
Language 0x0409          : "Controller"iSerialNumber            : 0x03
Language 0x0409          : "0843806"
Via hid.dll using HidD_GetManufacturerString, HidD_GetProductString, and HidD_GetSerialNumberString:
Description              : HID-compliant game controller
Product                  : Controller (XBOX 360 Controller for Windows)
Manufacturer             : FAILS
Serial Number            : FAILS

WinUSB вообще не может открыть эти устройства для получения этих данных, так как они не используют драйвер winusb.sys.

1) Я не понимаю, почему значения, возвращаемые функциями HidD, не соответствуют значениям в дескрипторе USB.
2) Я не могу найти какой-либо способ доступа к необработанным данным дескриптора USB для устройства HID, потому что не могу получить к ним доступ через WinUSB.


Изменить 1:

Итак, я узнал немного больше о HID. Кажется, данные, которые я получаю через hid.dll, являются данными, указанными драйвером, а не данными, поступающими с устройства USB. HID может также применяться к устройствам на транспортных устройствах, отличных от USB. Так что все в порядке. В конечном счете, я действительно хочу узнать, как я могу получить устройство USB, когда у меня есть устройство HID, и какой API я использую для этого. Помимо WinUSB, который не работает, единственное, что я могу найти, это функции уровня ядра IOCTL. Я не знаю, подходит ли это для обычного приложения без прав администратора.

6

Решение

Я наконец нашел решение. Основной проблемой было просто связать HID-устройство с его родительским USB-устройством. Это основной процесс:

Предполагая, что у вас уже есть устройство HID и SP_DEVINFO_DATA для него:

  1. Перечислите все устройства USB как видно здесь.
  2. Найдите все дочерние устройства USB с помощью CM_GetChild и CM_GetSibling.
  3. Сравните дескриптор экземпляра известного устройства HID (SP_DEVINFO_DATA-> DevInst) с дескриптором экземпляра каждого дочернего устройства, который был возвращен функциями CM, чтобы определить, какое USB-устройство является родительским.
  4. Оттуда вы можете получить любую информацию USB, которую вы хотите, включая дескриптор.
2

Другие решения


По вопросам рекламы [email protected]