处理 IRP_MN_CANCEL_STOP_DEVICE 请求(Windows 2000 和更高版本)

IRP_MN_CANCEL_STOP_DEVICE请求必须先由设备的父总线驱动程序处理,然后由设备堆栈中下一个更高的驱动程序处理。 驱动程序在其 DispatchPnP 例程中处理停止 IRP。

为了响应 IRP_MN_CANCEL_STOP_DEVICE 请求,驱动程序必须将设备返回到其启动状态并恢复正常操作。 驱动程序必须成功执行取消-停止 IRP。

驱动程序使用如下过程处理 IRP_MN_CANCEL_STOP_DEVICE 请求:

  1. 推迟重启设备,直到较低的驱动程序完成其重启操作。 (请参阅 推迟 PnP IRP 处理,直到较低的驱动程序完成。)

  2. 低级驱动程序完成后,将设备返回到其启动状态。

    确切的操作取决于设备和驱动程序。

  3. 在 IRP 保留队列中启动 IRP。

    如果驱动程序在设备处于停止挂起状态时保留请求,请清除HOLD_NEW_REQUESTS标志并启动 IRP 保留队列中的 IRP。 有关详细信息,请参阅在 设备暂停时保留传入 IRP

  4. 使用 IoCompleteRequest 完成 IRP。

    • 在函数或筛选器驱动程序中:

      驱动程序的 IoCompletion 例程返回STATUS_MORE_PROCESSING_REQUIRED,如 将 PnP IRP 处理推迟到较低驱动程序完成中所述,因此驱动程序的 DispatchPnP 例程必须调用 IoCompleteRequest 以恢复 I/O 完成处理。

      驱动程序将 Irp-IoStatus.Status> 设置为 STATUS_SUCCESS,调用优先级提升为 IO_NO_INCREMENT 的 IoCompleteRequest,并从其 DispatchPnP 例程返回STATUS_SUCCESS。

      驱动程序不得使此操作失败。 如果驱动程序重启 IRP 失败,则设备处于不一致状态,无法正常工作。

    • 在父总线驱动程序中:

      驱动程序将 Irp-IoStatus.Status> 设置为 STATUS_SUCCESS,并调用 IoCompleteRequest 以指定IO_NO_INCREMENT的优先级提升。 总线驱动程序从其 DispatchPnP 例程返回STATUS_SUCCESS。

      总线驱动程序不得使此操作失败。 如果驱动程序重启 IRP 失败,则设备处于不一致状态,无法正常工作。

当设备启动并处于活动状态时,驱动程序可能会收到虚假的取消-停止请求。 例如,如果驱动程序 (或设备堆栈中较高级别的驱动程序) IRP_MN_QUERY_STOP_DEVICE请求失败 ,则可能会发生这种情况。 当设备启动并处于活动状态时,驱动程序可以安全地成功针对该设备的虚假取消-停止请求。