Как вы получаете необработанные данные дескриптора от устройства 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. Я не знаю, подходит ли это для обычного приложения без прав администратора.
Я наконец нашел решение. Основной проблемой было просто связать HID-устройство с его родительским USB-устройством. Это основной процесс:
Предполагая, что у вас уже есть устройство HID и SP_DEVINFO_DATA для него: