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

在Windows上的HID设备上执行ReadFile()时会发生什么情况?,windows,driver,hid,Windows,Driver,Hid,当我在CreateFileHID\u DEVICE\u NAME…提供的句柄上执行ReadFile/WriteFile时,HID操作会发生什么 在我的例子中,它是向HID设备USB发出直接写/读请求,还是在底层驱动程序中的某个地方进行了转换,以读取最后一个缓存的具有此类ID的HID报告 读取文件调用: 发件人: Windows HID驱动程序使主机控制器请求输入报告。驱动程序将收到的报告存储在缓冲区中。ReadFile从缓冲区检索一个或多个报告。如果缓冲区为空,ReadFile将等待报告到达。换

当我在CreateFileHID\u DEVICE\u NAME…提供的句柄上执行ReadFile/WriteFile时,HID操作会发生什么

在我的例子中,它是向HID设备USB发出直接写/读请求,还是在底层驱动程序中的某个地方进行了转换,以读取最后一个缓存的具有此类ID的HID报告

读取文件调用:

发件人:

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

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


我希望CreateFile调用失败;据我所知,Windows使HID设备保持打开状态,以便以独占方式访问。“无论如何,这不太可能做任何明智的事情。”哈利约翰斯顿说,但事实并非如此works@HarryJohnston还有,看到这是鼠标、键盘还是其他东西了吗?@HarryJohnston这是一个基于AVR的设备,可视为HID设备。嗯,你得到出版商的许可复制这篇文章了吗?用你自己的话来避免这类问题,链接到支持MSDN的文章不会有什么坏处。我引用的是,我可以在这里重新排列/替换单词,但我觉得这是一个非常简洁和完整的答案。我已经标记了我的答案以获得版主的意见。
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);