アイドル状態検出のための電源マネージャー ルーチンの使用
電源マネージャーは、PoRegisterDeviceForIdleDetection と PoSetDeviceBusy ルーチンを介したアイドル検出のサポートを提供します。
デバイスのアイドル検出を有効にするには、デバイスの電源ポリシー所有者が PoRegisterDeviceForIdleDetection を呼び出して、指定します。
システムがパフォーマンスを最適化するときに適用するアイドル タイムアウト値。
システムが保存を最適化するときに適用するアイドル タイムアウト値。
アイドル時にデバイスが移行するデバイスの電源状態。
PoRegisterDeviceForIdleDetection は、アイドル状態のカウンターへのポインターを返します。このポインターは、ドライバーが後でアイドル検出を無効にするために使用します。 PoRegisterDeviceForIdleDetection の呼び出し元は、IRQL < DISPATCH_LEVEL で実行されている必要があります。
ドライバーは、デバイスが起動され、デバイスの電源 IRP を処理する準備ができた後、いつでもアイドル検出のためにデバイスを登録できます。 たとえば、ドライバーは、PnP 開始デバイス IRP の IoCompletion ルーチンの一部として、アイドル検出を有効にすることができます。
特定のデバイスのタイムアウト値は、デバイスの電源投入待機時間に比例し、観察されたデバイスの動作に基づく必要があります。 特定の種類のデバイスの場合、ドライバーは、-1 の保存とパフォーマンスのタイムアウト値を指定して、デバイス クラスの標準的な電源ポリシーのタイムアウトを使用できます。 詳細については、「デバイス固有のドキュメント」を参照してください。
デバイスが使用中の場合、ドライバーは PoSetDeviceBusy を呼び出し、PoRegisterDeviceForIdleDetection によって返されるポインターを渡す必要があります。 PoSetDeviceBusy はアイドル カウンターをリセットし、デバイスのアイドル 状態のカウントダウンを再起動します。 ドライバーは、すべての I/O 操作で PoSetDeviceBusy を呼び出す必要があります。
デバイスがアイドル状態かどうかを判断するために、電源マネージャーは、アイドル 状態のカウンターの値と、現在のシステム電源ポリシー (保存またはパフォーマンス) のドライバー指定のアイドル タイムアウト値を比較します。 システム電源ポリシーに関連する関数については、「Microsoft Windows SDK」 を参照してください。
デバイスがタイムアウト値を満たすと、電源マネージャーは、PoRegisterDeviceForIdleDetection への呼び出しでドライバーが渡したデバイスの電源状態を指定して、デバイスの電源設定 IRP を送信します。 電源マネージャーは、電源設定 IRP を送信する前にクエリ IRP を送信しません。 スタック内のドライバーは、他のドライバーと同様に、電源設定 IRP を処理します。タイムリーに完了する必要があり、失敗することはできません。 (「デバイスのパワーダウン IRP の処理」を参照してください。)
ドライバーでアイドル検出が不要になった場合、またはデバイスのパワーダウン IRP を処理する準備ができていない場合は、PoRegisterDeviceForIdleDetection をもう一度呼び出し、両方のタイムアウト値に対して 0 を渡す必要があります。 タイムアウトをゼロに設定すると、保存 (バッテリ) とパフォーマンス (AC) の両方の電源ポリシーのアイドル検出が無効になります。 ドライバーは、アイドル検出をすばやく再度有効にすることができます。0 以外のタイムアウト値を使用して PoRegisterDeviceForIdleDetection を呼び出すだけです。 ドライバーがデバイスを登録すると、デバイスの電源がオフになって再び起動された場合でも、タイムアウト値を変更することで、アイドル検出を有効または無効にすることができます。