FDO またはフィルター DO を作成するドライバーは、関連付けられている PDO の IRP_MN_WAIT_WAKE 要求を受け取るとき、IRP を次の下位ドライバーに渡すか、IRP を渡す前に特定のアクションを実行できます。
ウェイクアップをサポートするデバイスの場合
待機/ウェイク IRP を受信すると、ファンクションまたはフィルター ドライバーは、以下の手順を実行する必要があります。
IoAcquireRemoveLock を呼び出し、現在の IRP を渡して、待機/ウェイク IRP の処理中にドライバーが PnP IRP_MN_REMOVE_DEVICE 要求を受け取らないようにします。
IoAcquireRemoveLock が失敗ステータスを返した場合、ドライバーは IRP の処理を続行すべきではありません。 代わりに、IRP (IoCompleteRequest) が完了し、エラー ステータスが返されます。
Irp->Parameters.WaitWake.PowerState の値を調べ、現在のデバイスの電源状態を、DEVICE_CAPABILITIES 構造の DeviceState[SystemWake] と比較します。
デバイスでウェイクアップがサポートされているが、指定された SystemWake 状態から、または現在のデバイス電源状態からのウェイクアップはサポートされていない場合、ドライバーは以下のように IRP を失敗させる必要があります。
- Irp->IoStatus.Status で STATUS_INVALID_DEVICE_STATE を設定します。
- IRP (IoCompleteRequest) を完了し、IO_NO_INCREMENT の優先度ブーストを指定します。
- DispatchPower ルーチンから Irp->IoStatus.Status に設定された状態を返します。
それ以外の場合、IoSetCompletionRoutine を使用して IRP の IoCompletion ルーチンを設定します。 IoCompletion ルーチンは、ドライバーがデバイスを動作状態に返すために必要なタスクをすべて実行する必要があります。
IRP が取り消されると、IoCompletion ルーチンも呼び出されます。
ドライバーが必要とする可能性がある情報を IoCompletion ルーチンに保存します。
IoCallDriver (Windows 7 と Windows Vista の場合) を呼び出すか、PoCallDriver (Windows Server 003、Windows XP、Windows 2000 の場合) を呼び出し、待機/ウェイク IRP を次の下位ドライバーに渡します。
IoReleaseRemoveLock を呼び出し、以前に取得したロックを解放します。
DispatchPower ルーチンから STATUS_PENDING を返します。 ドライバーは、IRP を保持している間、Irp->IoStatus.Status の値を変更しないでください。
ウェイクアップをサポートしていないデバイスの場合
ファンクションまたはフィルター ドライバーがウェイクアップをサポートしていないデバイスの待機/ウェイク IRP を受け取った場合、ドライバーは次のように IRP を失敗させる必要があります。
IRP (IoCompleteRequest) を完了し、IO_NO_INCREMENT の優先度ブーストを指定します。
DispatchPower ルーチンから Irp->IoStatus.Status に設定された状態を返します。