处理筛选器驱动程序中的系统 Set-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. 调用 PoStartNextPowerIrp 以启动下一个电源 IRP。 仅 (Windows Server 2003、Windows XP 和 Windows 2000。)

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

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

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

  6. 从其 DispatchPower 例程返回STATUS_PENDING。