次の方法で共有


IRP_MN_STOP_DEVICE 要求の処理 (Windows 2000 以降)

IRP_MN_STOP_DEVICE 要求は、まずデバイス スタックの最上位ドライバーによって処理され、その後、次の下位ドライバーによって処理されます。 ドライバーは、DispatchPnP ルーチンの IRP の停止を処理します。

ドライバーは、次のような手順を使用して IRP_MN_STOP_DEVICE 要求を処理します。

  1. デバイスが一時停止されていることを確認します。

    ドライバーが IRP_MN_QUERY_STOP_DEVICE 要求に応答してデバイスを完全に一時停止しなかった場合、今すぐ一時停止する必要があります。 デバイス拡張機能で HOLD_NEW_REQUESTS フラグを設定し、デバイスを一時停止するために必要なその他の操作を実行します。

    リソースの再調整操作中にデバイスの電源が失われ、デバイスの状態が失われる可能性があります。 デバイスのドライバーは、デバイスの状態情報を保存し、後続の IRP_MN_START_DEVICE 要求を受け取ったときに復元する必要があります。

  2. デバイスのハードウェア リソースを解放します。

    ファンクション ドライバーでは、正確な操作はデバイスとドライバーごとに異なりますが、IoDisconnectInterrupt による割り込みの切断、MmUnmapIoSpace を使用した物理アドレス範囲の解放、I/O ポートの解放などの可能性があります。

    フィルター ドライバーまたはバス ドライバーがデバイスのハードウェア リソースを取得した場合、そのドライバーは、IRP_MN_STOP_DEVICE 要求に応答してリソースを解放する必要があります。

  3. Irp->IoStatus.Status を STATUS_SUCCESS に設定します。

  4. IRP を次の下位ドライバーに渡すか、IRP を完了します。

    • ファンクションまたはフィルター ドライバーで、IoSkipCurrentIrpStackLocation を使用して次のスタックの場所を設定し、IoCallDriver を使用して次の下位ドライバーに IRP を渡した後、DispatchPnP ルーチンからの戻りステータスとして IoCallDriver からステータスを返します。 IRP は完了させません。

    • バス ドライバーで、IO_NO_INCREMENT で IoCompleteRequest を使用して IRP を完了し、DispatchPnP ルーチンから戻ります。

リソースを再調整するためにデバイスが停止している間、ドライバーはデバイスにアクセスする IRP を起動できません。 「デバイスが一時停止しているときに IRP を保留する」の説明に従って、ドライバーはこのような IRP をキューに入れる必要があります。または、ドライバーが IRP 保持キューを実装せず、I/O 要求を削除しない場合は失敗する必要があります。