2014-10-04 25 views
6

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.

+0

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? –

+0

@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

Odpowiedz

2

W końcu znalazłem rozwiązanie. Głównym problemem było po prostu powiązanie urządzenia HID z nadrzędnym urządzeniem USB. Jest to podstawowy proces:

Zakładając masz już urządzenie HID i SP_DEVINFO_DATA dla niego:

  1. wyliczyć wszystkie urządzenia USB as seen here.
  2. Znajdź wszystkie urządzenia USB z CM_GetChild i CM_GetSibling.
  3. Porównaj uchwyt znanej instancji urządzenia HID (SP_DEVINFO_DATA-> DevInst) z uchwytem każdego urządzenia podrzędnego zwróconego przez funkcje CM, aby określić, które urządzenie USB jest rodzica.
  4. Stamtąd można uzyskać dowolne informacje o urządzeniu USB, w tym deskryptor.
+0

Nie można po prostu wywoływać CM_Get_Parent wielokrotnie, aby podążać za łańcuchem aż do znalezienia urządzenia USB? –

+0

@HarryJohnston Prawdopodobnie masz rację. Nie myślałem o tym, głównie dlatego, że tak naprawdę nie rozumiałem związku między urządzeniami USB i urządzeniami HID, dopóki nie przeszedłem przez ten proces. Musiałbyś również rozpoznać, które urządzenie USB jest najwyższym urządzeniem, ponieważ może istnieć wiele urządzeń. Przypuszczam, że chcesz przestać, kiedy trafisz na hub i przejdziesz -1. – Guavaman

+0

"Stamtąd możesz uzyskać dowolne informacje USB, w tym deskryptor." Próbuję dowiedzieć się, jak to zrobić. Kiedy mówisz "nadrzędne" urządzenie USB, czy to oznacza Hub, do którego podłączony jest HID? Ponieważ nawet raz mam uchwyt urządzenia USB i ścieżkę urządzenia, nie mogę uzyskać deskryptora USB. Wygląda na to, że musisz zadzwonić do DeviceIoControl przechodząc do huba i określając port, do którego jest podłączone twoje urządzenie, aby uzyskać deskryptor. Czy jest jakiś inny sposób na uzyskanie go z uchwytu instancji urządzenia USB? – Malaise