Мини-драйверы и драйвер класса 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 на основе KMDF. См. статью Создание мини-накопителей HID на основе платформы
- Мини-диск HID на основе UMDF см. в статье Создание мини-накопителей WDF HID
В следующем разделе рассказывается о регистрации мини-драйвера HID на основе WDM, но большая его часть также относится к драйверу платформ на основе KMDF. Все мини-драйверы HID должны быть зарегистрированы в драйвере класса HID, а драйвер класса HID взаимодействует с мини-драйвером, вызывая стандартные процедуры драйвера мини-драйвера.
Дополнительные сведения о функциональных возможностях, которые должен поддерживать мини-диск HID в стандартных процедурах драйвера, см. в следующих разделах:
- Регистрация мини-драйвера HID
- Расширение мини-драйвера HID
- Использование структуры HID_DEVICE_EXTENSION
- Стандартные процедуры для мини-драйверов
Дополнительные сведения о драйвере класса 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 передает запросы на питание по стеку устройств без дополнительной обработки.