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

时间:2014-10-22 13:28:58

标签: windows driver hid

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

它是否向HID设备发出直接写入/读取请求(在我的情况下是USB),还是在底层驱动程序的某处转换为读取具有此ID的最后一个缓存HID报告?


ReadFile call:

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);

1 个答案:

答案 0 :(得分:4)

来自USB Complete by Jan Axelson

  

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

     

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