Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Todas as solicitações de modo de usuário são enviadas para o driver de modo kernel fornecido pela Microsoft GenericUSBFn.sys. Você pode criar um serviço de modo de usuário que se comunica com GenericUSBFn.sys enviando esses códigos de controle de E/S (IOCTL) e GenericUSBFn.sys lida com a comunicação de modo kernel com os drivers de função USB.
Os IOCTLs declarados em Genericusbfnioctl.h são usados para comunicarem-se com GenericUSBFn.sys a partir de um serviço em modo utilizador.
As etapas a seguir descrevem como você pode definir um serviço de interface USB que interage com GenericUSBFn.sys para se comunicar com os drivers de função USB:
- Na inicialização, o serviço aguarda a chegada da interface do dispositivo. O GUID da interface do dispositivo é o valor InterfaceGUID declarado no registro sob a subchave definida pelo OEM de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces. Existem dois métodos comuns para ouvir a chegada do dispositivo:
- Acione o início do serviço. Para obter mais informações, consulte Eventos de gatilho de serviço.
- Registre-se para a chegada da interface do dispositivo. Para obter mais informações, consulte a função CM_Register_Notification.
- Depois que a interface chega, o serviço abre uma alça para o dispositivo:
- Obtenha o nome simbólico para o dispositivo chamando a função CM_Get_Device_Interface_List. Especifique o GUID da interface do dispositivo declarado no valor InterfaceGUID no registo.
- Depois de ter o nome simbólico para o dispositivo, abra um identificador para o dispositivo usando "CreateFile".
- O serviço emite IOCTL_GENERICUSBFN_GET_CLASS_INFO para recuperar informações sobre os canais disponíveis, conforme configurado no registo.
- Depois que o serviço está pronto para se comunicar, ele emite IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. Depois que todos os controladores de classe são ativados, a extensão de classe para funções USB pode conectar-se ao host.
- Para receber as notificações USB, o serviço emite IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. O IOCTL é concluído quando ocorre um novo evento USB. Os eventos (USBFN_EVENT) de particular interesse incluem:
- UsbfnEventReset: é usado para determinar a velocidade do dispositivo USB conectado.
- UsbfnEventConfigured: O serviço agora pode emitir solicitações de transferência.
- UsbfnEventSetupPacket: A extensão de classe da função USB recebeu um pacote de configuração específico para a interface (bmRequestType.Type == BMREQUEST_CLASS). O serviço deve responder ao pacote de configuração emitindo uma solicitação de transferência no canal 0, seguida por uma solicitação de handshake (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) na direção oposta no canal 0.
- Depois que o evento UsbfnEventConfigured for recebido, o serviço poderá começar a emitir solicitações de transferência usando IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT e IOCTL_GENERICUSBFN_TRANSFER_OUT.