Comunicazione con GenericUSBFn.sys da un servizio in modalità utente

Tutte le richieste in modalità utente vengono inviate al driver in modalità kernel fornito da Microsoft GenericUSBFn.sys. È possibile creare un servizio in modalità utente che comunica con GenericUSBFn.sys inviando il codice di controllo I/O (IOCTL) e GenericUSBFn.sys gestisce la comunicazione in modalità kernel con i driver di funzione USB.

Gli IOCTLs dichiarati in Genericusbfnioctl.h vengono usati per comunicare con GenericUSBFn.sys da un servizio in modalità utente.

La procedura seguente descrive come definire un servizio di interfaccia USB che interagisce con GenericUSBFn.sys per comunicare con i driver di funzione USB:

  1. All'avvio, il servizio ascolta l'arrivo dell'interfaccia del dispositivo dell'interfaccia. Il GUID dell'interfaccia del dispositivo è il valore InterfaceGUID dichiarato nel Registro di sistema nella sottochiave definita dall'OEM di HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces. Esistono due metodi comuni per l'ascolto dell'arrivo del dispositivo:
    • Avviare il servizio. Per altre informazioni, vedere Eventi di trigger del servizio.
    • Registrare l'arrivo dell'interfaccia del dispositivo. Per altre informazioni, vedere la funzione CM_Register_Notification.
  2. Al termine dell'arrivo dell'interfaccia, il servizio apre un handle al dispositivo:
    • Ottenere il nome simbolico per il dispositivo chiamando la funzione CM_Get_Device_Interface_List. Specificare il GUID dell'interfaccia del dispositivo dichiarato nel valore InterfaceGUID nel Registro di sistema.
    • Dopo aver ottenuto il nome simbolico per il dispositivo, aprire un handle al dispositivo usando CreateFile.
  3. I problemi del servizio IOCTL_GENERICUSBFN_GET_CLASS_INFO per recuperare informazioni sulle pipe disponibili, come configurato nel Registro di sistema.
  4. Dopo che il servizio è pronto a comunicare, genera problemi IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. Dopo l'attivazione di tutti i driver di classe, l'estensione della classe di funzione USB può connettersi all'host.
  5. Per ricevere notifiche USB, i problemi del servizio IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Questo IOCTL viene completato quando si è verificato un nuovo evento USB. Gli eventi (USBFN_EVENT) di particolare interesse includono:
  6. UsbfnEventReset: viene usato per determinare la velocità del dispositivo USB connesso.
  7. UsbfnEventConfigured: il servizio può ora inviare richieste di trasferimento.
  8. UsbfnEventSetupPacket: l'estensione della classe di funzione USB ha ricevuto un pacchetto di installazione specifico dell'interfaccia (bmRequestType.Type == BMREQUEST_CLASS). Il servizio deve rispondere al pacchetto di installazione eseguendo una richiesta di trasferimento nella pipe 0, seguita da una richiesta handshake (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) nella direzione opposta sulla pipe 0.
  9. Dopo aver ricevuto l'evento UsbfnEventConfigured, il servizio può iniziare a inviare richieste di trasferimento usando IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT e IOCTL_GENERICUSBFN_TRANSFER_OUT.