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

kag*_*san 2 windows driver hid

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

它是否向 HID 设备(在我的例子中为 USB)发出直接写入/读取请求,或者是否在底层驱动程序中的某个位置进行转换以读取具有此类 ID 的最后缓存的 HID 报告?


读取文件调用:

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);
Run Code Online (Sandbox Code Playgroud)

Pre*_*ton 5

来自Jan Axelson 的 USB Complete

\n\n
\n

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

\n\n

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

\n
\n

  • 我根据[参考材料的社区规则](http://stackoverflow.com/help/referencing)引用,我可以在这里重新排列/替换单词,但我觉得这是非常简洁和完整的答案。我已标记我的答案以获取主持人的意见。 (3认同)