从 .pcap 文件获取 HID 报告描述符
Get HID report Descriptor from .pcap file
我正在 windows 上构建一个 C++ 应用程序,它应该重新解释由 Wireshark and USBPCap 捕获的 USB 数据流存储到 .pcap
文件中。我目前无法获取 HID Report descriptor
,因此我将能够解释鼠标发送到主机的数据。
到目前为止,站点 USB Made Simple 是一个很好的信息来源,我还阅读了大量关于如何编写自己的 HID 报告描述符的教程,以便理解它们。但我需要的是从当前数据流中检索一个。
根据 wireshark,鼠标正在向我发送 DEVICE DESCRIPTOR
(example here), after that it sends CONFIGURATION DESCRIPTOR
with its INTERFACE, HID
and ENDPOINT DESCRIPTORS
(example here)。
根据HID DESCRIPTOR
中wDescriptorLength
的值,应该有长度为56的HID REPORT DESCRIPTOR
,但是没有。在此之后只有 ENDPOINT DESCRIPTOR
的长度为 7,另一个 INTERFACE
和 HID DESCRIPTOR
的总长度为 18.
有什么方法可以从中得到 HID REPORT DESCRIPTOR
还是我遗漏了什么?
感谢您的任何意见。
您应该能够使用 Win32 HID-parse 实用程序来执行此操作:
https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/preparsed-data
查看此处的使用示例,其中使用 WM_INPUT
访问 HID 报告:
https://github.com/supersmo/Using-Raw-Input-API-to-Process-Joystick-Input
...特别是这些方法:
// determine buffer size required
CHECK( GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_PREPARSEDDATA, NULL, &bufferSize) == 0 );
// allocate buffer
CHECK( pPreparsedData = (PHIDP_PREPARSED_DATA)HeapAlloc(hHeap, 0, bufferSize) );
// determine the usages etc
CHECK( (int)GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_PREPARSEDDATA, pPreparsedData, &bufferSize) >= 0 );
// Button caps
CHECK( HidP_GetCaps(pPreparsedData, &Caps) == HIDP_STATUS_SUCCESS )
// Value caps
CHECK( pValueCaps = (PHIDP_VALUE_CAPS)HeapAlloc(hHeap, 0, sizeof(HIDP_VALUE_CAPS) * Caps.NumberInputValueCaps) );
capsLength = Caps.NumberInputValueCaps;
CHECK( HidP_GetValueCaps(HidP_Input, pValueCaps, &capsLength, pPreparsedData) == HIDP_STATUS_SUCCESS )
另一件要看的事情是 ReactOS hidusb source
可以在这里找到(今天):
https://doxygen.reactos.org/dd/d06/hidusb_8c_source.html
...特别注意例如HidUsb_GetReportDescriptor
希望这能为您指明正确的方向。
Is there any way to get HID REPORT DESCRIPTOR
from this or am I missing something out ?
不了解你,但对我来说 Wireshark/USBPCap 似乎缺少了一些东西。
如果您将它与我的示例进行比较,您的部分似乎缺少带有 USBHID
协议的条目。
请检查您的 Wireshark 版本,或者您是否没有在捕获配置中启用任何过滤器。
点击USBPcap界面左侧的'gear'图标可以查看当前设置:
重要说明:
尽管检查了“注入已连接的设备描述符...”,但它对我来说并不像我期望的那样工作,要捕获报告描述符,您必须重新连接设备:拔下 USB-HID 设备 -> 开始捕获 ->插入 USB 设备 -> 现在您可以停止捕获了。
我正在 windows 上构建一个 C++ 应用程序,它应该重新解释由 Wireshark and USBPCap 捕获的 USB 数据流存储到 .pcap
文件中。我目前无法获取 HID Report descriptor
,因此我将能够解释鼠标发送到主机的数据。
到目前为止,站点 USB Made Simple 是一个很好的信息来源,我还阅读了大量关于如何编写自己的 HID 报告描述符的教程,以便理解它们。但我需要的是从当前数据流中检索一个。
根据 wireshark,鼠标正在向我发送 DEVICE DESCRIPTOR
(example here), after that it sends CONFIGURATION DESCRIPTOR
with its INTERFACE, HID
and ENDPOINT DESCRIPTORS
(example here)。
根据HID DESCRIPTOR
中wDescriptorLength
的值,应该有长度为56的HID REPORT DESCRIPTOR
,但是没有。在此之后只有 ENDPOINT DESCRIPTOR
的长度为 7,另一个 INTERFACE
和 HID DESCRIPTOR
的总长度为 18.
有什么方法可以从中得到 HID REPORT DESCRIPTOR
还是我遗漏了什么?
感谢您的任何意见。
您应该能够使用 Win32 HID-parse 实用程序来执行此操作:
https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/preparsed-data
查看此处的使用示例,其中使用 WM_INPUT
访问 HID 报告:
https://github.com/supersmo/Using-Raw-Input-API-to-Process-Joystick-Input
...特别是这些方法:
// determine buffer size required
CHECK( GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_PREPARSEDDATA, NULL, &bufferSize) == 0 );
// allocate buffer
CHECK( pPreparsedData = (PHIDP_PREPARSED_DATA)HeapAlloc(hHeap, 0, bufferSize) );
// determine the usages etc
CHECK( (int)GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_PREPARSEDDATA, pPreparsedData, &bufferSize) >= 0 );
// Button caps
CHECK( HidP_GetCaps(pPreparsedData, &Caps) == HIDP_STATUS_SUCCESS )
// Value caps
CHECK( pValueCaps = (PHIDP_VALUE_CAPS)HeapAlloc(hHeap, 0, sizeof(HIDP_VALUE_CAPS) * Caps.NumberInputValueCaps) );
capsLength = Caps.NumberInputValueCaps;
CHECK( HidP_GetValueCaps(HidP_Input, pValueCaps, &capsLength, pPreparsedData) == HIDP_STATUS_SUCCESS )
另一件要看的事情是 ReactOS hidusb source
可以在这里找到(今天):
https://doxygen.reactos.org/dd/d06/hidusb_8c_source.html
...特别注意例如HidUsb_GetReportDescriptor
希望这能为您指明正确的方向。
Is there any way to get
HID REPORT DESCRIPTOR
from this or am I missing something out ?
不了解你,但对我来说 Wireshark/USBPCap 似乎缺少了一些东西。
如果您将它与我的示例进行比较,您的部分似乎缺少带有 USBHID
协议的条目。
请检查您的 Wireshark 版本,或者您是否没有在捕获配置中启用任何过滤器。
点击USBPcap界面左侧的'gear'图标可以查看当前设置:
重要说明: 尽管检查了“注入已连接的设备描述符...”,但它对我来说并不像我期望的那样工作,要捕获报告描述符,您必须重新连接设备:拔下 USB-HID 设备 -> 开始捕获 ->插入 USB 设备 -> 现在您可以停止捕获了。