安装自己研HID虚拟触摸屏驱动后系统重启需要5-10分钟的问题
从2021年7-8月份吧,有一个需求就是搞一个HID触摸屏驱动,当时心想,这玩意不要太简单,可事实之于这件事,是没有那么简单的。先不话一位同事的算法的曲折,另一位同事固件的曲折,没想到到我身上,把一个BUG也带到了今日。
虚拟实现的功能比较简单,就是通过同事的自定义BULK端点读取原始的触摸屏数据,然后交由算法处理,得出计算后的触摸屏报告数据。自己然后将这个数据再交给虚拟触摸屏设备,这样实现真实的触摸屏效。
自己以前实现了一个虚拟的触摸屏演示效果可见:https://www.bilibili.com/video/BV1pu411S7us
随着以上事情的曲折开发,自己在这个事上也是三心二意的在搞,给同事弄了一个测试DEMO功能后,就去忙别的事了。悠闲的晒着午后的太阳,不要太得瑟。
2021年的最后个月,西安新冠疫情紧张,23日凌晨封城,所以我们也开始了居家上班,那叫一个酸爽啊,小孩上网课,媳妇处理工作,我也在弄工作。描述这件事感觉一切井井有条,可实际上是唾沫横飞,兵荒马乱才对,还要担心着一家三口的生计问题…
在这种情况下,我又开始了HID虚拟触摸屏之路。
两位同事在固件和算法上有了巨大的突破,我需要调整驱动。美滋滋地出了一版本,其实是忐忑不安的,因为了大家的巨大调整,我也需要进行大幅度的改变,写了一大堆的代码。没有双机调试的日子里总是那么地悲催,无限的蓝屏分析还要不停地远程签名。生活原来也有黑暗的时刻,就如当前西安的疫情一样…
半交半错的几天,自己受不了弄了一个日志打印,记录日志,可无奈重启系统,你在关机的时候,日志不一定能写入,而我遇到了一定是不写入的。但这个不写入我不知道是没有调用,还是没有写入。因没关才机过程中,你知道文件IO关闭在前还是你的驱动在前?
最后经过自己的测入试验,终于得到一个结论,与一个线程有关?那问题来是,这个线程退出的条件是驱动在调用IRP_MN_REMOVE_DEVICE时,所以还是那句话,调不调用的问题。
以前的经验是调用的,不过这几天自己否定了自己的以前,迷糊了。
小孩要去楼下(这会可以下楼,只要不聚集,但还是不能出小区)。自己懵逼的时候,想想下去吹吹冷风好好思考一下。神游般地在楼下待了2小时,冷的受不了才上楼。继续测试。
还好手中有个CAMERA,自己没办法用这个摄像头来测试,在自己的电脑上测试,禁用驱动签名,重新搞一个驱动,用着自己的日志记录函数,果不其然,重启电脑,IRP_MN_REMOVE_DEVICE调用的日志没有记录上。
那我们试试电源更改的状态,即IRP_MJ_POWER的处理,自己写了个代码:
case IRP_MJ_POWER:
{
{
PIO_STACK_LOCATION irpStack;
POWER_STATE powerState;
POWER_STATE_TYPE powerType;
irpStack = IoGetCurrentIrpStackLocation(Irp);
powerType = irpStack->Parameters.Power.Type;
powerState = irpStack->Parameters.Power.State;
PrintLog("FDO IRP_MJ_POWER irpStack->MinorFunction=%d,powerType=%d powerState=%d\n", irpStack->MinorFunction, powerType, powerState);
if (irpStack->MinorFunction== IRP_MN_SET_POWER)
{
if (powerType == DevicePowerState)
{
PrintLog("FDO IRP_MN_SET_POWER/DevicePowerState=%d\n", powerState);
}
}
}
PoStartNextPowerIrp(Irp);
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
}
不过很遗憾,还是没有日志记录。
没办法了?
自己突发想到可以看系统关机的回调吧,搜索了一下,果然有。在系统关机IRP时,执行线程退出事件激活,这样一试。嘿,还真他娘的起作用。我莫非还是个天才!?
话不多话了,这个注册回调的示例代码分享在:http://www.pnpon.com/article/detail-262.html
问题没有解决,终是绕过去了,下回继续努力。