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可支持停用启用操作。它的设备属性中有个标志位:


b.对于一些不支持停用启用的设备,其设备属性的状态中并没有这样的标志位,如PCI Standard ISA bridge设备:


大概这就是区别吧,望高手指正,谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值