Communication avec GenericUSBFn.sys à partir d’un service en mode utilisateur
Toutes les demandes en mode utilisateur sont envoyées au pilote en mode noyau fourni par Microsoft GenericUSBFn.sys. Vous pouvez créer un service en mode utilisateur qui communique avec GenericUSBFn.sys en envoyant ces codes de contrôle d’E/S (IOCTL) et GenericUSBFn.sys gère la communication en mode noyau avec les pilotes de fonction USB.
Les IOCTLs déclarés dans Genericusbfnioctl.h sont utilisés pour communiquer avec GenericUSBFn.sys à partir d’un service en mode utilisateur.
Les étapes suivantes décrivent comment définir un service d’interface USB qui interagit avec GenericUSBFn.sys pour communiquer avec les pilotes de fonction USB :
- Au démarrage, le service écoute l’arrivée de l’interface de l’appareil de l’interface. Le GUID d’interface d’appareil est la valeur InterfaceGUID qui est déclarée dans le Registre sous la sous-clé définie par OEM de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces. Il existe deux méthodes courantes pour écouter l’arrivée de l’appareil :
- Déclenchez le démarrage du service. Pour plus d’informations, consultez Événements du déclencheur de service.
- Inscrivez-vous à l’arrivée de l’interface de l’appareil. Pour plus d’informations, consultez la fonction CM_Register_Notification.
- Une fois l’interface arrivée, le service ouvre un handle sur l’appareil :
- Obtenez le nom symbolique de l’appareil en appelant la fonction CM_Get_Device_Interface_List. Spécifiez le GUID d’interface d’appareil déclaré dans la valeur InterfaceGUID dans le Registre.
- Une fois que vous avez le nom symbolique de l’appareil, ouvrez un handle sur l’appareil à l’aide de CreateFile.
- Les problèmes de service IOCTL_GENERICUSBFN_GET_CLASS_INFO pour récupérer des informations sur les canaux disponibles, comme configuré dans le Registre.
- Une fois que le service est prêt à communiquer, il a des problèmes IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. Une fois tous les pilotes de classe activés, l’extension de classe de fonction USB peut se connecter à l’hôte.
- Pour recevoir des notifications USB, les problèmes de service IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Ce IOCTL se termine lorsqu’un nouvel événement USB s’est produit. Les événements (USBFN_EVENT) d’intérêt particulier sont les suivants :
- UsbfnEventReset : permet de déterminer la vitesse du périphérique USB connecté.
- UsbfnEventConfigured : le service peut maintenant émettre des demandes de transfert.
- UsbfnEventSetupPacket : l’extension de classe de fonction USB a reçu un paquet d’installation spécifique à l’interface (bmRequestType.Type == BMREQUEST_CLASS). Le service doit répondre au paquet d’installation en émettant une demande de transfert dans le canal 0, suivie d’une demande de négociation (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) dans le sens inverse sur le canal 0.
- Une fois l’événement UsbfnEventConfigured reçu, le service peut commencer à émettre des demandes de transfert à l’aide de IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT et IOCTL_GENERICUSBFN_TRANSFER_OUT.