hidclass.sys多输入报告的长度研究
2022-05-31
190
0
有没有思考过一个问题,一般我们的HID设备只一个输入输出报告,那么在hidclass.sys中在循环读取输入报告时,按指定的长度来进行读取即可。
但是,我们知道,一个HID设备是可以支持多个输入报告的,多个输入报告使用ReportId来区分的。
如我们提供如下的一个自定义通讯HID设备:
0x06,0xFF,0x00, //0 GLOBAL_USAGE_PAGE(Reserved or Other)
0x09,0x01, //3 LOCAL_USAGE()
0xA1,0x01, //5 MAIN_COLLECTION(Applicatior)
//input F2
0x85,0xF2, //29 GLOBAL_REPORT_ID(F2)
0x09,0x01, //23 LOCAL_USAGE()
0x75,0x08, //15 GLOBAL_REPORT_SIZE(8)
0x95,0x10, //31 GLOBAL_REPORT_COUNT(16)
0x81,0x02, //33 MAIN_INPUT(data var absolute NoWrap linear PreferredState NoNullPosition NonVolatile ) Input 48.0
//input F1
0x85,0xF1, //7 GLOBAL_REPORT_ID(F1)
0x09,0x01, //9 LOCAL_USAGE()
0x15,0x00, //11 GLOBAL_LOGICAL_MINIMUM(0)
0x25,0xFF, //13 GLOBAL_LOCAL_MAXIMUM(-1/255)
0x75,0x08, //15 GLOBAL_REPORT_SIZE(8)
0x95,0x20, //17 GLOBAL_REPORT_COUNT(32)
0x81,0x02, //19 MAIN_INPUT(data var absolute NoWrap linear PreferredState NoNullPosition NonVolatile ) Input 40.0
//output 01
0x85,0x01, //21 GLOBAL_REPORT_ID(160)
0x09,0x01, //23 LOCAL_USAGE()
0x75,0x08, //15 GLOBAL_REPORT_SIZE(8)
0x95,0x30, //25 GLOBAL_REPORT_COUNT(48)
0x91,0x02, //27 MAIN_OUTPUT(data var absolute NoWrap linear PreferredState NoNullPosition NonVolatile ) Output 40.0
0xC0, //35 MAIN_COLLECTION_END
可以看到支持2个HID输入设备,长度分别为:
HID报告 | ReportId | 数据长度 |
---|---|---|
输入报告 | F1 | 32 |
输入报告 | F2 | 16 |
输出报告 | 01 | 48 |
当hidclass在内核中读取输入报告时,并不会指定ReportId,而是按最大的一个长度来进行读取输入报告的,而固件是根据实际长度返回需要通讯的输入报告。
这个源代码在HidpSubmitInterruptRead函数中实现。
v3->IoStatus.Status = 0xC00000BB; // STATUS_NOT_SUPPORTED
v7[-1].MajorFunction = 15;
v7[-1].Parameters.DeviceIoControl.IoControlCode = 0xB000B;
v7[-1].Parameters.DeviceIoControl.OutputBufferLength = *((_DWORD *)a1 + 0x27);
v7[-1].Parameters.DeviceIoControl.InputBufferLength = 0;
v8 = v3->Tail.Overlay.CurrentStackLocation;
v8[-1].CompletionRoutine = (int (__fastcall *)(_DEVICE_OBJECT *, _IRP *, void *))HidpInterruptReadComplete;
v8[-1].Context = (void *)a1;
v8[-1].Control = -32;
而OutputBufferLength的长度是来自:0x27*4=0x9c.
从变量名就可以看到,这里取的最大值。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936