フィルター ドライバーまたはファンクション ドライバーでのシステム電源クエリ IRP の処理
フィルターまたはファンクション ドライバー (デバイスの電源ポリシー所有者ではない) は、以下の手順で、システム クエリ電源 IRP を次の下位ドライバーに渡す必要があります。
IoAcquireRemoveLock を呼び出し、現在の IRP を渡して、電源 IRP の処理中にドライバーが PnP IRP_MN_REMOVE_DEVICE 要求を受け取らないようにします。
IoAcquireRemoveLock が失敗ステータスを返した場合、ドライバーは IRP の処理を続行すべきではありません。 代わりに、Windows Vista 以降では、ドライバーは IoCompleteRequest を呼び出して IRP を完了し、エラー ステータスを返す必要があります。 Windows Server 2003、Windows XP、Windows 2000 では、ドライバーは PoStartNextPowerIrp を呼び出し、 IoCompleteRequest を呼び出して IRP を完了した後、エラー状態を返します。
クエリが失敗するかどうかを判断します。 ガイドラインについては、「フィルターまたはファンクション ドライバーでのシステム クエリ Power IRP の失敗」を参照し、そのセクションで説明されている処理を完了してください。
PoStartNextPowerIrp を呼び出します。 (Windows Server 2003、Windows XP、および Windows 2000 のみ)
IRP スタックの場所 (IoSkipCurrentIrpStackLocation または IoCopyCurrentIrpStackLocationToNext) を設定します。 ドライバーは、IRP で IoCompletion ルーチンを設定できますが、そうする必要はほとんどありません。
IoCallDriver (Windows 7 と Windows Vista の場合) を呼び出すか、PoCallDriver (Windows Server 2003、Windows XP、Windows 2000 の場合) を呼び出し、IRP を次の下位ドライバーに渡します。
IoReleaseRemoveLock を呼び出します。 ただし、ドライバーが IRP の IoCompletion ルーチンを設定した場合、代わりに IoCompletion ルーチンからこの呼び出しを行います。
DispatchPower ルーチンから STATUS_PENDING を返します。