Partilhar via


Comunicando-se com GenericUSBFn.sys de um serviço de modo de usuário

Todas as solicitações de modo de usuário são enviadas para o driver do 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 IOCTL (código de controle de E/S) e GenericUSBFn.sys lida com a comunicação do modo kernel com os drivers de função USB.

As IOCTLs declaradas em Genericusbfnioctl.h são usadas para se comunicar com GenericUSBFn.sys de um serviço de modo de usuário.

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:

  1. Na inicialização, o serviço escuta a chegada da interface do dispositivo da interface. 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. Há dois métodos comuns para ouvir a chegada do dispositivo:
    • Disparar inicie o 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.
  2. Depois que a interface chega, o serviço abre um identificador para o dispositivo:
    • Obtenha o nome simbólico do dispositivo chamando a função CM_Get_Device_Interface_List. Especifique o GUID da interface do dispositivo declarado no valor InterfaceGUID no Registro.
    • Depois de ter o nome simbólico do dispositivo, abra um identificador para o dispositivo usando CreateFile.
  3. Os problemas de serviço IOCTL_GENERICUSBFN_GET_CLASS_INFO recuperar informações sobre os pipes disponíveis, conforme configurado no registro.
  4. Depois que o serviço estiver pronto para se comunicar, ele emitirá IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. Depois que todos os drivers de classe forem ativados, a extensão da classe de função USB poderá se conectar ao host.
  5. Para receber notificações USB, os problemas de serviço IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Esse IOCTL é concluído quando ocorre um novo evento USB. Eventos (USBFN_EVENT) de interesse específico incluem:
  6. UsbfnEventReset: isso é usado para determinar a velocidade do dispositivo USB conectado.
  7. UsbfnEventConfigured: o serviço agora pode emitir solicitações de transferência.
  8. UsbfnEventSetupPacket: a extensão da classe de função USB recebeu um pacote de instalação específico da interface (bmRequestType.Type == BMREQUEST_CLASS). O serviço deve responder ao pacote de instalação emitindo uma solicitação de transferência no pipe 0, seguido por uma solicitação de handshake (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) na direção oposta no pipe 0.
  9. 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.