IRP_MJ_PNP (FS およびフィルター ドライバー)

送信時

プラグ アンド プレイ マネージャーは、システム上でプラグ アンド プレイ アクティビティが発生するたびに IRP_MJ_PNP リクエストを送信します。 他のオペレーティング システム コンポーネントおよび他のカーネル モード ドライバーも、マイナー関数コードに応じて、特定の IRP_MJ_PNP 要求を送信できます。

ドライバーのプラグ アンド プレイ IRP 処理要件の詳細については、「プラグ&プレイ」を参照してください。

IRP_MJ_PNP マイナー機能コードのリファレンス情報については、「プラグ アンド プレイ マイナー IRP」を参照してください。

操作: ファイル システム ドライバー

ファイル システムは、マイナー機能コードを検査して、どの操作が要求されているかを判別する必要があります。 ファイル システムは、次のマイナー関数コードを処理する必要があります。

コード 説明
IRP_MN_CANCEL_REMOVE_DEVICE 以前のクエリ削除デバイス要求がキャンセルされたことを示します。 このリクエストは、キャンセルに関連するクリーンアップを実行する必要がある場合にファイル システムに警告するために送信されます。
IRP_MN_QUERY_REMOVE_DEVICE デバイスが削除されようとしていることを示します。 ファイル システムがデバイスにマウントされている場合、PnP マネージャーはこの要求をファイル システムとファイル システム フィルターに送信します。 デバイスへのオープンハンドルがある場合、ファイルシステムは通常、クエリ削除リクエストに失敗します。 そうでない場合、通常、ファイル システムはボリュームをロックして、今後の作成リクエストが成功しないようにします。 マウントされたファイル システムがクエリ削除要求をサポートしていない場合、PnP マネージャーはデバイスのクエリ削除要求に失敗します。
IRP_MN_REMOVE_DEVICE デバイスが削除されようとしていることを示します。 ファイル システムがデバイスにマウントされている場合、PnP マネージャーはこの IRP をファイル システムとファイル システム フィルターに送信します。 ファイル システムは、この IRP をデバイスのストレージ ドライバーに直ちに渡し、ファイル システムがボリュームをマウント解除する完了ルーチンを設定する必要があります。
IRP_MN_START_DEVICE デバイスが起動中であることを示します。 ファイル システムは、この IRP をデバイスのストレージ ドライバーに渡す必要があります。
IRP_MN_SURPRISE_REMOVAL デバイスが削除されたことを示します。 ファイル システムがデバイスにマウントされている場合、PnP マネージャーはこの IRP をファイル システムおよびファイル システム フィルターに送信します。 ファイル システムは、この IRP をデバイスのストレージ ドライバーに直ちに渡し、ファイル システムがボリュームをマウント解除する完了ルーチンを設定する必要があります。

操作: レガシー ファイル システム フィルター ドライバー

ファイル システム フィルター ドライバーは、次のガイドラインに従って PnP IRP を処理する必要があります。

  • ユーザーがボリュームを正常に削除しようとすると、PnP マネージャーは IRP_MN_QUERY_REMOVE_DEVICE リクエストを送信します。 この IRP を受信すると、フィルターはボリューム上の開いているハンドルをすべて閉じ、スタック上の次に下位のドライバーに IRP を渡す必要があります。 このステップは重要です。 ドライバーが開いているハンドルをすべて閉じることができない場合、ボリュームはマウント解除できなくなり、その結果、物理デバイスを取り出すことができなくなります。

    IRP_MN_QUERY_REMOVE_DEVICE リクエストを受信すると、FAT ファイル システムは安全に削除できるすべてのボリュームを直ちにマウント解除します。 したがって、FAT ボリュームに接続されているフィルタは、フィルタの完了ルーチンが呼び出される前にそのフィルタ デバイス オブジェクトが解放されることを予期する必要があります。 NTFS ファイル システムではこれは行われません。 したがって、NTFS ボリュームにアタッチされたフィルタは、フィルタの完了ルーチンが呼び出されたときに、そのデバイス オブジェクトがまだボリュームにアタッチされていることが期待できます。

  • IRP_MN_QUERY_REMOVE_DEVICE 要求の後、IRP_MN_CANCEL_REMOVE_DEVICE または IRP_MN_REMOVE_DEVICE 要求が受信される前に受信された IRP は、ストレージ デバイス スタックのスタックに安全に渡されて失敗するか、キャンセル削除またはデバイス削除要求が完了するまでキューに保持されます。受け取った。

  • フィルターが IRP_MN_QUERY_REMOVE_DEVICE リクエストに応答してボリュームのオープン ハンドルをすべて閉じた後で IRP_MN_CANCEL_REMOVE_DEVICE リクエストを受信した場合、ハンドルを再度開くことができます。 ただし、フィルターは、スタック内のその下にあるドライバーによって IRP が正常に完了した後、その完了ルーチンでのみこの再オープンを行うことができます。

  • フィルターが IRP_MN_REMOVE_DEVICE 要求を受信した場合、IRP_MN_QUERY_REMOVE_DEVICE 要求を受信して以来 IRP をキューに保持していない限り、通常は IRP に対して処理を実行する必要はありません。 IRP をキューに保持している場合、フィルターはボリュームのすべての IRP をキューから取り出し、スタック上の次の下位ドライバーに IRP を渡す前に失敗させる必要があります。

  • IRP_MN_SURPRISE_REMOVAL リクエストを受信すると、フィルターは次の操作を実行する必要があります。

    • 未処理の参照がなくなるまでファイル システムはスタックをクリーンアップできないため、ボリュームに対して開いているハンドルをすべて閉じます。

    • フィルターが IRP をキューに保持している場合、それらを失敗させるか、ストレージ デバイス スタックのスタックに渡して失敗させることができます。

パラメーター

ファイル システムまたはフィルター ドライバーは、指定された IRP で IoGetCurrentIrpStackLocation を呼び出して、IRP 内の独自のスタックの場所へのポインターを取得します。 次のパラメーターでは、IrpIRP を指し、IrpSpIO_STACK_LOCATION を指します。 ドライバーは、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用して、プラグ アンド プレイ要求を処理できます。

  • DeviceObject ターゲット デバイス オブジェクトへのポインターです。

  • Irp->Ioステータス は、最終的な完了ステータスと要求された操作に関する情報を受け取る IO_STATUS_BLOCK構造体を指します。

  • IrpSp->FileObject は、PnP IRP の NULL を指す必要があります。

  • IrpSp->MajorFunctionIRP_MJ_PNP に設定されます。

  • IrpSp->MinorFunction 次のいずれかの値に設定されます。

    • IRP_MN_CANCEL_REMOVE_DEVICE
    • IRP_MN_QUERY_REMOVE_DEVICE
    • IRP_MN_REMOVE_DEVICE
    • IRP_MN_START_DEVICE
    • IRP_MN_SURPRISE_REMOVAL

関連項目

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_PNP (WDK カーネル リファレンス)

IRP_MN_CANCEL_REMOVE_DEVICE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_START_DEVICE

IRP_MN_SURPRISE_REMOVAL