Взаимодействие с GenericUSBFn.sys из службы пользовательского режима

Все запросы в пользовательском режиме отправляются в предоставленный корпорацией Майкрософт драйвер режима ядра GenericUSBFn.sys. Вы можете создать службу пользовательского режима, которая взаимодействует с GenericUSBFn.sys путем отправки этих кодов управления вводом-выводом (IOCTL), а GenericUSBFn.sys обрабатывает взаимодействие в режиме ядра с драйверами функций USB.

Списки IOCTL, объявленные в Genericusbfnioctl.h , используются для взаимодействия с GenericUSBFn.sys из службы пользовательского режима.

Ниже описано, как определить службу интерфейса USB, которая взаимодействует с GenericUSBFn.sys для взаимодействия с драйверами функций USB.

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