取消 USB 空闲请求

在某些情况下,设备驱动程序可能需要取消已提交到总线驱动程序的闲置请求 IRP。如果设备已移除,且进入闲置状态且发送闲置请求后变为活动状态,或者如果整个系统正在过渡到低系统能耗状态,则可能会发生此情况。

客户端驱动程序通过调用 IoCancelIrp 来取消闲置 IRP。 下表介绍了取消闲置 IRP 的三种情况,并指定了驱动程序必须执行的操作:

情况闲置请求取消机制
客户端驱动程序已取消闲置 IRP,但 USB 驱动程序堆栈 尚未 调用 USB 空闲通知回调例程

USB 驱动程序堆栈完成闲置 IRP。由于设备从不保留 D0,因此,驱动程序不会更改设备状态。

客户端驱动程序已取消闲置 IRP,USB 驱动程序堆栈已调用 USB 空闲通知回调例程,但尚未返回。

虽然闲置请求已取消,但可能仍然调用了 USB 空闲通知回调例程。 在这种情况下,客户端驱动程序的回调例程必须仍然通过将设备同步发送到低能耗状态,从而关闭设备。

当设备处于低能耗状态时,客户端驱动程序随后即可发送 D0 请求。

此外,驱动程序可等待 USB 驱动程序堆栈完成闲置 IRP,然后发送 D0 IRP。

如果由于内存不足,导致回调例程无法将设备置于低能耗状态来分配电源 IRP,则应取消闲置 IRP 并立即退出。回调例程返回后,闲置 IRP 才会完成,因此,回调例程不应阻止等待取消的闲置 IRP 完成。

设备已处于低能耗状态。

如果设备已处于低能耗状态,客户端驱动程序即可发送 D0 IRP。USB 驱动程序堆栈使用 STATUS_SUCCESS 完成闲置请求 IRP。

此外,驱动程序可取消闲置 IRP,等待 USB 驱动程序堆栈完成闲置 IRP,然后发送 D0 IRP。

 

相关主题

USB 选择性挂起
USB 电源管理

 

 

显示:
© 2014 Microsoft