Поделиться через


Отправка отчетов 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:

  • IOCTL_HID_SET_OUTPUT_REPORT. Отправляет выходный отчет в коллекцию (Windows XP и более поздние версии).
  • IOCTL_HID_SET_FEATURE. Отправляет отчет о функциях в коллекцию.