Share via


Kommunikation mit GenericUSBFn.sys über einen Benutzermodusdienst

Alle Benutzermodusanforderungen werden an den von Microsoft bereitgestellten Kernelmodustreiber GenericUSBFn.sys gesendet. Sie können einen Benutzermodusdienst erstellen, der mit GenericUSBFn.sys kommuniziert, indem Sie diesen E/A-Steuerungscode (IOCTL) senden, und GenericUSBFn.sys die Kommunikation im Kernelmodus mit den USB-Funktionstreibern übernimmt.

Die in Genericusbfnioctl.h deklarierten IOCTLs werden für die Kommunikation mit GenericUSBFn.sys aus einem Benutzermodusdienst verwendet.

In den folgenden Schritten wird beschrieben, wie Sie einen USB-Schnittstellendienst definieren können, der mit GenericUSBFn.sys interagiert, um mit den USB-Funktionstreibern zu kommunizieren:

  1. Beim Start lauscht der Dienst auf die Geräteschnittstelle der Schnittstelle. Die Geräteschnittstellen-GUID ist der InterfaceGUID-Wert, der in der Registrierung unter dem OEM-definierten Unterschlüssel von HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces deklariert wird. Es gibt zwei gängige Methoden zum Lauschen auf die Geräteeinkünfte:
    • Lösen Sie den Start des Diensts aus. Weitere Informationen finden Sie unter Diensttriggerereignisse.
    • Registrieren Sie sich für die Geräteschnittstelle. Weitere Informationen finden Sie in der funktion CM_Register_Notification.
  2. Nachdem die Schnittstelle eingetroffen ist, öffnet der Dienst ein Handle für das Gerät:
    • Rufen Sie den symbolischen Namen für das Gerät ab, indem Sie die funktion CM_Get_Device_Interface_List aufrufen. Geben Sie die Geräteschnittstellen-GUID an, die im InterfaceGUID-Wert in der Registrierung deklariert ist.
    • Nachdem Sie über den symbolischen Namen für das Gerät verfügen, öffnen Sie mithilfe von CreateFile ein Handle für das Gerät.
  3. Der Dienst gibt IOCTL_GENERICUSBFN_GET_CLASS_INFO aus, um Informationen zu den verfügbaren Pipes abzurufen, wie in der Registrierung konfiguriert.
  4. Nachdem der Dienst für die Kommunikation bereit ist, gibt er IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS aus. Nachdem alle Klassentreiber aktiviert wurden, kann die USB-Funktionsklassenerweiterung eine Verbindung mit dem Host herstellen.
  5. Um USB-Benachrichtigungen zu erhalten, stellt der Dienst probleme IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Diese IOCTL wird abgeschlossen, wenn ein neues USB-Ereignis aufgetreten ist. Ereignisse (USBFN_EVENT) von besonderem Interesse sind:
  6. UsbfnEventReset: Dies wird verwendet, um die Geschwindigkeit des angeschlossenen USB-Geräts zu bestimmen.
  7. UsbfnEventConfigured: Der Dienst kann jetzt Übertragungsanforderungen ausstellen.
  8. UsbfnEventSetupPacket: Die USB-Funktionsklassenerweiterung hat ein schnittstellenspezifisches Setuppaket (bmRequestType.Type == BMREQUEST_CLASS) erhalten. Der Dienst sollte auf das Setuppaket antworten, indem er eine Übertragungsanforderung in Pipe 0 ausgibt, gefolgt von einer Handshakeanforderung (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) in umgekehrter Richtung auf Pipe 0.
  9. Nachdem das UsbfnEventConfigured-Ereignis empfangen wurde, kann der Dienst mit der Ausgabe von Übertragungsanforderungen mithilfe von IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT und IOCTL_GENERICUSBFN_TRANSFER_OUT beginnen.