范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

HID。DLL导出函数HidDGetInputReport探究

  HidD_GetInputReport的功能
  HidD_GetInputReport用于获取输入报告(input report)。
  说明:
  不过微软关于此函数有一个特别的说明,就是只能获取 当前的输入报告 ,不能连续地获取,因为可能会丢数据。所以如果要连续的获取输入报告,需要使用ReadFile函数。
  同时,有些设备可能不支持HidD_GetInputReport,所以使用此函数时可能没有响应。
  更多详见: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/hidsdi/nf-hidsdi-hidd_getinputreport https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/obtaining-hid-reports#obtaining-hid-reports-by-user-mode-applications HidD_GetInputReport应用层
  HidD_GetInputReport函数在ReactOS中实现如下: HIDAPI BOOLEAN WINAPI HidD_GetInputReport(IN HANDLE HidDeviceObject,                     IN OUT PVOID ReportBuffer,                     IN ULONG ReportBufferLength) {   DWORD RetLen;   return DeviceIoControl(HidDeviceObject, IOCTL_HID_GET_INPUT_REPORT,                          NULL, 0,                          ReportBuffer, ReportBufferLength,                          &RetLen, NULL) != 0; }
  源代码路径为: E:reactosReactOS-0.4.13-src-2020-0731ReactOS-0.4.13dllwin32hidhid.c
  可以看到,该函数是通过IOCTL_HID_GET_INPUT_REPORT实现的。故我们需要在内核驱动hidclass驱动中查看内核实现。 HidD_GetInputReport内核层
  在最新的ReactOS中,其实这个IOCTL并未实现。         case IOCTL_HID_GET_INPUT_REPORT:          {              DPRINT1("[HIDUSB] IOCTL_HID_GET_INPUT_REPORT not implemented  ");              ASSERT(FALSE);              Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;              IoCompleteRequest(Irp, IO_NO_INCREMENT);              return STATUS_NOT_IMPLEMENTED;          }
  不过,REACTOS未实现,并不代表windows未实现,只是因为reactos是不一个半成品工程。
  所以既然已经知道,该函数是实现在hidclass.sys中,故需要一些特别的方法。
  这里结合IDA来进行分析。
  我们看过HidRegisterMinidriver的源代码,知道其对原hidusb驱动的的回调函数进行了HOOK,这样当应用层下发IOCTL_HID_GET_INPUT_REPORT后,会进入HIDCLASS设置的回调函数,其函数名为:HidpMajorHandler。 #define IRP_MJ_DEVICE_CONTROL           0x0e ...       v20->MajorFunction[14] = (int (__fastcall *)(_DEVICE_OBJECT *, _IRP *))HidpMajorHandler; ...
  在其函数HidpMajorHandler内部继续跟踪       case 14:         v15 = HidpIrpMajorDeviceControl(v8, v4, -1073741824, a4);
  所以HidpIrpMajorDeviceControl才是真实的IOCTL_HID_GET_INPUT_REPORT实现。
  通过http://www.pnpon.com/import/ioctl.html 查询IOCTL_HID_GET_INPUT_REPORT的值为0xb01a2,故需要在HidpIrpMajorDeviceControl内部查找关于它的代码。
  可以看到,代码为:             case 0xB0191u:  //IOCTL_HID_SET_FEATURE             case 0xB0192u:  //IOCTL_HID_GET_FEATURE             case 0xB0195u:  //IOCTL_HID_SET_OUTPUT_REPORT             case 0xB01A2u:  //IOCTL_HID_GET_INPUT_REPORT             case 0xB01A6u:  //               v12 = HidpGetSetReport(a1, v4, (unsigned int)v109[6], v108);               v105 = v12;
  在这个函数中,会进行一些必要的判断,然后调用hidusb中.  v35 = HidpCallDriverSynchronous(*(_QWORD *)v8, v45);
  所以看到,这还是进入了miniport设备中。
  在hidusb中,其实就是下发IRP到总线驱动,然后获取输入报告内容。当然这里输入报告指针中的第一个字节是ReportID.
  进入HIDUSB.SYS驱动后,其执行的是被HIDCLASS.SYS hook掉的ioctl对应的函数HumInternalIoctl。
  在HumInternalIoctl中查找对应的IOCTL 0xB01A2u:   case 0xB0191u:  //IOCTL_HID_SET_FEATURE   case 0xB0192u:  //IOCTL_HID_GET_FEATURE   case 0xB0195u:  //IOCTL_HID_SET_OUTPUT_REPORT   case 0xB01A2u:  //IOCTL_HID_GET_INPUT_REPORT             v10 = HumGetSetReport((__int64)DeviceObject, v2, &v70);             if ( v10 >= 0 || (unsigned int)dword_1C0008010 <= 5 || !TlgKeywordOn(v58, v12) )               goto LABEL_22;             v82 = v10;             v108 = &v82;             v110 = (int *)&v83;             v83 = v11;             v109 = 4i64;             v111 = 4i64;             v49 = &v107;             break;
  进入HumGetSetReport函数之后,我们手动解析一些结构体和反汇编之后的代码如下: NTSTATUS __fastcall HumGetSetReport(__int64 a1, IRP *a2, _BYTE *a3) {   _IO_STACK_LOCATION *v3; // r15   NTSTATUS result; // eax   int transferFlags; // edi   char request; // bp   __int16 value; // si   _HID_XFER_PACKET *v10; // r14   _URB *urb; // rax   _URB *urb2; // rbx   USHORT value2; // si   _IO_STACK_LOCATION *v14; // rax   __int64 v15; // [rsp+68h] [rbp+10h]    v3 = a2->Tail.Overlay.CurrentStackLocation;   switch ( v3->Parameters.Read.ByteOffset.LowPart )   {     case 0xB0191u:       value = 0x300;       goto LABEL_10;     case 0xB0192u:       transferFlags = 1;       request = 1;       value = 0x300;       goto LABEL_11;     case 0xB0195u:       value = 0x200; LABEL_10:       request = 9;       transferFlags = 0;       goto LABEL_11;   }   if ( v3->Parameters.Read.ByteOffset.LowPart != 0xB01A2 )     return 0xC00000BB;   transferFlags = 1;                            // USBD_TRANSFER_DIRECTION_IN   request = 1;   value = 0x100; LABEL_11:   v10 = (_HID_XFER_PACKET *)a2->UserBuffer;   v15 = *(_QWORD *)(*(_QWORD *)(a1 + 64) + 16i64);   if ( !v10 || !v10->reportBuffer || !v10->reportBufferLen )     return 0xC000003E;   urb = (_URB *)ExAllocatePoolWithTag((POOL_TYPE)0x200, 0x98ui64, 0x55646948u);   urb2 = urb;   if ( !urb )     return 0xC000009A;   memset(urb, 0, sizeof(_URB));   value2 = v10->reportId + value;               // +ReportId   if ( (*(_DWORD *)(v15 + 64) & 1) != 0 )       // DEVICE_FLAGS_HID_1_0_D3_COMPAT_DEVICE   {     *(_DWORD *)&urb2->UrbHeader.Length = 0x1C0088;// URB_FUNCTION_CLASS_ENDPOINT0x1c Length=0x0088     urb2->UrbSelectInterface.Index = 1;         // endpoint   }   else   {     *(_DWORD *)&urb2->UrbHeader.Length = 0x1B0088;// URB_FUNCTION_CLASS_INTERFACE=1c Length=0x0088     urb2->UrbSelectInterface.Index = *(unsigned __int8 *)(*(_QWORD *)(v15 + 16) + 2i64);// endpoint   }   urb2->UrbSelectInterface.RequestTypeReservedBits = 0x22;// requestType   urb2->UrbSelectInterface.Request = request;   urb2->UrbSelectInterface.Value = value2;   urb2->UrbSelectInterface.TransferFlags = transferFlags;   urb2->UrbSelectInterface.TransferBuffer = v10->reportBuffer;   urb2->UrbSelectInterface.TransferBufferLength = v10->reportBufferLen;   v14 = a2->Tail.Overlay.CurrentStackLocation;   v14[-1].CompletionRoutine = (PIO_COMPLETION_ROUTINE)&HumGetSetReportCompletion;   v14[-1].Context = urb2;   v14[-1].Control = 0xE0;   v3[-1].Parameters.WMI.ProviderId = (ULONG_PTR)urb2;   v3[-1].MajorFunction = v3->MajorFunction;   v3[-1].Parameters.Read.ByteOffset.LowPart = 0x220003;   v3[-1].DeviceObject = *(PDEVICE_OBJECT *)(*(_QWORD *)(a1 + 64) + 8i64);   if ( (int)HumIncrementPendingRequestCount(v15) < 0 )   {     ExFreePool(urb2);     result = 0xC000000E;   }   else   {     result = IofCallDriver(*(PDEVICE_OBJECT *)(*(_QWORD *)(a1 + 64) + 8i64), a2);     *a3 = 0;   }   return result; }
  可以看到,这里使用了控制请求来进行数据读取的。 #define HumBuildClassRequest(urb,                                         function,                                         transferFlags,                                         transferBuffer,                                         transferBufferLength,                                         requestType,                                         request,                                         value,                                         index,                                         reqLength){              (urb)->UrbHeader.Length = (USHORT) sizeof( struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);              (urb)->UrbHeader.Function = function;              (urb)->UrbControlVendorClassRequest.Index = (index);              (urb)->UrbControlVendorClassRequest.RequestTypeReservedBits = (requestType);              (urb)->UrbControlVendorClassRequest.Request = (request);              (urb)->UrbControlVendorClassRequest.Value = (value);              (urb)->UrbControlVendorClassRequest.TransferFlags = (transferFlags);              (urb)->UrbControlVendorClassRequest.TransferBuffer = (transferBuffer);              (urb)->UrbControlVendorClassRequest.TransferBufferLength = (transferBufferLength); }

新人来今日头条,能混的下去吗?能专心对待你的微头条,用心对待你的选题!耐心对待读者的反馈!恒心对待你入头条这件事!还有最重要价值千金的一句话告知是什么呢?无论做什么文章把最精彩,最高潮的部分放到开头!我的小心脏昨天刚成为院士的马斯克,今天就发布了超牛X的星际飞船和太空计划资料来源互联网作者Levin物联网智库整理发布导读停更了近两年半的星际飞船计划,今天由马斯克本人亲自来更新,背景还是一个近400英尺高的星舰飞船。昨日,美国国家工程院(NAE)公布特斯拉又召回了!近2。7万辆车热泵软件故障撰文纳沐编辑全佳欣出品电车圈工作室2月9日,美国国家交通安全管理局NHTSA发布消息称由于软件错误可能导致挡风玻璃除霜性能下降,特斯拉将在美国召回26681辆汽车。此次召回涉及到的从2699元跌至1849元,12GB256GB,小米热销旗舰迎来冰点价二月份将有一个重磅旗舰新机登场,也就是RedmiK50系列,虽然RedmiK50系列新机的档次不如小米公司此前所发布的小米12系列,但是Redmi旗下机型主打极致性价比,所以Red直击新能源出行痛点魏牌以0焦虑智能电动打造更优解从行业发展维度看,长城汽车需要以更大的市场权重在获得较好收益的同时,为我国乃至全球汽车行业转型提供更为有力的支撑从客户需求维度看,告别纯电时代的里程焦虑安全焦虑补能焦虑等享受更为前跨境电商普通人的翻身机会跨境电商,当下新兴的热门行业,满足了大多数人理想中的就业创业形式。更有国家政策的大力支持,针对跨境电商零售出口落实无票免税政策。也意味着我们当下,所在跨境平台所卖的一些衣服啊鞋子啊玩王者荣耀用哪款手机好些?除了挂机送人头的猪队友外,玩王者荣耀时最烦各种来电,正在酣战时,突然弹出接听画面,你说可气不可气。考虑到这种刚需,很多手机厂商推出了游戏模式,对来电界面进行了优化,比如来电只是在游学到了两个变相App双开的技能日更第328365天事情是这样的,几天前大船写了一篇文章,想再买个手机,随身带两个手机,表达了想再买一部手机的想法。因为不是很紧急,所以就没有急着买,然后有两个小伙伴看到我的文章后330亿元比特币被盗案告破,雌雄大盗落网!9。4万枚比特币如何追回图源央视近日,一对雌雄大盗落网了,他们与如今价值高达330亿元的比特币失窃案有关。早2016年8月,一家名为Bitfinex的加密货币交易所遭到了黑客攻击,大约12万枚比特币被盗。Linuxtcpdump抓包今天聊聊抓包吧,毕竟也是需要用到的。其实mantcpdump已经很全面了。我这里仅仅简单举例。今天不谈其他的抓包工具比如tsharkorwireshark复习的原因,客户反馈有rs近五成老年人找不到想看的电视节目,智能电视对老人来说有多难?说的一点也不假,现在的电视,真的没有什么好看的。除了广告就是电视剧。电视剧明知道是编出来的,如果想看这些东西手机上有的是,还可以随身带着观看,为什么要在电视上看呢?再说现在的电视都
智能黑板如何助力校本资源建设?近年来,学校信息化建设进程普遍加快,教育科研不断推进,学科融合不断深入,以智慧课堂智慧校园和智慧教育为代表的新教育初见端倪,教学质量进一步显现,学生潜力进一步发掘,学校整体的信息化领克01在欧洲市场销量曝光?劲头强势随着全球汽车行业的飞速发展,我国本土的汽车品牌自然也是毫不落后。比起多年之前我国汽车行业刚刚起步的时候,现在中国的汽车行业可谓是前景一片大好,甚至在有些方面比一些欧美和日本的老牌汽挪威,算不算是蔚来汽车进欧洲的好跳板?蔚来汽车的马可波罗计划终于,不再是无实物表演了。几天后,5月6日,蔚来汽车将正式发布关于挪威的最新战略,这是它的海外战略的第一步。值得一提的是,率先进军的是挪威市场,而并非此前风传3nm工艺大小核架构AMDZen5处理器还将探讨支持专用AI单元按照现在的计划,AMD明年推出5nmZen4处理器已经没跑了,支持DDR5及PCIe5。0,技术升级很大。不过在下一代的Zen5处理器还会有什么变化?AMD最新表态或许能从中管窥一谁是越野界的真英雄?实践哈弗H92022款每个人的内心深处都有对英雄的尊崇和向往,并且也都有一位或多位英雄的存在。他们或许是电影中的钢铁侠超人等虚幻的宇宙英雄,也可能是警察医生等令人崇敬的职业英雄,还可能是父母朋友陌生人等不同路快一步,跨越速运双亮剑双11,承诺限时未达,全额退款随着双十一临近,各大电商平台的GMV以及快递订单量持续暴涨,海量的物流运力资源也提前被各大电商巨头抢占,B端企业运力紧缺的问题愈发严重。众所周知,C端电商企业能收获如此大规模的订单用伟巴斯特通行证坐蔚来汽车去车展!维权女车主现身发声近日,因为上海车展车顶维权,特斯拉被送到了舆论的风口浪尖之上。女车主则付出了行拘5日的代价。而今,女车主已经被释放,并且向特斯拉公开的数据,提出了多处质疑,而特斯拉方面,还没有完全经典Windows组件大更新微软已经推送了Win11正式版,但并不是所有的自带组件都得到完全重构,例如记事本就基本保持了原先的样子。但根据一名微软员工泄露的截图,记事本将会在今年晚些时候完成重大设计升级。在W2022年京东方在全球大尺寸LCD份额预计将达28。92022年京东方在全球大尺寸LCD份额预计将达28。9。第四届数字中国建设成果展上,京东方高级副总裁智慧系统创新事业CEO陆宽介绍,群智咨询(Sigmaintell)预测,到202上京东薅羊毛同款城野医生果酸精华水比天猫便宜30元油皮加上熬夜,导致我这脸上三角区的肤质特别差,还好一直用着城野医生的毛孔收敛水。这不趁着购物节,想打开天猫再囤一瓶,不知道能优惠多少。本来是还想入同款的城野医生毛孔收敛水的,结果打能称得上是20万最速量产车?聊聊领克03古往今来,速度在人类的脑海中从未消散,不管是老时期的田间赛马还是汽车发明之后一场又一场的赛车运动,大家似乎对速度的追求越来越极致,而在百年的汽车工业发展历程中市场上也涌现了大量的以