获取 HID 报告

本部分介绍用户模式应用程序和内核模式驱动程序如何从 HID 集合获取 HID 报告。

按用户模式应用程序获取 HID 报告

本主题讨论如何使用 ReadFileHidD_GetXxx 例程的用户模式应用程序获取 HID 输入报告或 HID 功能报告。

但是,应用程序应仅使用 HidD_GetXxx 例程来获取设备的当前状态。 如果应用程序尝试使用 HidD_GetInputReport 持续获取输入报告,则报表可能会丢失。 此外,某些设备可能不支持 HidD_GetInputReport,如果使用此例程,则无响应。

使用 ReadFile

应用程序使用通过 CreateFile 获取的打开文件句柄打开集合上的文件。 当应用程序调用 ReadFile 时,它不必指定重叠的 I/O,因为 HID 客户端驱动程序 缓冲区在环形缓冲区中报告。 但是,应用程序可以使用重叠 I/O 具有多个未完成的读取请求。

使用 HidD_GetXxx 例程

应用程序可以使用以下 HIDClass 支持例程 从 HID 集合中获取最新的输入报告和功能报告:

应用程序可以请求返回特定报表。 若要使用这些例程检索特定报表,应用程序会分配报表输出缓冲区,对缓冲区进行零初始化,并将缓冲区中的第一个字节设置为特定的报表 ID。 有关详细信息,请参阅 初始化 HID 报表

通过内核模式驱动程序获取 HID 报告

本主题讨论内核模式驱动程序应如何使用IRP_MJ_READ请求作为持续获取 HID 输入报告main方法。

连续读取请求按从集合接收的顺序返回输入报告。 驱动程序还可以使用 IOCTL_HID_GET_Xxx 请求来获取输入和功能报告。 但是,驱动程序应仅使用这些 I/O 请求来获取设备的当前状态。 如果驱动程序尝试使用 IOCTL_HID_GET_INPUT_REPORT 持续获取输入报告,则报表可能会丢失。 此外,某些设备可能不支持 IOCTL_HID_GET_INPUT_REPORT,如果使用此请求,将变得无响应。

使用IRP_MJ_READ请求

非 WDM Windows 2000 驱动程序以及适用于 Windows XP 及更高版本的驱动程序可以使用单个 IRP 来处理对设备的所有读取请求。 但是,Windows 2000 WDM 驱动程序必须为每个读取请求分配一个新的 IRP。 有关如何使用和重用 IRP 的常规信息,请参阅 处理 IRP重用 IRP

如果驱动程序重用 IRP,IRP 的 IoCompletion 例程应以 STATUS_MORE_PROCESSING_REQUIRED ( 状态完成请求,而不是释放 IRP) 。 当驱动程序不再需要 IRP 时,它应通过调用 IoCompleteRequestIoFreeIrp 完成并释放 IRP。 例如,驱动程序通常会在其 Unload 例程中或在删除设备后完成并释放 IRP。

如果驱动程序仅对一个读取请求使用 IRP,则 IRP 的 IoCompletion 例程应完成并释放 IRP,并返回 STATUS_SUCCESS

驱动程序必须先从非分页内存池中分配零初始化的输入报告缓冲区,然后驱动程序才能请求输入报告。 缓冲区的大小(以字节为单位)由 HID 集合的 HIDP_CAPS 结构的 InputReportByteLength 成员指定。 然后,驱动程序必须使用 MDL 来映射读取请求的输入报告缓冲区。 驱动程序调用 IoAllocateMdl 为输入报告缓冲区分配 MDL,并将读取 IRP 的 Irp-MdlAddress> 成员设置为输入报告缓冲区的 MDL 地址。 当不再需要报表缓冲区和 MDL 时,驱动程序应释放它们。

除了设置读取 IRP 的 MDL 地址外,驱动程序还必须设置下一个较低级别驱动程序的 I/O 堆栈位置。 驱动程序通过调用 IoGetNextIrpStackLocation 获取对下一个较低级别驱动程序的 I/O 堆栈位置的访问权限。 驱动程序设置 I/O 堆栈位置的以下成员:

Parameters.Read.Length
设置为读取缓冲区的大小(以字节为单位)。 此值必须大于或等于 HID 集合 HIDP_CAPS结构的 InputReportByteLength 成员指定的值。

Parameters.Read.Key
设置为零。

Parameters.Read.ByteOffset.QuadPart
设置为零。

MajorFunction
设置为 IRP_MJ_READ。

FileObject
设置为表示 HID 集合上打开的文件的文件对象指针。

驱动程序获取输入报告后,它可以访问控制数据,如 解释 HID 报告中所述。

使用IOCTL_HID_GET_Xxx请求

驱动程序可以使用以下 I/O 请求从 HID 集合获取最新的输入和功能报告:

驱动程序可以请求返回特定报表。 若要使用这些 I/O 请求检索特定报表,驱动程序首先分配输出报告缓冲区,然后对缓冲区进行零初始化,并将缓冲区中的第一个字节设置为特定的报表 ID。

有关详细信息,请参阅 解释 HID 报表