HID设备虚拟触摸屏上报的多点数据系统不响应
前一般时间在Windows10下使用USB驱动虚拟了一个触摸屏设备,上层软件按照HID报告述符的格式下发触摸屏数据给驱动,再由驱动将数据上交给系统,实现虚拟触摸屏的功能。
今天,突发奇想,上次的报告描述符仅支持的是一个点触摸效果,今天保不实现了一下多点触摸效果,所以我通过在一个支持多点触摸屏的设备抓包,修改报告描述符的内容,HID描述符中关于报告描述符字段的数据长度,重新编译,本以为很简单的事,没想到还是翻车了。
windbg下打印上报的数据
99 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00 00 01
WriteLen=56/56
99 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 00 00 00 01
WriteLen=56/56
99 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 56 00 00 00 01
WriteLen=56/56
99 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 57 00 00 00 01
WriteLen=56/56
99 00 F4 01 C0 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 57 00 00 00 01
按照上报的数据提交给系统,但是windows桌面没有任何效果。
本人经过多翻查找,最终发现是因为这个报告描述符中含有特性描述符的内容,而本人在虚拟虚拟驱动中并没有相关的功能支持,所以可导致虽然上报的是虚拟触摸屏的数据,但是系统会为此数据不正确导致丢弃。
所以这里,本人将关于Feature相关的内容注释掉,并修改相关的报告描述符长度字段,再次加载,一切正确。
新的问题
坦率的讲,注释了之后,确实可以实现触摸屏的功能,但只支持单点触摸效果。就算按报告描述符的内容填充多点数据,但系统会将所有的数据丢弃,这样连单点的效果也没有了。关于这个问题的解决方案,本人研究了一天,通过抓包分析,对比,模拟真实设备的数据,最终在赶下班前的8分钟后给实现了。但是,是为什么要这样做,我还不知道,这是一个知识点。待明天好好研究一下,再来给大家分享。
题外话:
这里我不得自己夸奖一下自己,是有多么先见之明。自己之前搞的一个HidReportParser.exe工具,会自动对HID报告描述符进行解析,并生成可直接在C语言中用的数据格式。这大大提高了工作效率,将以前可能需要一天的活,一秒种就干完了,而且还准确,简洁。
不过今天也发现了一个BUG,就是当报告描述符有问题时,会没有任何提示给崩掉。这点后续还得继续改进。