次の方法で共有


IRP ディスパッチ ルーチンの記述

Note

最適な信頼性とパフォーマンスを実現するには、レガシ ファイル システム フィルター ドライバーではなく、フィルター マネージャーのサポートがある ファイル システム ミニフィルター ドライバー を使用します。 レガシ ドライバーをミニフィルター ドライバーに移植するには、 「レガシ フィルター ドライバーの移植ガイドライン」 を参照してください。

ファイル システム フィルター ドライバーは、デバイス ドライバーで使用されるものと似たディスパッチ ルーチンを使用します。 ディスパッチ ルーチン は、1 つ以上の種類の IRP を処理します。 (IRP の は、その主要な関数コードによって決まります)。ドライバーの DriverEntry ルーチンは、ドライバー オブジェクトのディスパッチ テーブルに格納することによって、ディスパッチ ルーチンのエントリ ポイントを 登録 します。 IRP がドライバーに送信されると、I/O サブシステムは、IRP の主要な関数コードに基づいて適切なディスパッチ ルーチンを呼び出します。

すべての IRP ディスパッチ ルーチンは、次のように定義されます。

NTSTATUS
(*PDRIVER_DISPATCH) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

ファイル システム フィルター ドライバー ディスパッチ ルーチンは、IRQL PASSIVE_LEVEL で呼び出されることが最も多く、I/O 要求を発生させたスレッドのコンテキストで呼び出されます。これは、一般的にユーザー モードのアプリケーション スレッドです。 ただし、この規則にはいくつかの例外があります。 たとえば、ページ フォールトにより、IRQL APC_LEVEL で読み取りと書き込みのディスパッチ ルーチンが呼び出されます。 これらの例外は、 ディスパッチ ルーチン IRQL とスレッド コンテキスト の表にまとめられています。 残念ながら、フィルター チェーン内のドライバーが IRQL > PASSIVE_LEVELで IoCallDriver を呼び出すのを防ぐことは現在できません (たとえば、スピンロックや高速ミューテックスの解放に失敗するなど)。 ただし、フィルター ディスパッチ ルーチンでは、呼び出されたのと同じ IRQL で常に IoCallDriver を呼び出す必要があることを強くお勧めします。

ディスパッチ ルーチンは、カーネル モード ドライバー アーキテクチャ設計ガイドの 「ドライバーのページング可能にする」 セクションで説明されている条件を満たしている場合にページング可能にすることができます。

ファイル システム フィルター ドライバーにコントロール デバイス オブジェクト (CDO) がある場合、ディスパッチ ルーチンは、IRP のターゲット デバイス オブジェクトがマウントされたボリュームのボリューム デバイス オブジェクト (VDO) ではなく CDO である場合を検出して処理できる必要があります。 CDO の詳細については 「フィルター ドライバーのコントロール デバイス オブジェクト」 を参照してください。

このセクションでは、次のトピックについて説明します。

IRP の完了

IRP を下位レベルのドライバーに渡す

ディスパッチ ルーチンから返される状態

例: 完了ルーチンを設定せずに IRP を渡す

ディスパッチ ルーチンに関する制約

ディスパッチ ルーチン IRQL とスレッド コンテキスト