由于重新插入设备,如何将 USB HID 句柄测试为无效

How to test USB HID handle as invalid due to device being replugged

在 Windows 7 中,我有一个自定义 USB HID 设备的句柄。我正在尝试确定句柄是否不再能够访问设备,因为设备已被拔下并重新插入。发生这种情况时 I/O 次尝试使用 WriteFile 失败。但是,我正在寻找一种方法来测试句柄,然后再执行任何 I/O 以确定 HID 设备句柄是否仍然有效。当我说有效时,我的意思是句柄已连接到设备,这样我就可以对设备执行 I/O。我知道从技术上讲,即使失去与物理设备的连接,句柄本身也可能有效。我的代码中的当前方法是通过尝试打开设备的新句柄来进行测试,如果成功则句柄有效,如果失败则句柄无效。如果设备在测试时拔下插头,这会按预期检测到断开连接。问题在于,如果设备已重新插入,则测试打开会成功,但用于执行 I/O(在 disconnected/reconnect 之前打开)的实际句柄不再连接到设备。我正在寻找一个良性调用,我可以使用实际的 I/O 句柄来告诉我设备是否已连接但不执行任何实际的 I/O.

到目前为止,我已经尝试了几次调用,但 none return 显示了我需要的设备连接。

DWORD handleInformation;
LARGE_INTEGER size = { 0, 0 };
BOOL isConnected;

isConnected = GetFileSizeEx(m_HidWriteHandle, &size);
isConnected = GetHandleInformation(m_HidWriteHandle, &handleInformation);

GetFileSizeEx 总是失败并且 GetLastError() 报告 (1) Invalid Function

GetHandleInformation 始终成功,即使设备已 disconnected/reconnected 并且句柄无法访问设备。

使用的调用是HidD_GetAttributes(handle, &attributes)

// Try to get the HID attributes.  This will fail if device is
// unplugged or has been unplugged since CreateFile() call that
// created m_HidWritehandle
HIDD_ATTRIBUTES Attributes;
Attributes.Size = sizeof(Attributes);
m_HidPresent = HidD_GetAttributes(m_HidWriteHandle, &Attributes) != 0;

即使设备已重新插入,这也会 return 错误,因此可以用作需要重新连接到 HID 设备的指示器。