处理 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 请求:
推迟重启设备,直到较低的驱动程序完成其重启操作。 (请参阅 推迟 PnP IRP 处理,直到较低的驱动程序完成。)
低级驱动程序完成后,将设备返回到其启动状态。
确切的操作取决于设备和驱动程序。
在 IRP 保留队列中启动 IRP。
如果驱动程序在设备处于停止挂起状态时保留请求,请清除HOLD_NEW_REQUESTS标志并启动 IRP 保留队列中的 IRP。 有关详细信息,请参阅在 设备暂停时保留传入 IRP 。
使用 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请求失败 ,则可能会发生这种情况。 当设备启动并处于活动状态时,驱动程序可以安全地成功针对该设备的虚假取消-停止请求。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈