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:
- 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.
- Laden Sie keine Treiber auf Ihren Entwicklungsrechner:
- 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
- oder Treiber auf einem anderen Testrechner laden.
- Eine gute Lernplattform für USB-Treiber ist das "OSR USB-FX2 Learning Kit".