停止设备以重新平衡资源

下图显示了停止和重启设备以重新平衡资源所涉及的 IRP 序列。

说明停止设备以重新平衡资源的示意图。

以下注释对应于上图中带圆圈的数字:

  1. PnP 管理器发出 IRP_MN_QUERY_STOP_DEVICE ,询问设备的驱动程序是否可以停止设备并释放其硬件资源。

    如果设备堆栈中的所有驱动程序都返回STATUS_SUCCESS,则驱动程序会将设备置于停止挂起状态 (停止挂起) ,可从中快速停止设备。

    如果设备堆栈返回除STATUS_SUCCESS以外的任何内容,它将不参与重新平衡过程。 由于资源重新平衡是一项尽力而为的操作,在这种情况下,系统仍会尝试重新平衡操作以满足系统中设备的资源要求。 但是,如果设备失败查询停止,可能无法在 (获得所需的结果,例如,如果枚举新设备并触发重新平衡,则它可能无法接收其所需的资源,因此最终无法启动) 。

    查询停止操作失败的设备将继续处于运行状态,即使查询停止失败。

    PnP 管理器根据需要查询尽可能多的设备堆栈,以重新平衡所需的资源。

  2. PnP 管理器发出 IRP_MN_STOP_DEVICE 来停止设备。

    在 Windows 2000 及更高版本的 Windows 上,仅当设备的上一个查询停止 IRP 成功完成时,PnP 管理器才会发送停止 IRP。 为了响应停止 IRP,驱动程序释放设备的硬件资源 (,例如其 I/O 端口) 并保留需要访问设备的任何 IRP。

  3. 成功重新平衡资源后,PnP 管理器 会发出IRP_MN_START_DEVICE 请求,以重启在重新平衡期间停止的任何设备。

  4. 否则,PnP 管理器通过发送 IRP_MN_CANCEL_STOP_DEVICE来取消查询停止 IRP。

    为了响应 IRP_MN_CANCEL_STOP_DEVICE,设备的驱动程序将设备返回到启动状态并恢复处理设备的 I/O 请求。

    如果堆栈中的一个驱动程序使请求失败,或者整体重新平衡操作失败,并且正在取消其所有查询停止请求,则 PnP 管理器将取消设备堆栈的查询停止。 当 PnP 管理器仅取消一个设备堆栈上的查询停止时,它会发送 IRP_MN_CANCEL_STOP_DEVICE 请求,因为查询失败的驱动程序上方附加的任何驱动程序都使设备处于停止挂起状态。 当IRP_MN_CANCEL_STOP_DEVICE成功时,驱动程序已将设备返回到启动状态。

  5. 如果驱动程序在重新平衡资源后无法重启设备,PnP 管理器会将删除 IRP 发送到 Windows 2000 及更高版本的 Windows) 上的设备堆栈 (。

    PnP 管理器首先发送 IRP_MN_SURPRISE_REMOVAL 请求。 然后,它发送 IRP_MN_REMOVE_DEVICE 请求,但仅在关闭设备的所有打开句柄之后。

重新平衡 PnP 设备的硬件资源必须对应用程序和最终用户透明。 用户可能会遇到暂时的操作延迟,但数据不得丢失。 处理停止 IRP 时,必须考虑到这一点。