Comment obtenez-vous les données descriptives brutes d’un périphérique USB HID sous Windows?

Comment obtenez-vous les données descriptives brutes d’un périphérique HID sous Windows?

Contexte:

Je dois obtenir le fabricant, le nom du produit et le numéro de série d’un périphérique HID sous Windows. J’utilise hid.dll pour accéder aux périphériques en utilisant les fonctions vues ici . Ma question est très similaire à celle-ci . Je suis en mesure d’obtenir la chaîne du fabricant et la chaîne de produit de certains périphériques HID, mais la plupart ne parviennent pas à renvoyer ces données avec HidD_GetManufacturerSsortingng renvoyant false. Cependant, je sais que ces périphériques ont les informations de chaîne dans leurs descripteurs car je peux les voir en utilisant USBTreeView .

La chose intéressante est que, même pour les appareils qui renvoient des noms de fabricants et de produits, les valeurs que j’obtiens via hid.dll sont très différentes des valeurs que je vois en utilisant l’outil ci-dessus qui obtient les données brutes du périphérique USB.

Par exemple, un contrôleur 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_GetManufacturerSsortingng, HidD_GetProductSsortingng, and HidD_GetSerialNumberSsortingng: Description : HID-compliant game controller Product : Controller (XBOX 360 Controller for Windows) Manufacturer : FAILS Serial Number : FAILS 

WinUSB est incapable d’ouvrir ces périphériques pour récupérer ces données car ils n’utilisent pas le pilote winusb.sys.

1) Je ne comprends pas pourquoi les valeurs renvoyées par les fonctions HidD ne correspondent pas aux valeurs du descripteur USB. 2) Je ne trouve aucun moyen d’accéder aux données de descripteur USB brutes pour un périphérique HID car je ne peux pas y accéder avec WinUSB.


Edit 1:

Ok, donc j’ai appris un peu plus sur HID. Il semble que les données que je reçois via hid.dll sont des données spécifiées par le pilote, et non des données provenant du périphérique USB. HID peut également s’appliquer aux périphériques sur des transports autres que USB. Donc ça va. En fin de compte, ce que je veux vraiment savoir, c’est comment puis-je obtenir le périphérique USB lorsque j’ai le périphérique HID et quelle API dois-je utiliser pour cela. Outre WinUSB, qui ne fonctionne pas, la seule chose que je puisse trouver, ce sont les fonctions au niveau du kernel IOCTL. Je ne sais pas si cela convient à une application normale et non admin.

J’ai finalement trouvé la solution. Le principal problème était d’associer un périphérique HID à son périphérique USB parent. C’est le processus de base:

En supposant que vous avez déjà le périphérique HID et le SP_DEVINFO_DATA pour cela:

  1. Énumérez tous les périphériques USB comme vu ici .
  2. Trouvez tous les enfants des périphériques USB avec CM_GetChild et CM_GetSibling.
  3. Comparez le descripteur d’instance de périphérique HID connu (SP_DEVINFO_DATA-> DevInst) avec le descripteur d’instance de chaque périphérique enfant renvoyé par les fonctions CM afin de déterminer quel périphérique USB est le parent.
  4. De là, vous pouvez obtenir toutes les informations USB que vous souhaitez, y compris le descripteur.