【问题标题】:Is there a way to detect whether Windows is installing a device driver?有没有办法检测 Windows 是否正在安装设备驱动程序?
【发布时间】:2017-02-21 13:28:01
【问题描述】:

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

问题: 为了更新固件,我们发送一个命令并告诉设备进入启动模式。设备使用新的 VID 和 PID 重新枚举。在以前没有连接过处于引导模式的设备的新机器上更新固件时,Windows 会在引导加载程序出现时“安装驱动程序”跳舞。 (没有要安装的驱动程序)。软件收到 DEVICE ATTACHED 事件,因此我们开始固件更新。一旦 Windows 完成“安装”驱动程序,它就会取消枚举并重新枚举设备,在更新过程中关闭我们的文件句柄。

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

【问题讨论】:

  • 如果“安装驱动程序”的可执行文件正在系统上运行,你为什么不检查,比如 3 秒间隔 9 秒?
  • 另外,我认为您可以记录您在应用程序中看到此设备的次数,以便您知道这是不是第一次,您需要等待。
  • @r1verside,我已经尝试过等待,但到目前为止,这似乎不是一个非常干净或有效的解决方案。根据 Windows 是否决定在线检查驱动程序、用户的连接速度等,等待的时间可能会有很大差异。另外,如果我能提供帮助,我宁愿不要浪费用户每次更新固件时等待的时间。 (如果 Windows 在后续固件更新中识别出该设备,则无需等待)。
  • 如果您担心驱动程序安装会占用不必要的时间,为什么不给它想要的东西呢?首先使用正确的 VID/PID 安装虚拟驱动程序。如果它是恒定的,你只需要做一次;如果是动态的,你必须自己做一点舞蹈。重点是,你是那个跳舞的人,所以你知道什么时候结束。

标签: c# windows usb hid


【解决方案1】:

也许是一种告诉 Windows 我们不想在连接到设备时安装驱动程序的方法?

Microsoft 的开发人员网络有一个硬件开发部分。他们有一篇文章specifically about this issue。重要的是,该文档指出您的设备安装应用程序应该“确定其他安装活动是否正在进行在执行其安装之前”(强调我的)并且 - 如果发现挂起的安装 - “应该退出”。

声明的最后一部分似乎表明 Microsoft 优先考虑已安装或 待处理 设备应用程序安装。

如果您的问题陈述准确:

在以前未连接过处于引导模式的设备的新机器上更新固件时,Windows 会在引导加载程序出现时“安装驱动程序”跳舞。

听起来您可能不走运 - 或违反惯例 - 尝试抢占驱动程序安装行为。

我会使用上面提到的CMP_WaitNoPendingInstallEventsfunction,然后固件更新你的设备。我认为 VID/PID 在这里是无关紧要的,这取决于您的固件更新代码在哪里运行。它看起来像 OSR 在线论坛 has a question of the same nature 并假定相同的优先级(驱动程序安装)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2019-09-25
    • 2010-12-07
    • 2011-04-14
    相关资源
    最近更新 更多