Comunicación con GenericUSBFn.sys desde un servicio en modo de usuario
Todas las solicitudes en modo de usuario se envían al controlador en modo kernel-mode proporcionado por Microsoft GenericUSBFn.sys. Puede crear un servicio en modo de usuario que se comunique con GenericUSBFn.sys mediante el envío de este código de control de E/S (IOCTL) y GenericUSBFn.sys controla la comunicación en modo kernel con los controladores de función USB.
Las ICTLs declaradas en Genericusbfnioctl.h se usan para comunicarse con GenericUSBFn.sys desde un servicio en modo de usuario.
En los pasos siguientes se describe cómo definir un servicio de interfaz USB que interactúa con GenericUSBFn.sys para comunicarse con los controladores de función USB:
- Al iniciarse, el servicio escucha la llegada de la interfaz de dispositivo de la interfaz. El GUID de la interfaz de dispositivo es el valor InterfaceGUID que se declara en el registro en la subclave definida por OEM de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces. Hay dos métodos comunes para escuchar la llegada del dispositivo:
- El desencadenador inicia el servicio. Para más información, consulte Eventos de desencadenador de servicio.
- Regístrese para la llegada de la interfaz de dispositivo. Para obtener más información, consulte la función CM_Register_Notification.
- Una vez que llegue la interfaz, el servicio abre un identificador para el dispositivo:
- Obtenga el nombre simbólico del dispositivo llamando a la función CM_Get_Device_Interface_List. Especifique el GUID de la interfaz de dispositivo que se declara en el valor InterfaceGUID del Registro.
- Después de tener el nombre simbólico del dispositivo, abra un identificador para el dispositivo mediante CreateFile.
- El servicio emite IOCTL_GENERICUSBFN_GET_CLASS_INFO para recuperar información sobre las canalizaciones disponibles, tal como se ha configurado en el Registro.
- Una vez que el servicio esté listo para comunicarse, emite IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. Una vez activados todos los controladores de clase, la extensión de clase de función USB puede conectarse al host.
- Para recibir notificaciones USB, el servicio emite IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Este IOCTL se completa cuando se ha producido un nuevo evento USB. Los eventos (USBFN_EVENT) de interés particular incluyen:
- UsbfnEventReset: se usa para determinar la velocidad del dispositivo USB conectado.
- UsbfnEventConfigured: el servicio ahora puede emitir solicitudes de transferencia.
- UsbfnEventSetupPacket: la extensión de clase de función USB ha recibido un paquete de instalación específico de la interfaz (bmRequestType.Type == BMREQUEST_CLASS). El servicio debe responder al paquete de instalación mediante la emisión de una solicitud de transferencia en la tubería 0, seguida de una solicitud de protocolo de enlace (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) en la dirección opuesta en la tubería 0.
- Una vez recibido el evento UsbfnEventConfigured, el servicio puede empezar a emitir solicitudes de transferencia mediante IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT y IOCTL_GENERICUSBFN_TRANSFER_OUT.