フィルター ドライバーでのシステム電源設定 IRP の処理

すべてのフィルター ドライバーと、デバイス スタックの電源ポリシーを所有していないすべてのファンクション ドライバーは、次の手順で、システム セット電源 IRP を次の下位ドライバーに渡す必要があります。

  1. IoAcquireRemoveLock を呼び出し、現在の IRP を渡して、電源 IRP の処理中にドライバーが PnP IRP_MN_REMOVE_DEVICE 要求を受け取らないようにします。

    IoAcquireRemoveLock が失敗ステータスを返した場合、ドライバーは IRP の処理を続行すべきではありません。 代わりに、Windows Vista 以降では、ドライバーは IoCompleteRequest を呼び出して IRP を完了し、エラー ステータスを返す必要があります。 Windows Server 2003、Windows XP、Windows 2000 では、ドライバーはまず PoStartNextPowerIrp を呼び出し、 IoCompleteRequest を呼び出して IRP を完了した後、エラー ステータスを返します。

  2. PoStartNextPowerIrp を呼び出して、次の電源 IRP を開始します。 (Windows Server 2003、Windows XP、および Windows 2000 のみ)。

  3. IRP スタックの場所 (IoSkipCurrentIrpStackLocation または IoCopyCurrentIrpStackLocationToNext) を設定します。 ドライバーは、IRP で IoCompletion ルーチンを設定できますが、そうする必要はほとんどありません。

  4. IoCallDriver (Windows 7 と Windows Vista の場合) を呼び出すか、PoCallDriver (Windows Server 2003、Windows XP、Windows 2000 の場合) を呼び出し、IRP を次の下位ドライバーに渡します。

  5. IoReleaseRemoveLock を呼び出します。 ただし、ドライバーが IRP の IoCompletion ルーチンを設定した場合、代わりに IoCompletion ルーチンからこの呼び出しを行います。

  6. DispatchPower ルーチンから STATUS_PENDING を返します。