記憶域周辺機器への電源要求の処理
記憶域クラス ドライバーは、電源要求を処理するデバイス固有のコマンドを発行する役割を担います。 最も一般的な記憶域クラス ドライバーは次のとおりです。
このような I/O を処理すると、ドライバーが妥当な時間内に set-power 要求に成功できなくなる可能性がある場合に、クエリ電源要求 ( IRP_MN_QUERY_POWER で IRP_MJ_POWER) に応答してデバイスへの I/O をブロックします
set-power 要求に応答してデバイスの電源状態を設定します (IRP_MN_Standard Edition T_POWER で IRP_MJ_POWER)
set-power 要求に応答してデバイスへの I/O を再起動し、デバイスの電源をオンにします。
次の下位ドライバーに電源要求を転送します。
ドライバーは、電源要求を送信するために、IoCallDriver ではなく PoStartNextPowerIrp と PoCallDriver を呼び出す必要があることに注意してください。
記憶域クラス ドライバーに StartIo ルーチンがない限り、デバイスの電源状態を設定する前に、記憶域ポート ドライバーの LU 固有のキュー (SRB_FUNCTION_LOCK_QUEUEでIRP_MJ_SCSI) をロックし、電源操作が完了するまで同期されていない操作をブロックする必要があります (これには複数の手順が必要になる場合があります)。 電源操作を処理するために発行された SRB はすべて、ポート ドライバーに到達するように SRB_FLAGS_BYPASS_LOCKED_QUEUE 設定する必要があります。 ドライバーの電源状態の設定が完了したら、(SRB_FUNCTION_UNLOCK_QUEUE と SRB_FLAGS_BYPASS_LOCKED_QUEUE で IRP_MJ_SCSI) キューのロックを解除する必要があります。ポート ドライバーは、電源が入ったら、デバイスへのキューに登録された IRP の送信を再開できます。
記憶域クラス ドライバーに StartIo ルーチンがある場合、そのルーチンが同期を処理するため、クラス ドライバーはポート ドライバーの LU 固有のキューを明示的にロックおよびロック解除する必要はありません。
クラス ドライバーは別のドライバーがロックしたキューのバイパスをすることはできません。