处理筛选器或函数驱动程序中的系统 Query-Power IRP

不是设备电源策略所有者的筛选器或函数驱动程序 () 应按以下步骤将系统查询电源 IRP 传递给下一个较低级别的驱动程序:

  1. 调用 IoAcquireRemoveLock,传递当前 IRP,以确保驱动程序在处理电源 IRP 时不会收到 PnP IRP_MN_REMOVE_DEVICE 请求。

    如果 IoAcquireRemoveLock 返回失败状态,驱动程序不应继续处理 IRP。 相反,从 Windows Vista 开始,驱动程序应调用 IoCompleteRequest 来完成 IRP 并返回失败状态。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,驱动程序应调用 PoStartNextPowerIrp,调用 IoCompleteRequest 以完成 IRP,并返回失败状态。

  2. 确定是否应使查询失败。 有关指南,请参阅 在筛选器或函数驱动程序中使系统Query-Power IRP 失败 和完成该部分中所述的处理。

  3. 调用 PoStartNextPowerIrp。 (Windows Server 2003、Windows XP 和 Windows 2000 仅)

  4. (IoSkipCurrentIrpStackLocationIoCopyCurrentIrpStackLocationToNext) 设置 IRP 堆栈位置。 驱动程序可以在 IRP 中设置 IoCompletion 例程,但很少需要这样做。

  5. 在 Windows Server 2003、Windows XP 和 Windows 2000 中调用 Windows 7 中的 IoCallDriver (和 Windows Vista) 或 PoCallDriver (,) 将 IRP 传递给下一个较低的驱动程序。

  6. 调用 IoReleaseRemoveLock。 但是,如果驱动程序为 IRP 设置了 IoCompletion 例程,请改为从 IoCompletion 例程进行此调用。

  7. 从其 DispatchPower 例程返回STATUS_PENDING。