使筛选器或函数驱动程序中的系统 Query-Power IRP 失败

如果以下任一情况成立,则不是设备电源策略所有者的筛选器或函数 (驱动程序) 可能会使 IRP_MN_QUERY_POWER 请求失败:

  • 为设备启用唤醒,并且请求的系统电源状态低于 SystemWake 的值,该值指定设备可从中唤醒系统的最小功率状态。 例如,如果设备可以从 S2 唤醒系统,但不能从 S3 唤醒系统,则对 S3 的查询会失败,但会成功查询 S2。

  • 输入与所请求状态对应的设备电源状态将强制驱动程序放弃丢失数据的操作,例如打开的调制解调器连接。 由于此原因,驱动程序很少会使查询失败;在大多数情况下,应用程序会处理此类情况。

若要使系统电源状态 的IRP_MN_QUERY_POWER 请求失败,驱动程序应执行以下步骤:

  1. 调用 PoStartNextPowerIrp 以指示驱动程序已准备好处理下一个电源 IRP。 仅 (Windows Server 2003、Windows XP 和 Windows 2000)

  2. Irp-IoStatus.Status> 设置为失败状态并调用 IoCompleteRequest,指定IO_NO_INCREMENT。 不要在设备堆栈中向下传递 IRP。

  3. 调用 IoReleaseRemoveLock 以释放以前获取的锁。

  4. 从其 DispatchPower 例程返回失败状态。