2009-04-06 10 views
2

Viele USB-Geräte enthalten eine eindeutige Seriennummer (die eigentlich eine Unicode-Zeichenfolge ist), die der Host in Verbindung mit den 16-Bit-Hersteller- und Produkt-ID-Nummern verwenden kann Gerät.Abrufen der Seriennummer einer USB-Tastatur unter Windows

Ich versuche herauszufinden, wie man eine Windows-Anwendung schreibt, die in der Lage wäre, eine Liste aller an das System angeschlossenen USB-Human-Interface-Geräte anzuzeigen. Die Liste würde für jede HID eine Zeile enthalten, einschließlich der Systemtastaturen. In der Liste würden Spalten für die Hersteller-ID, die Produkt-ID und die Seriennummer stehen.

Ich kann eine Liste von USB-HIDs erhalten, indem durch wiederholten Aufruf SetupDiEnumDeviceInterfacesSetupDiGetClassDevs mit der GUID zurückgegeben von HidD_GetHidGuid und Schleife durch das Ergebnis aufrufen. Ich kann dann SetupDiGetDeviceInterfaceDetail anrufen, um den Pfad zu jedem Gerät zu bekommen, das ich mit CreateFile öffnen kann, solange ich vorsichtig bin, keine Lese- oder Schreibberechtigung zu fordern, die für eine Systemtastatur verweigert würde. Von dort kann ich die Hersteller- und Produkt-ID-Nummern abrufen, indem ich HidD_GetAttributes aufrufen.

Was ich habe Probleme herauszufinden, ist, wie die Seriennummer Zeichenfolge abrufen. Wenn ich nach Lösungen für dieses Problem suche, finde ich eine Menge Informationen darüber, wie man Seriennummern für USB-Massenspeichergeräte bekommt, aber nichts, was so aussieht, könnte für irgendeinen anderen Typ von USB-Gerät gelten. Ich wäre glücklich, entweder eine generische Methode oder eine HID-spezifische Methode zum Abrufen der Seriennummer String zu entdecken.

Ich habe das Gefühl, dass die Win32-Port libusb dies ohne allzu viel Mühe verwalten könnte, aber leider muss ich eine Lösung, die nur auf Bibliotheken abhängt, die mit Windows kommen, wie die setupapi und hid DLLs, die die Funktionen enthalten, erwähnt über.

Alle Vorschläge würden sehr geschätzt werden!

Antwort

3

Haben Sie den USBVIEW-Quellcode ausprobiert, der mit dem DDK mitgeliefert wird. Das USBView-Tool zeigt die Seriennummer für jedes USB-Gerät an und die Quelle wird mit dem DDK ausgeliefert.

0

Haben Sie versucht, nach der Dokumentation der HID-Definition von Eingabedatensätzen, Ausgabedatensätzen und Funktionsdatensätzen für Hid-Tastaturen zu suchen. Dies sollte Ihnen die Liste der "Dinge" zeigen, die Sie über HID aus einer Tastatur herausholen können.

Auch ich weiß, dass es möglich ist, die HID-Datensatzdefinition per Software aufzuzählen. Ich habe vor ungefähr einem Jahr etwas Ähnliches gemacht, aber ich kann mich nicht mehr an die Details erinnern. Auf diese Weise können Sie sehen, was die USB-Klasse der Tastatur als Standardschnittstelle veröffentlicht.

Ich hoffe, es kann Ihnen ein paar Hinweise, um herauszufinden, was Sie suchen. Entschuldigung, ich könnte nicht genauer sein!

+0

Leider ist ein USB-String-Deskriptor weder ein HID-Eingabebericht noch ein Ausgabebericht oder ein Featurebericht. Trotzdem danke! – zaphod

0

Ich empfehle dieses Buch USB Complete. Kapitel 4 Aufzählung: Wie der Host von Geräten lernt, enthält die Informationen, die Sie benötigen.

This page enthält viele Links zu Informationen und Links zu Bibliotheken und Dienstprogrammen, die Sie verwenden können.

+0

Es ist ein großartiges Buch - ich besitze eine Kopie der dritten Ausgabe, und ich bin mir sicher, dass ich nie so weit gekommen wäre, diese Frage überhaupt zu stellen, wenn ich sie nicht gelesen hätte. Das fragliche Kapitel erwähnt tatsächlich die Informationen, die ich abrufen möchte, obwohl es nicht zu erklären scheint, wie man es von einer Windows-Anwendung bekommt. – zaphod

4

Es stellt sich heraus, dass HID.dll eine Funktion namens HidD_GetSerialNumberString definiert, die genau das tut, was ich will, gegeben den Griff, den ich von CreateFile wie oben beschrieben bekommen habe. Habe es einfach ausprobiert und es funktioniert super.Es gibt auch HidD_GetManufacturerString und HidD_GetProductString Funktionen zum Abrufen der anderen Zeichenfolgedeskriptoren, auf die im Gerätedeskriptor Bezug genommen wird, und sogar eine , um einen beliebigen Stringdeskriptor mit seinem Index zu erhalten (vermutlich, weil der HID-Deskriptor String-Deskriptorindizes enthalten darf). Ich fühle mich jetzt ziemlich albern - die Antwort war die ganze Zeit direkt unter meiner Nase.

Vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage zu lesen und zu beantworten! Ich werde Alphaneos Antwort akzeptieren, da es ziemlich vielversprechend klingt, und tatsächlich habe ich auf den Download des DDK gewartet, als ich auf diese Antwort gestoßen bin.

0

können Sie GetVolumeInformation verwenden, um die Seriennummer einer beliebigen Hardware zu erhalten.

Verwandte Themen