Jak uzyskać surowe dane deskryptorów z urządzenia HID w systemie Windows?Jak uzyskać surowe dane deskryptorów z urządzenia USB HID w systemie Windows?
Tło:
Muszę producenta, nazwę produktu i numer seryjny z urządzenia HID w systemie Windows. Używam hid.dll, aby uzyskać dostęp do urządzeń za pomocą functions seen here. Moje pytanie jest bardzo podobne: to this one. Jestem w stanie uzyskać ciąg producenta i łańcuch produktu z urządzeń SOME HID, ale większość nie zwraca tych danych, gdy HidD_GetManufacturerString zwraca false. Jednak WIEM, że te urządzenia mają informacje o łańcuchach w swoich deskryptorach, ponieważ jestem w stanie je zobaczyć using USBTreeView.
Interesujące jest to, że nawet w przypadku urządzeń, które zwracają nazwy producenta i produktu, wartości przechodzące przez hid.dll są bardzo różne od wartości widzianych za pomocą powyższego narzędzia, które pobiera nieprzetworzone dane z Urządzenie USB.
Na przykład kontroler 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 nie jest w stanie otworzyć tych urządzeń w ogóle odzyskać te dane, ponieważ nie używać sterownika winusb.sys.
1) Nie rozumiem, dlaczego wartości zwracane przez funkcje HidD nie są zgodne z wartościami w deskryptorze USB. 2) Nie mogę znaleźć żadnego sposobu dostępu do surowych danych deskryptorów USB dla urządzenia HID, ponieważ nie mogę uzyskać do nich dostępu za pomocą WinUSB.
Edit 1:
Ok, więc nauczyłem się nieco więcej o HID. Wygląda na to, że dane, które przechodzę przez hid.dll, to dane określone przez sterownik, a nie dane pochodzące z urządzenia USB. HID może również dotyczyć urządzeń na transporcie innym niż USB. To w porządku. Ostatecznie, naprawdę chciałbym wiedzieć, jak mogę uzyskać urządzenie USB, gdy mam urządzenie HID i jakiego API używam do tego. Oprócz WinUSB, który nie działa, jedyne, co mogę znaleźć, to funkcje IOCTL na poziomie jądra. Nie wiem, czy to nadaje się do normalnej, nie administacyjnej aplikacji.
Ja * myślę, że urządzenie USB będzie rodzicem urządzenia HID (tak jest w Menedżerze urządzeń, przynajmniej w moim systemie), więc może mógłbyś użyć CM_Get_Parent i powiązanych funkcji? –
@HarryJohnston Dzięki za cynk. Niestety rodzic nie zawsze jest urządzeniem USB, ponieważ niektóre urządzenia HID są zagnieżdżone na kilku poziomach. Ostatecznie kluczem były jednak funkcje CM. Dodam odpowiedź. – Guavaman