处理对存储外设的电源请求

存储类驱动程序负责发出特定于设备的命令来处理电源请求。 最常见的是存储类驱动程序:

  • 如果处理此类 I/O 可能会阻止驱动程序在合理的时间内成功执行设置电源请求,则阻止其设备的 I/O 以响应查询电源请求 (IRP_MJ_POWER IRP_MN_QUERY_POWER)

  • 使用 IRP_MN_SET_POWER) 设置设备电源状态以响应设置电源请求 (IRP_MJ_POWER

  • 重启设备 I/O,以响应设置电源请求来启动设备

  • 将电源请求转发到下一个较低的驱动程序。

请注意,驱动程序必须调用 PoStartNextPowerIrpPoCallDriver,而不是 IoCallDriver 来发送电源请求。

除非存储类驱动程序具有 StartIo 例程,否则在设置设备的电源状态之前,它应使用SRB_FUNCTION_LOCK_QUEUE) 锁定存储端口驱动程序特定于 LU 的队列 (IRP_MJ_SCSI,以阻止未同步的操作,直到电源操作 (这可能涉及几个步骤) 完成。 为处理电源操作而发出的任何 SRB 都应设置SRB_FLAGS_BYPASS_LOCKED_QUEUE,以确保它们到达端口驱动程序。 驱动程序完成电源状态设置后,应使用SRB_FUNCTION_UNLOCK_QUEUE和SRB_FLAGS_BYPASS_LOCKED_QUEUE) 解锁队列 (IRP_MJ_SCSI,以便端口驱动程序在通电后可以继续向设备发送排队的 IRP。

如果存储类驱动程序具有 StartIo 例程,该例程将处理同步,因此类驱动程序不必显式锁定和解锁端口驱动程序的特定于 LU 的队列。

类驱动程序不应尝试绕过由另一个驱动程序锁定的队列。