Мини-драйверы и драйвер класса HID

В этой статье описываются мини-драйверы и драйвер класса HID.

Дополнительные сведения см. в статье Создание мини-драйверов WDF HID.

Операционные функции драйвера класса HID

Драйвер класса HID выполняет следующие операции:

  • Предоставляет интерфейс верхнего уровня, который используют драйверы в режиме ядра и приложения пользовательского режима для доступа к коллекциям HID , поддерживаемым устройством ввода, и управляет им.

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

    Интерфейс верхнего уровня для коллекций HID состоит из ioCTL драйвера класса HID, подпрограмм поддержки HIDClass и структур HIDClass.

  • Взаимодействует с мини-накопителем HID, вызывая стандартные процедуры драйвера мини-драйвера.

  • Создает объект функционального устройства (FDO) для устройств ввода HIDClass, перечисляемых драйвером шины более низкого уровня или порта.

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

  • Предоставляет функциональные возможности драйвера шины для дочерних устройств (коллекций HID), поддерживаемых базовым устройством ввода.

    Драйвер класса HID создает объект физического устройства (PDO) для каждой коллекции HID, поддерживаемой устройством ввода, и управляет операцией коллекции.

Привязка мини-драйвера к HIDClass

Мини-драйвер HID привязывает свою работу к драйверу класса HID, вызывая HidRegisterMinidriver для регистрации в драйвере класса HID. Операция регистрации:

  • Сохраняет копию точек входа (указателей) на стандартные процедуры драйвера мини-драйвера HID в расширении устройства драйвера класса HID.

    Мини-драйвер HID задает свои точки входа в объекте драйвера, который мини-диск получает в качестве входных данных для своей DRIVER_INITIALIZE подпрограммы. Мини-драйвер HID задает эти точки входа перед регистрацией в драйвере класса HID.

  • Сбрасывает точки входа в объекте драйвера мини-накопителя до точек входа для стандартных процедур драйвера, предоставляемых драйвером класса HID.

Драйвер класса HID предоставляет следующие стандартные процедуры драйвера:

Процесс регистрации также выделяет память для расширения устройства HID Mind River. Хотя память выделяется драйвером класса HID, только мини-драйвер HID использует это расширение устройства.

Взаимодействие с мини-накопителем HID

Драйвер класса HID взаимодействует с мини-драйвером HID, вызывая процедуры DRIVER_ADD_DEVICE, DRIVER_UNLOAD и диспетчеризации мини-драйвера HID следующим образом:

Вызов процедуры AddDevice

При вызове подпрограммы AddDevice драйвера класса HID для создания функционального объекта устройства (FDO) драйвер класса HID создает FDO, инициализирует его и вызывает подпрограмму AddDevice мини-драйвера HID. Подпрограмма HiD minidriver AddDevice выполняет внутреннюю инициализацию для конкретного устройства и в случае успешного выполнения возвращает STATUS_SUCCESS. Если подпрограмма AddDevice мини-драйвера HID не выполнена, драйвер класса HID удаляет FDO и возвращает состояние, возвращенное подпрограммой AddDevice мини-драйвера HID.

Вызов подпрограммы unload

При вызове подпрограммы unload драйвера класса HID драйвер класса HID завершает освобождение всех ресурсов, связанных с FDO, и вызывает подпрограмму выгрузки мини-драйвера HID.

Вызов подпрограмм dispatch

Для работы с устройством драйвер класса HID в основном вызывает подпрограмму диспетчеризации мини-накопителя HID для внутренних запросов на управление устройством.

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

Драйвер класса HID не отправляет следующие запросы к мини-накопителю HID: создание, закрытие или управление устройством.

Работа мини-драйвера HID

Транспортная мини-отвертка HID абстрагирует работу аппаратной шины или порта, к которому подключается устройство ввода.

Мини-накопители HID можно создавать с помощью одной из следующих платформ:

  • UMDF — платформа драйвера пользовательского режима
  • KDMF — платформа драйвера режима ядра
  • WDF — Платформа драйверов Windows
  • WDM — модель драйвера Windows (устаревшая версия)

Корпорация Майкрософт рекомендует использовать решение на основе платформ (KMDF или UMDF). Дополнительные сведения о каждой из моделей драйверов см. в следующих разделах:

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

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

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

Регистрация мини-драйвера HID

После того как мини-драйвер HID завершает инициализацию всех остальных драйверов в своей процедуре DRIVER_INITIALIZE , мини-драйвер HID привязывает свою работу к драйверу класса HID, вызывая HidRegisterMinidriver.

Когда мини-драйвер HID регистрируется в драйвере класса HID, он использует структуру HID_MINIDRIVER_REGISTRATION . Структура определяет следующее:

  • Редакция HID
  • Объект драйвера мини-драйвера HID
  • Размер расширения мини-драйвера HID
  • Опрошено ли устройство

Расширение мини-драйвера HID

Расширение мини-накопителя HID предназначено для конкретного устройства и используется только мини-накопителем HID. Драйвер класса HID выделяет память для расширения устройства minidriver, когда драйвер класса создает расширение устройства для функционального объекта устройства (FDO). Мини-драйвер HID указывает размер расширения устройства при регистрации мини-драйвера класса HID. Размер определяется элементом DeviceExtensionSizeструктуры HID_MINIDRIVER_REGISTRATION .

Использование структуры HID_DEVICE_EXTENSION

Мини-драйвер HID должен использовать структуру HID_DEVICE_EXTENSION в качестве макета расширения устройства, созданного драйвером класса HID для функционального объекта устройства (FDO). Драйвер класса HID задает члены этой структуры при инициализации FDO. Мини-диск HID не должен изменять сведения в этой структуре.

Структура HID_DEVICE_EXTENSION содержит следующие элементы:

  • PhysicalDeviceObject — это указатель на объект физического устройства (PDO), представляющий базовое устройство ввода.

  • NextDeviceObject — это указатель на верхнюю часть стека устройств под FDO.

  • MiniDeviceExtension — это указатель на расширение устройства hid minidriver.

При указании указателя на FDO устройства ввода следующий макрос GET_MINIDRIVER_DEVICE_EXTENSION возвращает указатель на расширение hid minidriver:

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

PDEVICE_EXTENSION — это указатель на расширение устройства, объявленное мини-накопителем HID.

Аналогичным образом мини-диск HID может получить указатель на PDO устройства ввода и верхнюю часть стека устройств под FDO устройства ввода.

Когда мини-накопитель HID отправляет IRP в стек устройства, он должен использовать NextDeviceObject в качестве целевого объекта устройства.

Стандартные процедуры для мини-драйверов

Мини-драйвер HID должен предоставлять следующие стандартные процедуры поддержки драйверов:

  • HiD minidriver DriverEntry routine
  • Мини-диск HID: добавлениеприложение процедуры устройства
  • Процедура выгрузки мини-драйвера HID

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

Подпрограмма DriverEntry

Подпрограмма DRIVER_INITIALIZE в мини-накопителе HID выполняет следующие действия:

  • Создает объект драйвера для связанной пары драйверов (драйвер класса HID и мини-драйвер HID).

  • Задает необходимые точки входа драйвера в объекте драйвера мини-драйвера HID.

  • Вызывает Метод HidRegisterMinidriver для регистрации мини-драйвера HID в драйвере класса HID.

  • Выполняет конфигурации, относящиеся к конкретному устройству, которые используются только мини-накопителем HID.

Процедура AddDevice

Драйвер класса HID обрабатывает создание и инициализацию объекта функционального устройства (FDO) для базового устройства ввода. Драйвер класса HID также управляет FDO с точки зрения интерфейса верхнего уровня на базовое устройство и его дочерние устройства (коллекции HID).

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

Параметры, передаваемые в мини-драйвер HID DRIVER_ADD_DEVICE подпрограмме, — это объект драйвера мини-драйвера и FDO. Драйвер класса HID передает FDO подпрограмме AddDevice minidriver, а не физическому объекту устройства для базового устройства ввода.

Подпрограмма hid minidriver DRIVER_ADD_DEVICE получает указатель на расширение устройства minidriver из FDO.

  • Как правило, DRIVER_ADD_DEVICE подпрограмма hid minidriver выполняет следующие действия:

  • Инициализирует расширение устройства minidriver. Расширение устройства используется только мини-накопителем.

  • Возвращает STATUS_SUCCESS. Если мини-драйвер возвращает состояние ошибки, драйвер класса HID удаляет FDO и возвращает состояние ошибки диспетчеру Plug and Play.

Подпрограмма выгрузки

Подпрограмма Unload драйвера класса HID вызывает мини-диск HID DRIVER_UNLOAD подпрограмму. Мини-диск HID освобождает все внутренние ресурсы, выделенные мини-диском.

Процедуры диспетчеризации

Мини-диск HID должен предоставлять следующие процедуры диспетчеризации: создание, закрытие, внутреннее управление устройством, управление системой, Plug and Play и управление питанием. За исключением внутренних запросов на управление устройствами, большинство этих подпрограмм диспетчеризации обеспечивают минимальную функцию. Когда драйвер класса HID вызывает эти подпрограммы диспетчеризации, он передает объект драйвера minidriver и объект функционального устройства (FDO).

IRP_MJ_CREATE

В соответствии с требованиями WDM драйвер класса HID и мини-драйвер HID предоставляют подпрограмму отправки для запросов на создание. Однако не удается открыть FDO. Драйвер класса HID возвращает STATUS_UNSUCCESSFUL.

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

IRP_MJ_CLOSE

В соответствии с требованиями WDM драйвер класса HID и мини-драйвер HID должны предоставлять подпрограмму отправки для закрытых запросов. Однако не удается открыть FDO. Драйвер класса HID возвращает STATUS_INVALID_PARAMETER_1.

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

IRP_MJ_DEVICE_CONTROL

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

IRP_MJ_INTERNAL_DEVICE_CONTROL

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

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

Мини-driver HID обрабатывает эти запросы способом, зависящим от устройства.

IRP_MJ_SYSTEM_CONTROL

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

  • Пропуск текущего расположения стека IRP

  • Отправка запроса в стек устройств FDO

IRP_MJ_PNP

Мини-накопитель HID должен предоставлять подпрограмму отправки для Plug and Play запросов.

Драйвер класса HID выполняет все Plug and Play обработку, связанную с FDO. Когда драйвер класса HID обрабатывает запрос Plug and Play, он вызывает подпрограмму Plug and Play диспетчера мини-драйвера HID.

Подпрограмма отправки мини-накопителя HID Plug and Play:

  • Обрабатывает отправку запроса в стек устройств FDO и выполнение запроса при резервном копировании стека устройств в соответствии с каждым типом запроса.

  • Выполняет обработку для конкретного устройства, связанную с определенными запросами на обновление сведений о состоянии FDO.

    Например, мини-диск может обновить Plug and Play состояние FDO (в частности, независимо от того, запущена ли FDO, остановлена или в процессе удаления).

IRP_MJ_POWER

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

В соответствии с требованиями WDM мини-диск HID отправляет запросы на питание в стек устройств FDO следующим образом:

  • Пропускает текущее расположение стека IRP.

  • Запуск следующего IRP питания

  • Отправляет IRP питания в стек устройств FDO.

Как правило, мини-диск HID передает запросы на питание по стеку устройств без дополнительной обработки.