Windows动态库hid.dll
+ -

hidclass.sys多输入报告的长度研究

2022-05-31 159 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.

maxReportSiz

从变量名就可以看到,这里取的最大值。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

HID.DLL导出函数HidD_GetInputReport探究
HidD_GetInputReport的功能HidD_GetInputReport用于获取输入报告(input report)。说明:不过微软关于此函数有一个特别的说明,就是只能获取当前的输入报告,不能连续的获取,因为可能会丢数据。所以如果要连续的获取输入报告,需要使用ReadFile函数。同时,......
Windows系统HID设备获取输入报告ReadFile和HidD_GetInputReport区别
在Windows系统提供的HID接口中获取输入报告内容一般通过两个接口,分别为ReadFile和HidD_GetInputReport。不过大家有没有发现,在实际的使用过程中,大家还是使用ReadFile多一些,在某些的时候也会用HidD_GetInputReport,不过它们之间的区别,好像有时很......
HID设备读取输入报告机制概述
在Windows系统中,一般是通过ReadFile中来获取输入报告的。我们在Windows系统HID设备获取报告描述符ReadFile和HidD_GetInputReport区别一文中介绍过它的大概原理。这里我们更加深理细节的说明一下ReadFile读取输入报告的细节原理。在应用层,使用ReadF......
hidclass.sys多输入报告的长度研究
有没有思考过一个问题,一般我们的HID设备只一个输入输出报告,那么在hidclass.sys中在循环读取输入报告时,按指定的长度来进行读取即可。但是,我们知道,一个HID设备是可以支持多个输入报告的,多个输入报告使用ReportId来区分的。如我们提供如下的一个自定义通讯HID设备:0x06,0x......
HID设备输入报告的安全方式
HIDCLASS.SYS驱动中定义了一个HID设备的安全读模式,安全模式的开启与关闭是通过IOCTL_HID_ENABLE_SECURE_READ和IOCTL_HID_DISABLE_SECURE_READ实现的。当然可发送此IOCTL的前提是需要打开设备。打开设备时,系统会对打开的请求模式进行判断......
Windows系统对HIDUSAGE_PAGE和USAGE的支持
Windows 支持以下顶级集合:Usage PageUsageWindows 7Windows 8Windows 10NotesAccess Mode0x00010x0001 - 0x0002YesYesYesMouse class driver and m......
Windows系统HID读输入报告的两种方式HidD_GetInputReport和ReadFile的补充
Windows系统提供了两种方式读取HID的输入报告,分别为HidD_GetInputReport和ReadFile,两都本质都是读取HID的输入报告,但从操作系统层来讲,两都又不同。在 Windows系统HID设备获取输入报告ReadFile和HidD_GetInputReport区别:https......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!