处理对存储外设的电源请求
存储类驱动程序负责发出特定于设备的命令来处理电源请求。 最常见的是存储类驱动程序:
如果处理此类 I/O 可能会阻止驱动程序在合理的时间内成功执行设置电源请求,则阻止其设备的 I/O 以响应查询电源请求 (IRP_MJ_POWER IRP_MN_QUERY_POWER)
重启设备 I/O,以响应设置电源请求来启动设备
将电源请求转发到下一个较低的驱动程序。
请注意,驱动程序必须调用 PoStartNextPowerIrp 和 PoCallDriver,而不是 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 的队列。
类驱动程序不应尝试绕过由另一个驱动程序锁定的队列。