リソースを再調整するためのデバイスの停止

次の図は、リソースを再調整するためにデバイスの停止と再起動に関係する IRP のシーケンスを示しています。

diagram illustrating stopping a device to rebalance resources.

次の注釈は、前の図の丸数字に対応しています。

  1. PnP マネージャーは、 IRP_MN_QUERY_STOP_DEVICE を発行し、デバイスのドライバーがデバイスを停止し、そのハードウェア リソースを解放できるかどうかを確認します。

    デバイス スタック内のすべてのドライバーが STATUS_SUCCESS を返す場合、ドライバーはデバイスをすばやく停止できる状態 (停止保留中) に移行させます。

    デバイス スタックが STATUS_SUCCESS 以外のものを返した場合、再調整プロセスには参加しません。 リソースの再調整はベスト エフォート操作であるため、この場合もシステムはシステム内のデバイスのリソース要件を満たすために再調整操作を試みます。 ただし、デバイスがクエリの停止に失敗した場合、目的の結果を得られない可能性があります (たとえば、新しいデバイスが列挙され、再調整がトリガーされた場合、必要なリソースを受け取れず、最終的に起動に失敗する可能性があります)。

    クエリ停止操作に失敗したデバイスは、クエリの停止が失敗した場合でも、引き続き操作状態になります。

    PnP マネージャーは、必要なリソースを再調整するために必要な数のデバイス スタックに照会します。

  2. PnP マネージャーは、 IRP_MN_STOP_DEVICE を発行し、デバイスを停止します。

    Windows 2000 以降のバージョンの Windows では、PnPマネージャが停止 IRP を送信するのは、そのデバイスに対する以前のクエリ停止 IRP が正常に完了した場合のみです。 停止 IRP に応じ、ドライバーは、デバイスのハードウェア リソース (I/O ポートなど) を解放し、デバイスへのアクセスを必要とするすべての IRP を保持します。

  3. リソースの再調整が正常に完了すると、PnP マネージャーは、 IRP_MN_START_DEVICE 要求を発行し、再調整中に停止したすべてのデバイスを再起動します。

  4. それ以外の場合、PnP マネージャーは、 IRP_MN_CANCEL_STOP_DEVICEを送信することによって、クエリ停止 IRP を取り消します。

    IRP_MN_CANCEL_STOP_DEVICE に応答して、デバイスのドライバーは、開始状態にデバイスを返し、デバイスの I/O 要求の処理を再開します。

    PnP マネージャーは、スタック内の 1 つのドライバーが要求に失敗した場合、または全体的な再調整操作が失敗し、すべてのクエリ停止要求を取り消している場合、デバイス スタックのクエリ停止を取り消します。 PnP マネージャーは、1 つのデバイス スタックでのみクエリ停止を取り消すと、クエリに失敗したドライバーの上に接続されたすべてのドライバーが停止保留中の状態になっているため、 IRP_MN_CANCEL_STOP_DEVICE 要求を送信します。 IRP_MN_CANCEL_STOP_DEVICE が成功すると、ドライバーはデバイスを起動状態に戻しました。

  5. リソースの再調整後にドライバーがデバイスの再起動に失敗した場合、PnP マネージャーはデバイス スタック (Windows 2000 以降のバージョンの Windows) に削除 IRP を送信します。

    PnP マネージャーは、最初に IRP_MN_SURPRISE_REMOVAL 要求を送信します。 次に、デバイスに対するすべての開いているハンドルが閉じられた後でのみ、 IRP_MN_REMOVE_DEVICE 要求を送信します。

PnP デバイスのハードウェア リソースの再調整は、アプリケーションとエンド ユーザーに対して透過的である必要があります。 ユーザーの操作に一時的な遅延が発生する可能性がありますが、データが失われることはあってはなりません。 停止 IRP を処理するときは、この点を考慮する必要があります。