各位大佬有没有解析报告描述符的程序例程?
清忱:
这个没有
清忱:
我都是通过反推的
清忱:
你可以看你的是什么设备
清忱:
然后参照HID提供的反解析
清忱:
http://www.usbzh.com/article/detail-13.html
Frogmouth :
如果要兼容不同厂家的hid设备 但是上报的数据格式不同,就得解析报告描述符 不解析的话有什么好办法处理呢
清忱:
没有好的办法,只有解析
Frogmouth :
这个解析不得好复杂好麻烦
crazy_code :
你是要解析所有的HID设备描述符 ?
Frogmouth :
实在不行抓包 每个设备都抓包 然后通过描述符指定设备
Frogmouth :
不用啊 因为我做的事绘画板之类的 只需要他的坐标 压力 这些 但是每个厂家 描述符定义不一样
Frogmouth :
数据上报格式有些许不同
crazy_code :
要是键盘和鼠标的话, 可以通过set protocol命令, 将设备强制到boot模式
crazy_code :
你也可以看看你的设备支不支持boot模式, 要是支持boot模式, 那数据格式就是固定的
Frogmouth :
ok
Frogmouth :
感谢大佬
Frogmouth :
我去看看
crazy_code :
嗯, boot模式就是在bios模式下, 为了简化相关设计, 数据格式固定的
—
结贴:
本站提供一个WINDOWS版本的HID报告描述符分析工具,下载地址:http://www.usbzh.com/article/detail-537.html
感谢本QQ技术交流群LY大佬的分享,本人代笔现将报表描述符的ubuntu解析方法整理如下文所示。
在Linux Ubuntu操作系统下,可使用命令行对插入的设备进行HID报表描述分析.
首先将HID设备接入系统中,使用find命令行列出所设备信息.
如:
find . -name rdesc
则系统会以列表的形式显示含有报表描述符的设备,如
/sys/kernel/debug/hid/0003\:291A\:3301.0003/rdesc
然后使用cat输出报表描述符,输出结果并进行了解析
cat /sys/kernel/debug/hid/0003\:291A\:3301.0003/rdesc
05 0c 09 01 a1 01 85 01 15 00 25 01 09 e9 09 ea 09 e2 09 cd 09 b5 09 b6 09 b0 09 b1 75 01 95 08 81 42 c0 05 0b 09 01 a1 01 85 02 15 00 25 01 09 20 09 21 09 23 09 2f 75 01 95 04 81 22 95 04 81 01 05 08 85 03 15 00 25 01 09 18 75 01 95 01 91 22 75 07 91 01 85 04 15 00 25 01 09 09 75 01 95 01 91 22 75 07 91 01 85 05 15 00 25 01 09 20 75 01 95 01 91 22 75 07 91 01 85 06 15 00 25 01 09 08 09 17 09 19 09 1a 09 1e 09 1f 09 21 09 22 09 23 09 24 09 25 09 26 75 01 95 0c 91 22 75 07 91 01 c0
INPUT(1)[INPUT]
Field(0)
Application(Consumer.0001)
Usage(8)
Consumer.00e9
Consumer.00ea
Consumer.00e2
Consumer.00cd
Consumer.00b5
Consumer.00b6
Consumer.00b0
Consumer.00b1
Logical Minimum(0)
Logical Maximum(1)
Report Size(1)
Report Count(8)
Report Offset(0)
Flags( Variable Absolute NullState )
INPUT(2)[INPUT]
Field(0)
Application(000b.0001)
Usage(4)
000b.0020
000b.0021
000b.0023
000b.002f
Logical Minimum(0)
Logical Maximum(1)
Report Size(1)
Report Count(4)
Report Offset(0)
Flags( Variable Absolute NoPreferredState )
OUTPUT(3)[OUTPUT]
Field(0)
Application(000b.0001)
Usage(1)
LED.0018
Logical Minimum(0)
Logical Maximum(1)
Report Size(1)
Report Count(1)
Report Offset(0)
Flags( Variable Absolute NoPreferredState )
OUTPUT(4)[OUTPUT]
Field(0)
Application(000b.0001)
Usage(1)
LED.0009
Logical Minimum(0)
Logical Maximum(1)
Report Size(1)
Report Count(1)
Report Offset(0)
Flags( Variable Absolute NoPreferredState )
OUTPUT(5)[OUTPUT]
Field(0)
Application(000b.0001)
Usage(1)
LED.0020
Logical Minimum(0)
Logical Maximum(1)
Report Size(1)
Report Count(1)
Report Offset(0)
Flags( Variable Absolute NoPreferredState )
OUTPUT(6)[OUTPUT]
Field(0)
Application(000b.0001)
Usage(12)
LED.0008
LED.0017
LED.0019
LED.001a
LED.001e
LED.001f
LED.0021
LED.0022
LED.0023
LED.0024
LED.0025
LED.0026
Logical Minimum(0)
Logical Maximum(1)
Report Size(1)
Report Count(12)
Report Offset(0)
Flags( Variable Absolute NoPreferredState )
Consumer.00e9 ---> Key.VolumeUp
Consumer.00ea ---> Key.VolumeDown
Consumer.00e2 ---> Key.Mute
Consumer.00cd ---> Key.PlayPause
Consumer.00b5 ---> Key.NextSong
Consumer.00b6 ---> Key.PreviousSong
Consumer.00b0 ---> Key.Play
Consumer.00b1 ---> Key.Pause
000b.0020 ---> Sync.Report
000b.0021 ---> Sync.Report
000b.0023 ---> Sync.Report
000b.002f ---> Key.?
LED.0018 ---> Sync.Report
LED.0009 ---> LED.Mute
LED.0020 ---> Sync.Report
LED.0008 ---> Sync.Report
LED.0017 ---> Sync.Report
LED.0019 ---> LED.?
LED.001a ---> Sync.Report
LED.001e ---> Sync.Report
LED.001f ---> Sync.Report
LED.0021 ---> Sync.Report
LED.0022 ---> Sync.Report
LED.0023 ---> Sync.Report
LED.0024 ---> Sync.Report
LED.0025 ---> Sync.Report
LED.0026 ---> Sync.Report
参考网址:https://www.slashdev.ca/2010/05/08/get-usb-report-descriptor-with-linux/
本人将ReactOS源代码的hidparser.sys源程序移植到应用层了,对http://www.usbzh.com/article/detail-32.html 这个鼠标描述符进行了解析,解析后的结果是
从数据长度上来看是正确后,不知道别的是否正常。明天再调试一下。
main.cpp源代码为:
int main()
{
HIDP_DEVICE_DESC Hidp ;
UCHAR Report[] = {
0x05, 0x01, // Global Generic Desktop
0x09, 0x02, // Local Mouse
0xa1, 0x01, // Main app collection
0x09, 0x01, // Local Pointer
0xa1, 0x00, // Main phy collection
0x95, 0x03, // Global ReportCount
0x75, 0x01, // Global ReportSize
0x05, 0x09, // Global Button
0x19, 0x01, // Local Usage Min
0x29, 0x03, // Local Usage Max
0x15, 0x00, // Global Logical Min
0x25, 0x01, // Global Logical Max
0x81, 0x02, // Main Input(Data,Var,Abs)
0x95, 0x01, // Global ReportCount
0x75, 0x05, // Global ReportSize
0x81, 0x03, // Main Input(Cnsr,Var,Abs)
0x95, 0x03, 0x75, 0x08, // Global ReportCount Global ReportSize
0x05, 0x01, // Global Generic Desktip
0x09, 0x30, // Local X
0x09, 0x31, // Local Y
0x09, 0x38, // Locak Wheel
0x15, 0x81, // Global Logical Min
0x25, 0x7f, // Global Logical Max
0x81, 0x06, // Main Input(Data,Var,Rel)
0xc0 // Main End collection
};
HidP_GetCollectionDescription((PHIDP_REPORT_DESCRIPTOR)Report, sizeof(Report), 0, &Hidp);
return 0;
}
工程文件目录文件:
2021/06/22 19:29 <DIR> .
2021/06/22 19:29 <DIR> ..
2021/06/22 17:27 23,168 api.cpp
2021/06/22 17:29 7,921 context.cpp
2021/06/22 19:29 <DIR> Debug
2021/06/22 17:48 8,933 hidp.cpp
2020/04/09 18:06 236 hidp.h
2021/06/22 17:49 34,719 hidparser.cpp
2021/06/22 17:44 10,320 hidparser.h
2021/06/22 17:28 7,623 hidparser.vcxproj
2021/06/22 17:28 1,788 hidparser.vcxproj.filters
2021/06/22 16:59 168 hidparser.vcxproj.user
2021/06/22 19:29 3,007 main.cpp
2021/06/22 17:47 19,933 main.h
2021/06/22 17:48 40,574 parser.cpp
2021/06/22 17:07 8,634 parser.h
什么是hidparser.sys 可参见:http://www.usbzh.com/zone/detail-31.html