有没有办法检测Windows系统是否正在安装设备驱动程序?

8

情况: 我们有一个软件套件,与我们内部构建的设备进行交互。该设备在固件更新期间使用HID进行通信,除了在引导模式下。在引导模式下,该设备使用不同的VendorID和ProductID,并使用WinUSB进行通信。

问题: 为了更新固件,我们发送一条命令告诉设备进入引导模式。设备重新枚举新的VID和PID。在连接过程中,如果是新机器且之前没有连接过引导模式的设备,Windows会执行“安装驱动程序”的操作(实际上并没有需要安装的驱动程序)。软件接收到“设备已连接”事件,因此我们开始进行固件更新。一旦Windows完成“安装”驱动程序,它会重新枚举设备,关闭我们正在进行更新的文件句柄。

问题: 是否有一种方法可以检测Windows是否正在安装驱动程序,以便我们可以等待设备重新枚举然后开始更新过程?在我们的安装过程中是否有什么我们可以做的来预防这种行为?也许有一种方法可以告诉Windows,在连接到设备时不允许安装驱动程序?


1
@r1verside,我已经尝试了一段时间的等待,但目前看来这似乎不是一个非常干净或有效的解决方案。根据Windows是否决定在线检查驱动程序、用户的连接速度等因素,等待时间可能会大大变化。此外,如果可以的话,我宁愿不浪费用户在每次更新固件时等待的时间。(如果Windows在后续固件更新中识别设备,则无需等待)。 - GPearson
4
如果您担心驱动程序的安装需要耗费不必要的时间,为什么不按照它想要的方式去做呢?首先使用正确的VID/PID安装一个虚拟驱动程序。如果它是固定的,您只需要执行一次;如果它是动态的,您需要自己进行一些步骤。关键是您在操作,所以您知道何时完成。 - Jeroen Mostert
@DavidGrayson 我同意,我希望我们在两者之间使用相同的接口时更加一致,但我既不是硬件开发人员也不是固件开发人员。现在已经发布给公众了,改变它有点太晚了。不过,我肯定会在未来努力倡导这种策略。 - GPearson
@JeroenMostert,我一定会尝试找到一种方法来实现这个功能 - 我想知道是否可以查询注册表以查看Windows是否已经完成了驱动程序的“安装”,此时连接并开始更新应该是安全的。 - GPearson
1
Duplicate http://stackoverflow.com/questions/23925594/how-to-check-if-windows-is-busy-by-installing-any-driver - Emily
显示剩余4条评论
1个回答

1
也许有一种方法可以告诉Windows,在连接设备时不允许驱动程序安装?
Microsoft的开发人员网络有一个硬件开发部分。他们有一篇关于这个问题的具体文章。重要的是,该文档指出,您的设备安装应用程序应该在执行安装之前“确定是否存在其他安装活动”,并且-如果找到挂起的安装-“应该退出”。
该声明的最后一部分似乎表明,Microsoft优先考虑已经安装或挂起的设备应用程序安装。
如果您的问题陈述是准确的:
当在新机器上更新固件时,如果以前没有将设备连接到引导模式,则Windows会在引导加载程序显示时进行“安装驱动程序”的操作。
听起来你可能没那么幸运,或者试图打破惯例,企图预先阻止驱动程序安装行为。
我会利用上述提到的 CMP_WaitNoPendingInstallEvents function,然后更新您的设备固件。我认为 VID/PID 在这里无关紧要,取决于您的固件更新代码在哪里运行。看起来 OSR Online 论坛 有一个相同性质的问题,并假定相同的优先级(驱动程序安装)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接