Взаимодействие с GenericUSBFn.sys из службы пользовательского режима
Все запросы в пользовательском режиме отправляются в предоставленный корпорацией Майкрософт драйвер режима ядра GenericUSBFn.sys. Вы можете создать службу пользовательского режима, которая взаимодействует с GenericUSBFn.sys путем отправки этих кодов управления вводом-выводом (IOCTL), а GenericUSBFn.sys обрабатывает взаимодействие в режиме ядра с драйверами функций USB.
Списки IOCTL, объявленные в Genericusbfnioctl.h , используются для взаимодействия с GenericUSBFn.sys из службы пользовательского режима.
Ниже описано, как определить службу интерфейса USB, которая взаимодействует с GenericUSBFn.sys для взаимодействия с драйверами функций USB.
- При запуске служба ожидает поступления интерфейса устройства. GUID интерфейса устройства — это значение InterfaceGUID, объявленное в реестре в подразделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces, определяемом изготовителем оборудования. Существует два распространенных метода прослушивания поступления устройства:
- Триггер запуска службы. Дополнительные сведения см. в разделе События триггера службы.
- Зарегистрируйтесь для получения интерфейса устройства. Дополнительные сведения см. в разделе функция CM_Register_Notification.
- После поступления интерфейса служба открывает дескриптор для устройства:
- Получите символьное имя устройства, вызвав функцию CM_Get_Device_Interface_List. Укажите GUID интерфейса устройства, объявленный в значении InterfaceGUID в реестре.
- Получив символьное имя устройства, откройте дескриптор для устройства с помощью createFile.
- Проблемы со службой IOCTL_GENERICUSBFN_GET_CLASS_INFO для получения сведений о доступных каналах, настроенных в реестре.
- Когда служба будет готова к обмену данными, она IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS. После активации всех драйверов классов расширение класса функции USB может подключиться к узлу.
- Чтобы получать уведомления ПО USB, проблемы со службой IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION. Этот IOCTL завершается при возникновении нового события USB. События (USBFN_EVENT), представляющие особый интерес, включают:
- UsbfnEventReset: используется для определения скорости подключенного USB-устройства.
- UsbfnEventConfigured. Теперь служба может выдавать запросы на передачу.
- UsbfnEventSetupPacket: расширение класса функции USB получило пакет настройки для конкретного интерфейса (bmRequestType.Type == BMREQUEST_CLASS). Служба должна ответить на пакет установки, отправив запрос на передачу в канале 0, а затем запрос на подтверждение (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) в обратном направлении на канале 0.
- После получения события UsbfnEventConfigured служба может начать выдачу запросов на передачу с помощью IOCTL_GENERICUSBFN_TRANSFER_IN, IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT и IOCTL_GENERICUSBFN_TRANSFER_OUT.