20 Stimmen

Erstellen eines virtuellen USB-Geräts

Ich bin ein Neuling, der lernt, wie man WDM-Gerätetreiber für USB-Geräte schreibt, und fand, dass die verfügbaren Materialien alle zu schwer zu verstehen sind (das DDK-Online-Dokument ist eines der schwierigsten zu lesen, und das WDM-Gerätetreiber-Buch von Oney ist auch nicht besser).

Also, ich habe eine einfache Frage. Wo fange ich an, wenn ich ein virtuelles USB-Gerät (z. B. eine virtuelle USB-Maus, die wie eine echte USB-Maus aussieht, die an einen USB-Anschluss angeschlossen ist) zum Testen/Lernen erstellen möchte.

Soweit ich weiß, hat der HIDClass-Treiber (hidclass.sys) einen Minitreiber für den USB-Bus (hidusb.sys), der die Aufzählung der angeschlossenen USB-Hardware vornimmt. Wenn ich also den Hardware-Aufzählungsprozess entführen und meine eigene virtuelle Hardware erstellen möchte, sollte ich irgendwo einen Filtertreiber einfügen, um einige IRPs im Zusammenhang mit dem Hardware-Aufzählungsprozess abzufangen?

Es tut mir leid, wenn das oben genannte überhaupt keinen Sinn macht, da ich immer noch in der Lernphase bin und dies ist eigentlich eine der Übungen, von denen ich denke, dass sie mir helfen könnten, besser über das Schreiben von USB-Gerätetreibern zu lernen.

24voto

Alex.Salnikov Punkte 386

Windows verwendet eine Plug-and-Play-Architektur. Wenn Sie ein USB-Gerät anschließen, sendet es eine Low-Level-USB-Anfrage an das Gerät und entscheidet dann anhand der Antwort des Geräts, welcher Treiber geladen werden soll. Die Zuordnung erfolgt durch den Vergleich von Hersteller-ID, Produkt-ID usw. mit den Abschnitten der Inf-Dateien. Die Treiber werden in Form einer kompilierten xxx.sys mit xxx.inf-Datei in den Kernel geladen. Windows entscheidet anhand der *.inf-Datei, die mit dem Gerätetreiber geliefert wird, welche xxx.sys geladen werden soll.

Diese Dateien enthalten Abschnitte wie diesen:

[Manufacturer]
%Manufacturer% = DeviceInstall

[DeviceInstall]
"some usb dev"=OTHER_SECTION_DEV, USB\Vid_XXXX&Pid_yyyy

# This is where windows learns to match this information
# to your device, using the product id (Pid) and the 
# vendor id (Vid) that Windows gets back during the
# low level USB DeviceDescriptor request

[OTHER_SECTION_DEV]
CopyFiles = xxx.sys, 10,system32\drivers

(eine ausführlichere Beschreibung des Inhalts von inf Dateien finden Sie auf https://docs.microsoft.com/en-us/Windows-hardware/drivers/install/inf-manufacturer-section )


Ein detaillierter Blick auf den USB-Aufzählungsprozess (USB Logger verwenden):

  • USB-Gerät eingesteckt
  • USB-Bus-Treiber-Anforderung
    • GetDescriptor(Gerät)
    • GetDescriptor(Konfiguration)
    • GetDescriptor(String iSerialNumber), verwendet als Device Instance ID
    • GetDescriptor(String iProduct), verwendet in den "Neue Hardware wurde identifiziert"-Popups
  • Der PNP (Plug and Play) Manager wird darüber informiert, dass ein Gerät von den Bustreibern hinzugefügt wurde.
  • Der PNP-Manager fragt dann den Bustreiber mit einer PNP-Anfrage nach Geräteinformationen:
    • DeviceID-String, der die USB-Hersteller- und Produkt-ID darstellt,
    • HardwareIDs Zeichenfolge,
    • CompatibleIDs-String, der die Schnittstellenklasse, die Unterklasse und das Protokoll des USB-Geräts angibt, und
    • InstanceID-String, der die uid für dieses spezielle Gerät innerhalb der Menge aller Instanzen mit der gleichen kompatiblen id darstellt, die an den Computer angeschlossen sind.

Für jedes angeschlossene USB-Gerät können Sie diese Zeichenfolgen im Geräte-Manager sehen:

  • Öffnen Sie den Geräte-Manager (Windows-Menü -> "Geräte-Manager" oder Systemsteuerung -> "System" -> "Hardware" -> "Geräte-Manager")
  • wechseln Sie dann über das Menü "Ansicht" zu "Gerät nach Verbindung".
  • öffnen Sie "ACPI [...]" -> "PCI-Bus"/"PCI Express Root Complex" -> "[...] USB [...] Host Controller"
  • Erweitern Sie einen der Einträge unter dem Host-Controller und klicken Sie auf eines der aufgelisteten Geräte mit der rechten Maustaste, um die Eigenschaften aufzurufen. Öffnen Sie die Registerkarte "Details" und verwenden Sie dann das Pulldown-Menü für die Eigenschaften, um "Hardware Ids", "Compatible Ids", "Device Instance ID", "Matching Device Id", "Service" usw. zu finden.

Ich habe zum Beispiel ein USB-Speichergerät mit Device Id = usb\class_08&subclass_06&prot_50 angeschlossen, und diese Zeichenfolge kann mit einer .inf Datei, die nach der ersten Aufzählung zur Liste der bekannten Geräte hinzugefügt wurde. Diese Datei hat eine Zeichenkette Service = USBSTOR und so wissen wir, dass usbstor.sys wird zur Verbindung mit diesem USB-Massenspeichergerät verwendet.

Lassen Sie uns mit dem Abgleich fortfahren.

  • Der PNP-Manager versucht festzustellen, ob das Device bereits "installiert" wurde:
    • Er sucht in der Registrierung nach einem Schlüssel, der mit der "DeviceInstance ID" übereinstimmt, um festzustellen, welcher Dienst die Verbindung zu diesem Gerät herstellt. Genauer gesagt, sucht es nach diesem Schlüssel in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

Für Diskette auf Taste können Sie etwas wie sehen:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3]
"Service"="USBSTOR"
  • Der PNP-Manager lädt dann den zugehörigen Treiber auf der Grundlage einer Übereinstimmung zwischen den Zeichenketten in den PNP-Anfragen und den Daten aus der .inf-Datenbank:
    • inf-Datenbank, zu finden unter: C:\WINDOWS\inf\
    • Treiber .sys-Dateien befinden: C:\WINDOWS\system32\drivers
  • Wenn PNP keine passende Zeichenkette finden kann, werden Sie aufgefordert, den Pfad zu xxx.sys und xxx.inf anzugeben

Für schreibende Fahrer ist mein Ratschlag:

  1. Beginnen Sie nicht mit der Implementierung von HID-Geräten (Human Interface Device), da Sie Windows dazu veranlassen können, Ihren benutzerdefinierten Treiber für Ihre Maus oder Tastatur anstelle des Originaltreibers zu verwenden, wodurch Ihre Maus oder Tastatur deaktiviert wird, was sehr gefährlich ist.
  2. Laden Sie keine Treiber auf Ihren Entwicklungsrechner:
    1. Verwenden Sie eine virtuelle Maschine und installieren Sie Ihre Treiber dort. Richten Sie einen Kernel-Debugger für Ihre virtuelle Maschine ein: http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. oder Treiber auf einem anderen Testrechner laden.
  3. Eine gute Lernplattform für USB-Treiber ist das "OSR USB-FX2 Learning Kit".

5voto

Amir Saniyan Punkte 12082

Verwenden Sie Device Simulation Framework (DSF).

http://msdn.microsoft.com/en-us/library/Windows/hardware/gg454516.aspx

3voto

Yaron Shani Punkte 156

Sie können das USB/IP-Projekt verwenden, um jedes beliebige Gerät zu emulieren. In meinem Blog habe ich gezeigt, wie man eine USB-Maus in Python mit dem USB/IP-Projekt emuliert: http://breaking-the-system.blogspot.com/2014/08/emulating-usb-devices-in-python-with-no.html

Es wird Ihnen nicht helfen zu verstehen, wie man das virtuelle USB-Gerät erstellt (der Prozess wird im USB/IP-Treiber durchgeführt, Sie können den Code lesen), aber es wird das virtuelle USB-HID-Gerät erstellen und Sie können mit den HID-Argumenten spielen, die an den USB-Treiber gesendet werden.

1voto

Simon Richter Punkte 27154

Wäre es nicht sinnvoller, einen eigenen Bustyp und Enumerator bereitzustellen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X