# usbshare — USB-Filtertreiber für Windows Ein KMDF-Upper-Filtertreiber, der Userspace-Zugriff auf ein USB-Gerät ermöglicht, **ohne** den vorhandenen Gerätetreiber zu ersetzen. Das ist der Ansatz, den VirtualHere verwendet, und der Grund, warum es dort kein Zadig braucht und das Gerät lokal funktionsfähig bleibt. > ## Lies das zuerst > > **Dieser Code ist nie gelaufen.** Ich habe ihn geschrieben, aber weder > kompiliert noch getestet — dafür braucht es Windows mit dem WDK, und das > stand mir nicht zur Verfügung. Er ist als Ausgangspunkt gedacht, nicht als > fertiges Produkt. > > Kernel-Code verzeiht nichts: ein Fehler ist ein Bluescreen, kein > Stacktrace. Ein Treiber, der beim Booten geladen wird und dabei abstürzt, > kann ein System unbootbar machen. **Teste ausschließlich in einer VM mit > Snapshot**, bis er stabil läuft. > > Rechne mit mehreren Runden Debugging. Die Struktur sollte stimmen, die > Details fast sicher nicht. ## Warum ein Filtertreiber Windows hat kein Äquivalent zu Linux' usbdevfs. Um URBs an ein Gerät zu senden, braucht es Kernel-Code. Die Alternativen: | Ansatz | Gerät lokal nutzbar | Installation | HID/Massenspeicher | |--------|---------------------|--------------|--------------------| | WinUSB | Nein — ersetzt den Treiber | Zadig, pro Gerät | Meist blockiert | | **Filtertreiber** | **Ja** | INF, pro Gerät oder klassenweit | Ja | Der Filter setzt sich *über* den vorhandenen Treiber in den Stack. Im Normalbetrieb reicht er alles unverändert durch. Erst wenn Userspace ein Gerät beansprucht, fängt er die IRPs des Klassentreibers ab und leitet stattdessen die URBs aus dem Userspace an den USB-Hub weiter. ``` Ohne Beanspruchung Während des Teilens ┌────────────────────┐ ┌────────────────────┐ │ Klassentreiber │ │ Klassentreiber │ │ (usbhid, usbstor) │ │ (bekommt nichts) │ └─────────┬──────────┘ └─────────┬──────────┘ │ ╳ abgefangen ┌─────────▼──────────┐ ┌─────────▼──────────┐ │ usbshare (Filter) │ │ usbshare (Filter) │◄── usb-client └─────────┬──────────┘ └─────────┬──────────┘ via IOCTL │ durchgereicht │ URBs ┌─────────▼──────────┐ ┌─────────▼──────────┐ │ USB-Hub-Treiber │ │ USB-Hub-Treiber │ └────────────────────┘ └────────────────────┘ ``` ## Dateien | Datei | Inhalt | |-------|--------| | `driver.c` | Treiber-Einstieg, Geräte-Hinzufügen, PnP | | `queue.c` | IOCTL-Verarbeitung, URB-Weiterleitung | | `filter.c` | Abfangen der Klassentreiber-Anfragen im beanspruchten Zustand | | `usbshare.h` | Interne Strukturen | | `public.h` | IOCTL-Schnittstelle — auch von der Go-Seite verwendet | | `usbshare.inf` | Installationsdatei | | `usbshare.vcxproj` | Visual-Studio-Projekt | ## Bauen Voraussetzungen: Visual Studio 2022 mit „Desktop development with C++", Windows SDK und [WDK](https://learn.microsoft.com/windows-hardware/drivers/download-the-wdk). ```cmd msbuild usbshare.vcxproj /p:Configuration=Release /p:Platform=x64 ``` ## Testen (nur in einer VM) ```cmd :: Testsignierung erlauben — danach neu starten bcdedit /set testsigning on bcdedit /set nointegritychecks on :: Selbst signieren makecert -r -pe -ss PrivateCertStore -n "CN=usbshare-test" test.cer signtool sign /v /s PrivateCertStore /n usbshare-test /t http://timestamp.digicert.com usbshare.sys :: Installieren: Rechtsklick auf usbshare.inf → Installieren, dann Gerät neu einstecken ``` Für Kernel-Debugging: zweite Maschine oder Host mit WinDbg, verbunden über `bcdedit /debug on` und `/dbgsettings net`. ## Verteilen Für den Einsatz außerhalb einer Testmaschine muss der Treiber von Microsoft gegengezeichnet sein. Dafür brauchst du: 1. **EV-Code-Signing-Zertifikat** — auf eine geprüfte reale Identität (Firma oder Einzelperson), etwa 300–500 €/Jahr, Ausstellung dauert Tage bis Wochen wegen der Identitätsprüfung. 2. **Microsoft-Partner-Center-Konto**, verifiziert mit demselben Zertifikat. 3. **Attestation Signing**: Treiber hochladen, Microsoft zeichnet gegen. Ausreichend für die meisten Fälle; volle WHQL-Zertifizierung braucht zusätzlich HLK-Testläufe. Diesen Teil kann nur jemand mit einer realen Identität erledigen — er läuft auf deinen Namen, nicht auf meinen. Das ist die eigentliche Hürde, nicht der Code. ## Was fehlt Der Treiber deckt Control-, Bulk- und Interrupt-Transfers ab. Nicht implementiert: - **Isochrone Transfers** (Webcams, Audio). Sie brauchen eine andere URB-Struktur mit Paketdeskriptoren und Bandbreitenreservierung. - **Auswahl der Konfiguration/Alt-Settings** über den Filter — derzeit wird die vom Klassentreiber gesetzte übernommen. - **Reset und Halt-Clear** sind angelegt, aber ungetestet.