Share via


デバイスが一時停止したときの着信 IRP の保留

デバイスのドライバーは、リソースの再調整時にデバイスを一時停止する必要があります。 リソースの再調整時、一部のドライバーは、IRP_MN_QUERY_STOP_DEVICE 要求に応答してデバイスを一時停止し、他のドライバーは、IRP_MN_STOP_DEVICE 要求を受け取るまでデバイスの一時停止を遅延します。 いずれの場合も、IRP_MN_STOP_DEVICE が成功したら、デバイスを一時停止する必要があります。

ドライバーは、デバイスで進行中のすべての IRP を完了し、デバイスへのアクセスを必要とする新しい IRP を開始しないようにする必要があります。

デバイスの一時停止中に IRP を保持するため、ドライバーは次のような手順を実装します。

  1. その AddDevice ルーチンで、HOLD_NEW_REQUESTS などの名前を使用してデバイス拡張機能でフラグを定義します。 フラグをクリアします。

  2. IRP を保持するための FIFO キューを作成します。

    ドライバーが既に IRP をキューに入れている場合、デバイスを一時停止する前に未処理の要求を完了する必要があるため、同じキューを再利用できます。

    ドライバーがまだ IRP キューを持っていない場合、その AddDevice ルーチンで作成する必要があります。 作成するキューの種類は、ドライバーがキューをフラッシュする方法によって異なります。 ドライバーは、インターロックされた 2 重リンク リストと ExInterlockedXxxList ルーチンを使用する場合があります。

  3. IRP_MN_QUERY_STOP_DEVICE (または IRP_MN_STOP_DEVICE) の DispatchPnP コードで、未処理の要求をすべて完了し、HOLD_NEW_REQUESTS フラグを設定します。

  4. DispatchWriteDispatchRead などのデバイスにアクセスするディスパッチ ルーチンでは、HOLD_NEW_REQUESTS フラグが設定されているかどうかをチェックします。 その場合、ドライバーは、保留中の IRP をマークして、キューに入れる必要があります。

    ドライバーの DispatchPnP ルーチンは、PnP IRP を保持するのではなく処理し続ける必要があり、DispatchPower ルーチンは電源 IRP を処理し続ける必要があります。

  5. DispatchPnP では、開始またはキャンセル/停止 IRP に応答して、HOLD_NEW_REQUESTS フラグをクリアし、IRP 保持キュー内の IRP を開始します。

    これらのアクションは、おそらくこれらの PnP IRP を処理するための最後の手順です。 たとえば、ドライバーは、開始 IRP に応答して、まずデバイス起動操作を実行する必要があります。その後、IRP 保持キューで IRP を開始できます。

    IRP 保持キューから発生した IRP 処理エラーは、開始またはキャンセル/停止 IRP に対して返されるステータスには影響を与えません。