次の方法で共有


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

IRP_MN_CANCEL_STOP_DEVICE 要求は、まずデバイスの親バス ドライバーによって処理された後、デバイス スタック内の次の上位の各ドライバーによって処理される必要があります。 ドライバーは、DispatchPnP ルーチンの IRP の停止を処理します。

IRP_MN_CANCEL_STOP_DEVICE 要求に応答して、ドライバーは、開始状態にデバイスを戻し、通常の操作を再開する必要があります。 ドライバーは、キャンセル/停止 IRP に成功する必要があります。

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

  1. 下位ドライバーが再起動操作を完了するまで、デバイスの再起動を延期します。 (「下位のドライバーが完了するまで PnP IRP 処理を延期する」を参照)。

  2. 下位ドライバーが終了したら、デバイスを起動状態に戻します。

    正確な操作は、デバイスとドライバーごとに異なります。

  3. IRP 保持キューで IRP 開始します。

    ドライバーは、デバイスが停止保留中状態のときに要求を保持していた場合、HOLD_NEW_REQUESTS フラグをクリアし、IRP 保持キューで IRP を開始します。 詳細については、「デバイスが一時停止しているときに IRP を保留する」を参照してください。

  4. IoCompleteRequest でIRP を完了します。

    • 関数またはフィルター ドライバーの場合:

      下位のドライバーが完了するまで PnP IRP 処理を延期する」で説明されているとおり、ドライバーの IoCompletion ルーチンが STATUS_MORE_PROCESSING_REQUIRED を返したため、ドライバーの DispatchPnP ルーチンは IoCompleteRequest を呼び出して、ドライバーの I/O 完了処理を再開する必要があります。

      ドライバーは、Irp->IoStatus.Status を STATUS_SUCCESS に設定し、IO_NO_INCREMENT の優先度ブーストを使用して IoCompleteRequest を呼び出し、DispatchPnP ルーチンから STATUS_SUCCESS を返します。

      ドライバーがこの操作に失敗してはなりません。 ドライバーが IRP の再起動に失敗した場合、デバイスは不整合な状態になるため、正しく動作しません。

    • 親バス ドライバーの場合:

      ドライバーは Irp->IoStatus.Status を STATUS_SUCCESS に設定し、IO_NO_INCREMENT の優先度ブーストを指定して IoCompleteRequest を呼び出します。 バスドライバーは、DispatchPnP ルーチンより STATUS_SUCCESS を返します。

      バス ドライバーがこの操作に失敗してはなりません。 ドライバーが IRP の再起動に失敗した場合、デバイスは不整合な状態になるため、正しく動作しません。

ドライバーは、デバイスが起動されてアクティブなときに、偽の取り消し/停止要求を受け取る可能性があります。 これは、たとえば、ドライバー (またはデバイス スタック内の上位のドライバー) が IRP_MN_QUERY_STOP_DEVICE 要求に失敗した場合に発生する可能性があります。 デバイスが起動してアクティブになると、ドライバーはデバイスの偽の取り消し/停止要求を安全に成功できます。