Архитектура HID

Архитектура стека драйверов HID в Windows основана на драйвере класса с именемhidclass.sys. Клиенты и транспортные мини-драйверы получают доступ к драйверу класса из пользовательского режима или режима ядра.

Драйвер класса HID

Системный драйвер класса HID — это драйвер функции WDM и драйвер шины для класса настройки устройства HID (HIDClass). Исполняемый компонент драйвера класса HID — этоhidclass.sys. Драйвер класса HID — это связуние между клиентами HID и различными транспортами. Это позволяет независимо записывать клиент HID из транспортных средств. Этот уровень абстракции позволяет клиентам продолжать работать (практически без изменений) при вводе нового стандарта или транспорта сторонних производителей.

Ниже приведено архитектурное представление.

упрощенный стек драйвера hid, показывающий клиенты hid, драйвер класса hid и компоненты транспорта hid.

На предыдущей схеме представлено следующее:

  • HID-клиенты — идентифицирует клиенты Windows и сторонние клиенты и их интерфейсы.
  • Драйвер класса HID — исполняемый файлhidclass.sys .
  • Мини-накопитель транспорта HID — определяет транспорты Windows и сторонних производителей и их интерфейсы.

Ниже приведена схема стека устройств универсального клиента HID и транспорта.

Стек устройств HID для универсального клиента HID и транспорта.

Ниже приведена еще одна схема стека устройств, показывающая коллекции клавиатуры HID и мыши через USB.

Стек hid-устройств для клавиатуры и указателя мыши по USB.

Клиенты HID

HiD-клиенты — это драйверы, службы или приложения, которые взаимодействуют с HIDClass.sys и часто представляют определенный тип устройства (например, датчик, клавиатура, мышь и т. д.). Они идентифицируют устройство с помощью идентификатора оборудования или определенной коллекции HID и взаимодействуют с коллекцией HID с помощью следующих рекомендаций.

Драйверы и приложения пользовательского режима, а также драйверы, работающие в режиме ядра, выполняют следующие действия для работы с коллекциями HID:

  • Драйверы и приложения пользовательского режима используют процедуры поддержки HIDClass (HidD_Xxx) для получения сведений о коллекции HID.
  • Драйверы в режиме ядра, драйверы пользовательского режима и приложения используют процедуры поддержки синтаксического анализа HID (HidP_Xxx), а драйверы в режиме ядра используют ioCTL драйвера класса HID для обработки отчетов HID.

В следующей таблице представлена упрощенная информация, указанная выше.

Режим драйверы, Приложения
Пользовательский режим HidD_Xxx HidP_Xxx
Режим ядра HidD_Xxx ИЛИ IOCTL_HID_xxx Н/Д

Дополнительные сведения см. в разделе Открытие коллекций HID.

Клиенты HID, поддерживаемые в Windows

Windows поддерживает следующие коллекции верхнего уровня:

Страница "Использование" Использование Windows 7 Windows 8 Windows 10 Примечания Режим доступа
0x0001 0x0001 — 0x0002 Да Да Да Драйвер класса мыши и драйвер сопоставителя Монопольная блокировка
0x0001 0x0004 — 0x0005 Да Да Да Игровые контроллеры Совмещаемая блокировка
0x0001 0x0006 — 0x0007 Да Да Да Драйвер класса клавиатуры и клавиатуры и драйвер сопоставителя Монопольная блокировка
0x0001 0x000C Нет Да Да Переключатель режима полета Совмещаемая блокировка
0x0001 0x0080 Да Да Да Системные элементы управления (питание) Совмещаемая блокировка
0x000C 0x0001 Да Да Да (для Windows 10 и Windows 10 Mobile) Элементы управления потребителем Общий (для Windows 10 и Windows 10 Mobile)
0x000D 0x0001 Да Да Да Внешнее устройство пера Монопольная блокировка
0x000D 0x0002 Да Да Да Встроенное устройство пера Монопольная блокировка
0x000D 0x0004 Да Да Да Touchscreen Монопольная блокировка
0x000D 0x0005 Нет Да Да Точность сенсорной панели (PTP) Монопольная блокировка
0x0020 *Несколько Нет Да Да Датчики Совмещаемая блокировка
0x0084 0x0004 Да Да Да Батарея HID UPS Совмещаемая блокировка
0x008C 0x0002 Нет Да (Windows 8.1 и более поздние версии) Да Сканер штрихкодов (hidscanner.dll) Совмещаемая блокировка

В предыдущей таблице режим доступа для входных клиентов HID является монопольным , чтобы предотвратить перехват или получение глобальными входными данными других клиентов HID, если они не являются целевым получателем этих входных данных. По соображениям безопасности диспетчер необработанных входных данных (RIM) открывает все такие устройства исключительно.

Если устройство открывается в монопольном режиме с помощью RIM, пользователь по-прежнему может открыть интерфейс устройства HID, не запрашивая разрешения на чтение и запись, а также получать сведения об устройстве HID с помощью процедур поддержки HIDClass (HidD_GetXxx).

Режим общего доступа позволяет нескольким приложениям получить доступ к устройству. Например, несколько приложений могут получить доступ к сканеру штрихкодов, чтобы узнать о возможностях устройства и получить статистику. Однако извлечение декодированных данных из сканера штрихкодов выполняется в монопольном режиме. Использование определяется таблицами использования USB-IF.

*Несколько: использование датчиков из 0x00 — 0xFF сегментированы для разных целей. Например, 0x10 указывает биометрический датчик; 0x40 указывает на датчик света. Эти выделения не являются непрерывными. Список использования датчиков см. в разделе Определения классов устройств USB-IF для HID. Сведения об использовании датчиков, поддерживаемых в Windows, см. в статье Использование датчиков HID.

Драйвер транспорта HID

Драйвер класса HID предназначен для использования мини-накопителей HID для доступа к аппаратному устройству ввода. Мини-диск HID абстрагирует работу устройств ввода, которые он поддерживает. Мини-драйвер HID привязывает свою работу к драйверу класса HID, регистрируясь в драйвере класса HID. Драйвер класса HID взаимодействует с мини-накопителем HID, вызывая процедуры поддержки мини-драйвера. Мини-драйвер HID, в свою очередь, отправляет сообщения по стеку драйвера к базовому драйверу шины или порта.

Транспорты HID, поддерживаемые в Windows

Список поддерживаемых транспортных средств HID см. на этой странице .

Универсальный тест HID USB в комплекте аппаратной лаборатории Windows (HLK) охватывает драйверы HidUsb и HidClass. Тест HLK для сторонних мини-драйверов HID отсутствует.