当我在 Windows 上的 HID 设备上执行 ReadFile() 时会发生啥?

Posted

技术标签:

【中文标题】当我在 Windows 上的 HID 设备上执行 ReadFile() 时会发生啥?【英文标题】:What happens when I do ReadFile() on a HID device on Windows?当我在 Windows 上的 HID 设备上执行 ReadFile() 时会发生什么? 【发布时间】:2014-10-22 13:28:58 【问题描述】:

当我对 CreateFile(HID_DEVICE_NAME,...) 提供的句柄执行 ReadFile/WriteFile 时,在 HID 操作方面会发生什么?

它是向 HID 设备(在我的例子中是 USB)发出直接写入/读取请求,还是在底层驱动程序中的某处转换以读取具有该 ID 的最后缓存的 HID 报告?


ReadFile 调用:

syncDevice.OutputReportBuffer[0] = 0;
syncDevice.OutputReportBuffer[1] = reportID;
HANDLE writeHandle = CreateFile(pDevice->DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
HANDLE readHandle = CreateFile(pDevice->DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
success = WriteFile(writeHandle, (void*) syncDevice.OutputReportBuffer, syncDevice.Caps.OutputReportByteLength, &bytecnt, 0);
success = ReadFile(readHandle, syncDevice.InputReportBuffer, syncDevice.Caps.InputReportByteLength, &bytecnt, 0);

【问题讨论】:

我希望 CreateFile 调用失败;据我了解,Windows 会保持 HID 设备开放以进行独占访问。无论如何,这不太可能做任何明智的事情。 @HarryJohnston 但它有效 @HarryJohnston 也可以查看***.com/questions/11691619/… 这是鼠标、键盘还是其他什么东西? @HarryJohnston 它是一个基于 AVR 的设备,可作为 HID 设备可见。 【参考方案1】:

来自USB Complete by Jan Axelson:

Windows HID 驱动程序使主机控制器请求输入报告。驱动程序将收到的报告存储在缓冲区中。 ReadFile 从缓冲区中检索一份或多份报告。如果缓冲区为空,ReadFile 将等待报告到达。换句话说,ReadFile 不会导致设备发送报告,而只是读取驱动程序请求的报告。

WriteFile 发送输出报告。如果 HID 具有中断 OUT 端点并且操作系统晚于 Windows 98 Gold,则该函数使用中断传输。否则,WriteFile 使用带有设置报告请求的控制传输。如果使用中断传输,WriteFile 将在设备 NAK 时等待。如果使用控制传输,WriteFile 会在失败或超时时返回错误代码。

【讨论】:

嗯,您是否获得出版商的许可以复制此文本?只需用你自己的话来避免此类问题,支持 MSDN 文章的链接永远不会受到伤害。 我根据community rules on referencing material 引用,我可以在这里重新排列/替换单词,但我觉得这是非常简洁和完整的答案。我已经标记了我的答案以获得版主的意见。

以上是关于当我在 Windows 上的 HID 设备上执行 ReadFile() 时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Windows 7中的非HID设备捕获USB中断?

在非默认音频设备上设置 HID 音量调高/调低

CreateFile 无法在 Windows 中打开 HID 设备

符号链接上的意外 ioctl 行为

Windows与自定义USB HID设备通信说明.

将串行从 Raspberry 传递到 Arduino USB HID