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 の詳細については 「フィルター ドライバーのコントロール デバイス オブジェクト」 を参照してください。
このセクションでは、次のトピックについて説明します。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示