Отправка отчетов HID
В этой статье описывается, как приложения в пользовательском режиме и драйверы в режиме ядра отправляют отчеты HID в коллекцию HID.
Отправка отчетов HID приложениями в пользовательском режиме
Приложения в пользовательском режиме используют WriteFile для непрерывной отправки выходных отчетов в коллекцию HID. Вы также можете использовать HidD_SetXxx подпрограммы для отправки выходных отчетов и отчетов функций в коллекцию. Однако используйте только HidD_SetXxx подпрограммы для задания текущего состояния коллекции. Некоторые устройства могут не поддерживать HidD_SetOutputReport и перестать отвечать, если эта подпрограмма используется.
Подпрограмма WriteFile
Используйте запросы на запись для отправки выходных отчетов в коллекцию HID. После создания выходного отчета приложение в режиме пользователя может отправить выходной отчет в коллекцию с помощью WriteFile.
HidD_SetXxx подпрограммы
Используйте эти подпрограммы поддержки HIDClass для отправки отчетов HID в коллекцию HID:
- HidD_SetOutputReport. Отправляет выходной отчет в коллекцию HID (Windows XP и более поздние версии).
- HidD_SetFeature. Отправляет отчет о функциях в коллекцию HID.
Отправка отчетов HID драйверами в режиме ядра
Драйверы режима ядра используют запросы IRP_MJ_WRITE для непрерывной отправки выходных отчетов в коллекцию HID. Вы также можете использовать IOCTL_HID_SET_Xxx запросы для отправки выходных отчетов и отчетов компонентов в коллекцию. Однако используйте только запросы IOCTL_HID_SET_Xxx , чтобы задать текущее состояние коллекции. Некоторые устройства могут не поддерживать IOCTL_HID_SET_OUTPUT_REPORT и перестать отвечать, если этот запрос используется.
запросы IRP_MJ_WRITE
Драйверы Windows 2000, отличные от WDM, и драйверы для Windows XP и более поздних версий, могут использовать один IRP для всех запросов на запись, отправленных в коллекцию. Однако драйверы WDM Windows 2000 должны выделить новый IRP для каждого запроса на запись. Дополнительные сведения об использовании и повторном использовании irPs см. в разделе Об обработке irPs и повторном использовании irPs.
Если драйвер повторно использует IRP записи, подпрограмма IoCompletion IRP должна завершить запрос с состоянием STATUS_MORE_PROCESSING_REQUIRED (и не освободить IRP). Если драйвер больше не требует IRP, он должен завершить и освободить IRP путем вызова IoCompleteRequest и IoFreeIrp. Например, драйвер обычно может завершить и освободить IRP в своей подпрограмме выгрузки или после удаления устройства.
Если драйвер использует IRP только для одного запроса на запись, подпрограмма IoCompletion IRP должна завершить и освободить IRP и вернуть STATUS_SUCCESS.
Когда драйвер отправляет выходной отчет, он должен сначала инициализировать и задать буфер выходного отчета, как описано в разделе "Инициализация отчетов HID". Затем драйвер должен использовать MDL для сопоставления буфера выходных отчетов для запроса на запись. Драйвер вызывает IoAllocateMdl, чтобы выделить MDL для выходного отчета, и задает член IRP IRP-MdlAddress> в адрес MDL буфера выходного отчета. Драйвер должен освободить буфер отчета и MDL, если они больше не требуются.
Помимо настройки MDL-адреса IRP записи, драйвер также должен задать расположение стека ввода-вывода следующего драйвера нижнего уровня. Драйвер получает доступ к расположению стека ввода-вывода следующего драйвера нижнего уровня путем вызова IoGetNextIrpStackLocation. Драйвер задает следующие элементы расположения стека ввода-вывода:
- Parameters.Write.Length: задайте длину в байтах выходного отчета. Задайте этому элементу длину выходных отчетов коллекции HID, как указано элементом OutputReportByteLength структуры HIDP_CAPS коллекции.
- Parameters.Write.Key: присвоено значение нулю.
- Parameters.Write.ByteOffset.QuadPart: присвоено нулю.
- MajorFunction: задано значение
IRP_MJ_WRITE
. - FileObject: задайте указатель объекта файла, представляющий открытый файл в коллекции HID.
запросы IOCTL_HID_SET_Xxx
Вы также можете использовать следующие запросы ввода-вывода для отправки выходных данных и отчетов функций в коллекцию HID: