IRP の削除が発行される場合の概要
次の図は、デバイスのドライバーの削除に関連する IRP の一般的なシーケンスを示しています。
次の注釈は、前の図の丸数字に対応しています。
クエリを削除する
PnP マネージャーは、コンピューターを中断せずにデバイスを削除できるかどうかを確認する IRP_MN_QUERY_REMOVE_DEVICE を発行します。 また、ユーザーがデバイスのドライバーの更新を要求し、(Windows 2000 以降) デバイスを無効にした場合に、この IRP デバイス マネージャー送信します。 (Windows 98/Me では、PnP マネージャーはこの状況で IRP 停止を送信します。詳細については、デバイスの停止を参照してください。)
デバイス スタック内のすべてのドライバーが STATUS_SUCCESS を返した場合、ドライバーはデバイスを削除保留中の状態にします。 この状態では、ドライバーは、デバイスの削除を妨げる操作を開始できません。
この "クリーン" 削除の場合、PnP マネージャーは、削除 IRP を送信する前に、クエリ削除 IRP を送信します。 "予期しない" 削除の説明については、手順 5 を参照してください。
上の図には示されていませんが、バス ドライバーは、起動されていないデバイスの IRP_MN_QUERY_REMOVE_DEVICE を受け取る場合があります。 これは、コンピューター上に物理的に存在するが無効になっているデバイスを動的に削除するようユーザーが要求した場合に発生する可能性があります。
クエリの成功後に削除する
PnP マネージャーは、デバイスのドライバーを削除する IRP_MN_REMOVE_DEVICE を発行します。
ドライバーは、この要求に成功する必要があります。 デバイスのドライバーは、必要なクリーンを実行し、デバイス スタックからデタッチし、FDO とフィルター DO を削除します。 親バス ドライバーは、ユーザーがコンピューターからデバイスを物理的に削除するまで PDO を保持します。
ドライバーは、IRP を削除する 前に IRP_MN_STOP_DEVICE を受け取る可能性がありますが、必須ではありません。 Windows 2000 以降では、IRP_MN_STOP_DEVICE は、リソースの再調整のためにデバイスを一時停止するためにのみ使用されます。これは削除の手順ではありません。 デバイスの停止中にユーザーがデバイス ハードウェアを削除した場合、PnP マネージャーは、停止 IRP の後のある時点で削除 IRP を送信しますが、停止は削除の前提条件ではありません。
デバイスを再有効化する
ドライバーがデバイス オブジェクトを削除した後にデバイスが再び有効になっている場合、PnP マネージャーはドライバーの AddDevice ルーチンを呼び出し、デバイスを復元するための IRP_MN_START_DEVICE を発行します。 (PnP の観点からのデバイスの状態の図も参照してください。)
クエリの削除を取り消す
PnP マネージャーは、クエリ削除要求を取り消す IRP_MN_CANCEL_REMOVE_DEVICE を発行します。
IRP_MN_CANCEL_REMOVE_DEVICE に応答して、ドライバーはデバイスを起動状態に戻します。
予期しない削除 (Windows 2000 以降のバージョンの Windows)
Windows 2000 以降のシステムでは、ユーザーがハードウェアの取り外しまたは取り出しプログラムを使用せずにコンピューターからデバイスを取り外した場合、PnP マネージャーはIRP_MN_SURPRISE_REMOVAL IRP を送信します。
このケースは、ドライバーが事前の警告を受け取らないため、"予期しない" 削除と呼ばれます。
IRP_MN_SURPRISE_REMOVAL IRP に応答して、デバイスのドライバーは、未処理の I/O を失敗させ、デバイスによって使用されるハードウェア リソースを解放します。 ドライバーは、デバイスが存在しなくなったため、コンポーネントがデバイスへのアクセスを試みていないことを確認する必要があります。
すべてのドライバーは、IRP_MN_SURPRISE_REMOVAL IRP を処理する必要があり、状態を STATUS_SUCCESS に設定する必要があります。
IRP_MN_SURPRISE_REMOVALを取り消すことはできません。
予期しない削除の後に削除する (Windows 2000 以降のバージョンの Windows)
デバイスに対するすべての開いているハンドルが閉じられると、PnP マネージャーはデバイスのドライバーに IRP_MN_REMOVE_DEVICE 要求を送信します。 各ドライバーは、デバイス スタックからデタッチし、そのデバイス オブジェクトを削除します。
予期しない削除 (Windows 98/Me)
Windows 98/Me では、デバイスが警告なしで削除された場合、ドライバーは IRP_MN_SURPRISE_REMOVAL を受け取りません。 PnP マネージャーは、IRP_MN_REMOVE_DEVICE のみを送信します。 WDM ドライバーには、IRP_MN_SURPRISE_REMOVAL の後の IRP_MN_REMOVE_DEVICE (Windows 2000 以降の予期しない削除の動作) と、以前の予期しない削除 IRP (Windows 98/Me 動作) のない IRP_MN_REMOVE_DEVICE の両方を処理するコードが必要です。
失敗した開始後に削除する (Windows 2000 以降)
デバイスのドライバーの 1 つが IRP_MN_START_DEVICE に失敗した場合、PnP マネージャーはデバイス スタックに IRP_MN_REMOVE_DEVICE 要求を送信します。 このような削除 IRP を使用すると、デバイスのすべてのドライバーに、デバイスが正常に開始しなかったことが通知されます。 IRP_MN_REMOVE_DEVICE IRP に応答して、デバイスのドライバーは開始操作を復元し (IRP の開始に成功した場合)、AddDevice 操作を復元します。 PnP マネージャーは、このようなデバイスを "失敗した開始" としてマークします。
この動作は、Windows 2000 以降のプラットフォームにのみ適用されます。 Windows 98/Me では、PnP マネージャーは失敗した開始に応答して IRP_MN_STOP_DEVICE を送信します。
PnP デバイスのドライバーは、一般的な IRP の切り替えの削除を示す図に示されている以外にも多くの状況で IRP_MN_SURPRISE_REMOVAL を受け取ることができます。 たとえば、ユーザーは PC カードをコンピューターに挿入し、デバイスを起動する前に削除することができます。 その場合、PnP マネージャーは、ドライバーの AddDevice ルーチンが呼び出された後、IRP_MN_START_DEVICE 要求を発行する前に、予期しない削除 IRP を発行します。 PnP デバイスのドライバーは、ドライバーの AddDevice ルーチンが呼び出された後、いつでも削除 IRP を処理するように準備する必要があります。