天天看点

windows设备停用启动杂记

    公司(OEM厂商)的电脑升级到win10 RS2 RTM后,发现有部分MS inbox驱动在电源事件后会出现黄标的现象(ErrorCode=43--QueryRemove失败)甚至driver lost。MS虽然承认是他们的issue,但是至少要到6月底才修复。于是,部门决定让我做个work around:出现黄标时Reset设备(其实就是停用-启用设备),并额外要求由于这个WA需要给产线使用,所以Reset设备时,最好不能重启电脑。其实代码实现可以参考MS ddk中devcon提供的源码,只是在测试过程中我想到这么个事:

1.并非所有的设备在停用启用过程中需要重启电脑生效,windows如何判断设备需要重启?

2.也并非所有设备都支持停用启用的操作,右键这部分设备,会发现并没有停用/启用的功能,比如一些关在Root下的虚拟驱动:即插即用设备枚举器(驱动文件:swenum.sys,设备HWID:ROOT\SWENUM);卷管理器(驱动文件:volmgr.sys,设备HWID:ROOT\VOLMGR),再比如一些ACPI设备:ACPI Lid(驱动文件:无,设备HWID:ACPI\PNP0C0D)。Windows又是通过什么决定设备是否支持停用启动功能?

对于问题1。我首先觉得可能停用启用设备时,需要重新加载设备栈的设备可能会要求重启。求教公司的大神,大神觉得有2种可能:

a.设备对应的service在注册表中的StartType项如果等于0,停用启动过程中可能会被要求重启电脑。比如给HDD设备通过SetupDi API簇安装过滤驱动,会被要求重启电脑生效。这时就需要把Setup API做的步骤分解,用非标准的手段(不调用SetupDI API来修改注册表/拷贝文件等)规避重启的过程。

b.停用设备时,设备上可能有句柄打开。(对于这个我想到用windbg扩展命令!devhandles检查打开设备的句柄,然而这个命令除了卡,根本达不到预期效果。看来有空我要试试用windbg脚本实现这个功能)

对于问题2。我观察设备管理器中各个设备的devnode的属性,发现这么个现象:

a.USB Root Hub可支持停用启用操作。它的设备属性中有个标志位:

windows设备停用启动杂记

继续阅读