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:
- 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.
- 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.
- Der Dienst gibt IOCTL_GENERICUSBFN_GET_CLASS_INFO aus, um Informationen zu den verfügbaren Pipes abzurufen, wie in der Registrierung konfiguriert.
- 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.
- 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:
- UsbfnEventReset: Dies wird verwendet, um die Geschwindigkeit des angeschlossenen USB-Geräts zu bestimmen.
- UsbfnEventConfigured: Der Dienst kann jetzt Übertragungsanforderungen ausstellen.
- 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.
- 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.