次の方法で共有


IRP_MN_WAIT_WAKE

この IRP を使用すると、ドライバーはシステムやデバイスのスリープ状態を解除することができます。

主要なコード

IRP_MJ_POWER

送信時

電源ポリシーを所有するドライバーは、PDO をこの IRP のターゲットにして、電話の着信などの外部イベントに応答してデバイスのスリープ状態を解除できるようにします。 ドライバーは、この IRP を送信するために PoRequestPowerIrp を呼び出す必要があります。

一般的な規則として、ドライバーは、デバイスのスリープ状態からの復帰を有効にする必要があると判断するとすぐに、この IRP を送信する必要があります。 そのため、このようなほとんどのデバイスのドライバーは、デバイスの電源を入れた後と、IRP_MN_START_DEVICE 要求を完了する前に、この IRP を送信します。

ただし、ドライバーは、デバイスが動作状態 (PowerDeviceD0) であれば、いつでも IRP を送信することができます。 デバイス スタックは遷移中であってはなりません。つまり、他の電源 IRP がデバイス スタックでアクティブになっている間、ドライバーは IRP_MN_WAIT_WAKE を送信しないようにする必要があります。

待機/ウェイク IRP は、デバイスまたはシステムの電源状態を変更しません。 デバイスからのスリープ解除信号を有効にするだけです。 スリープ解除信号が到着すると、ポリシー所有者は PoRequestPowerIrp を呼び出して、電源設定 IRP を送信し、デバイスを D0 に返す必要があります。

この IRP を送信するには、ドライバーが IRQL = PASSIVE_LEVEL で実行されている必要があります。 ただし、IRP は IRQL = DISPATCH_LEVEL で完了することができます。

入力パラメーター

Parameters.WaitWake.PowerState には、デバイスがシステムの起動を許可する最小 (最も低い電力) のシステム電源状態が含まれています。

出力パラメーター

なし。

I/O 状態ブロック

ドライバーは、Irp->IoStatus.Status を次のいずれかに設定します。

STATUS_PENDING
ドライバーが IRP を受け取り、デバイスがスリープ解除を通知するのを待機しています。

STATUS_INVALID_DEVICE_STATE
デバイスが、デバイスの DEVICE_CAPABILITIES 構造体で指定された DeviceWake 状態よりも低い電力状態であるか、デバイスが、IRP で渡された SystemWake 状態からシステムを復帰させることができません。

STATUS_NOT_SUPPORTED
デバイスがスリープ解除をサポートしていません。

STATUS_DEVICE_BUSY
IRP_MN_WAIT_WAKE 要求はすでに待機中であり、別の IRP_MN_WAIT_WAKE 要求を発行する前に完了または取り消す必要があります。

STATUS_SUCCESS
デバイスがスリープ解除イベントを通知しました。

STATUS_CANCELLED
IRP が取り消されました。

ドライバーは、この IRP に失敗する必要がある場合、IRP をすぐに完了し、次の下位ドライバーに IRP を渡しません。

操作

ドライバーは、次の 2 つの理由のいずれかで IRP_MN_WAIT_WAKE を送信します。

  1. デバイスが、外部スリープ解除信号に応答してスリープ状態のシステムを復帰させるようにするため。

  2. デバイスが外部スリープ解除信号に応答してデバイスのスリープ状態から復帰できるようにするため。

IRP は、デバイス スタックの下に向かってデバイスのバス ドライバーに渡される必要があります。このドライバーは IoMarkIrpPending を呼び出し、DispatchPower ルーチンから STATUS_PENDING を返します。 スリープ解除信号が発生するまで、または IRP を送信したドライバーが IRP を取り消すまで、IRP は待機状態のままとなります。

1 つの PDO に対して待機中にできる待機/ウェイク IRP は、いつでも 1 つだけです。 ドライバーが既に PDO の待機/ウェイク IRP を保持している場合は、STATUS_DEVICE_BUSY を持つ追加の IRP を失敗させる必要があります。 複数の子 PDO を列挙するドライバーは、このような PDO ごとに待機中の待機/ウェイク IRP を持つことができます。

IRP がデバイス スタックを下へと移動すると、各ドライバーは IoCompletion ルーチンを設定します。 デバイスがスリープ解除イベントを通知すると、バス ドライバーはスリープ解除信号を処理し、IRP を完了して、STATUS_SUCCESS を返します。 つづいて I/O マネージャーは、次の上位ドライバーの IoCompletion ルーチンを呼び出して、デバイス スタックの上に向かって同じプロセスを繰り返します。

ドライバーは、待機/ウェイク IRP を送信するときに、PoRequestPowerIrp 呼び出しでコールバック ルーチンを指定する必要があります。 コールバック ルーチンでは、ドライバーは通常、デバイスにサービスを提供します。 たとえば、デバイスの電源ポリシー所有者は PoRequestPowerIrp を呼び出して、デバイス状態 D0 の IRP_MN_SET_POWER を送信する必要があります。

1 つのデバイスのバス ドライバーとして機能し、親デバイスのポリシー所有者として機能するドライバーは、子 PDO から IRP_MN_WAIT_WAKE 要求を受け取ると、親のデバイス スタックに対して IRP_MN_WAIT_WAKE IRP を要求します。 ドライバーが複数の子 PDO を列挙する場合、待機/ウェイク要求を送信する子 PDO の数に関係なく、ドライバーは、親のデバイス スタックに対して 1 つの待機/ウェイク IRP のみを要求する必要があります。 そうしない場合、このようなドライバーは、要求を受信するたびにカウントをインクリメントし、要求を完了するたびにカウントをデクリメントして、待機/ウェイク IRP の内部カウントを保持する必要があります。 待機/ウェイク IRP が完了した後にカウントが 0 以外の場合、ドライバーは、スリープ解除の処理を再度行うためにデバイス スタックに別の待機/ウェイク IRP を送信する必要があります。 詳細については、「デバイス ツリーを通じた待機/ウェイク IRP のパスの概要」を参照してください。

IRP_MN_WAIT_WAKE を取り消すには、ドライバーは IoCancelIrp を呼び出します。 IRP を発生させたドライバーのみが、これを取り消すことができます。 ドライバーは、次のいずれかが発生したときに待機中の IRP_MN_WAIT_WAKE を取り消します。

  • ドライバーが、デバイスを停止または削除する PnP IRP を受信したとき。

  • システムがスリープ状態になり、デバイスのスリープ解除信号がスリープを解除してはいけないとき。

要件

ヘッダー

Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目

PoRequestPowerIrp