デバイス電源状態についての IRP_MN_SET_POWER の処理

デバイスセット-電源 IRP は、1つのデバイスの状態の変更を要求し、デバイスのスタック内のすべてのドライバーに送信されます。 このような IRP は、i/o スタックの場所のDevicePowerStateメンバーにあるを指定します。

ドライバーは、スタック内を移動するときに、電源ダウン Irp を処理します。 電源設定の Irp の場合、ドライバーは、Irp がスタックを移動するときに Iocompletion ルーチンを設定し、irp がスタックを移動するときに iocompletion ルーチンで irp を処理します。 一般的なデバイススタック内のドライバーは、次のようにデバイスの設定-電源 IRP を処理します。

  • ほとんどのフィルタードライバーは、 Iomarkirppendingを呼び出して、IRP を次の下位のドライバーに渡し (「 電源 irp の受け渡し」を参照)、 DispatchPower ルーチンから STATUS_PENDING を返します。 ただし、フィルタードライバーによっては、着信 Irp のキューやデバイスの電源状態の保存など、デバイス固有のタスクを最初に実行する必要がある場合があります。

  • 関数ドライバーは、 Iomarkirppendingを呼び出し、デバイス固有のタスク (保留中の i/o 要求の完了、着信 i/o 要求の処理、デバイスコンテキストの保存、デバイスの電源の変更など) を実行し、必要に応じてiocompletionルーチンを設定し、デバイスの電源 irp を次の下位のドライバーに渡します (「電源 irp を渡す DispatchPowerルーチンから STATUS_PENDING を返します。

  • バスドライバーは、可能であればデバイスの電源を変更した後、 PoSetPowerState を呼び出して、新しいデバイスの電源状態を電源マネージャーに通知します。 Windows Server 2003、Windows XP、Windows 2000 のみでは、ドライバーはpostartnextpowerirpを呼び出して、電源状態を設定した後、次の電源 IRP を開始する必要もあります。 次に、ドライバーは、IO_NO_INCREMENT を指定して IRP を完了します。 ドライバーが IRP をすぐに完了できない場合は、 Iomarkirppendingを呼び出し、 DispatchPower ルーチンから STATUS_PENDING を返し、後で irp を完了します。

ターゲットデバイスが既に要求された電源状態にある場合でも、各関数またはフィルタードライバーは、IRP を次の下位のドライバーに渡す必要があります。 すべての set-power IRP は、デバイススタックをすべて停止してから、バスドライバーを完了する必要があります。

バスドライバーの上に配置されている関数ドライバーとフィルタードライバーは、デバイスセットの電源 IRP を失敗させることはできません。 デバイスが取り外されているか、削除されている場合、バスドライバーはデバイスの電源投入の IRP を失敗させる可能性があります。

ドライバースタック内の各ドライバー (関数、フィルター、およびバスドライバー) は、対応するデバイスオブジェクトの電源状態の変化を電源マネージャーに通知するために、 PoSetPowerState を呼び出す必要があります。

デバイスの電源投入と電源切断に関連する他のドライバータスクと同様に、 PoSetPowerState の呼び出しは、デバイスの電源オン (新しい状態が D0 の場合) またはデバイスの電源オフ (新しい状態が他の状態の場合) の後に行われる必要があります。

各ドライバーは、デバイスの電源状態を追跡する必要があります。 この情報は、電源マネージャーによってドライバーに提供されません。

デバイスの電源状態に対する IRP_MN_SET_POWER 要求を処理するときに、ドライバーはできるだけ早く DispatchPower ルーチンからを返します。 ドライバーは、同じ IRP を処理するコードによってシグナルされたカーネルイベントの DispatchPower ルーチンを待機することはできません。 システム全体で電源 Irp が同期されるため、デッドロックが発生する可能性があります。

特にマルチメディアアプリケーションの場合、システムのパフォーマンスを最高レベルにするために、ドライバーは割り込み要求レベル (IRQL) で PASSIVE_LEVEL に等しい時間のかかる操作を実行する必要があります。 IRQL = PASSIVE_LEVEL で操作を実行するために、ドライバーは 専用スレッド または システムワーカースレッドを使用できます。 マルチメディアプラットフォームのドライバーパフォーマンスを最適化するためのガイドラインについては、 ストリーミングメディアデバイス設計ガイドを参照してください。

次のセクションで説明するように、ドライバーが電源 IRP を処理するために必要な手順は、デバイスの電源が入っているかダウンしているかによって異なります。

デバイスの電源切断 IRP の処理

デバイスの電源投入 IRP の処理