次の方法で共有


操作後コールバック ルーチンの記述

ファイル システム ミニフィルター ドライバーは、1 つ以上の 操作後コールバック ルーチン を使用して I/O 操作をフィルター処理します。

操作後コールバック ルーチンは、次のいずれかのアクションを実行できます。

  • 事後処理ルーチンで完了作業を直接実行します。 IRQL <= DISPATCH_LEVELですべての完了作業を実行できます。
  • 安全な IRQL で完了作業を実行します。 FLT_STATUS_MORE_PROCESSING_REQUIRED 返し、ワーカー スレッドをキューに入れ、安全な IRQL での処理を許可します。 処理が完了すると、ワーカー スレッドは FltCompletePendedPostOperation を呼び出して、事後処理を続行します。
  • 作成操作をキャンセルする

操作後コールバック ルーチン は、従来の ファイル システム フィルター ドライバーで使用される 完了ルーチン に似ています。

ミニフィルター ドライバーは、 操作前コールバック ルーチン を登録するのと同じ方法で、特定の種類の I/O 操作の操作後コールバック ルーチンを登録します。つまり、ミニフィルター ドライバーが DriverEntry ルーチンの FltRegisterFilter にパラメーターとして渡す FLT_REGISTRATION 構造体の OperationRegistration メンバーにコールバック ルーチンのエントリ ポイントを格納します。

ミニフィルター ドライバーは、操作前または操作後のコールバック ルーチンを登録した I/O 操作の種類のみを受け取ります。 ミニフィルター ドライバーは 操作後コールバック ルーチン を登録せずに、特定の種類の I/O 操作の操作前コールバック ルーチンを登録できます。その逆も同様です。

すべての操作後コールバック ルーチンは、次のように定義されます。

typedef FLT_POSTOP_CALLBACK_STATUS 
(*PFLT_POST_OPERATION_CALLBACK) ( 
    IN OUT PFLT_CALLBACK_DATA Data, 
    IN PCFLT_RELATED_OBJECTS FltObjects, 
    IN PVOID CompletionContext, 
    IN FLT_POST_OPERATION_FLAGS Flags 
    ); 

完了ルーチンと同様に、任意のスレッド コンテキストで IRQL <= DISPATCH_LEVEL でポスト操作コールバック ルーチンが呼び出されます。

IRQL = DISPATCH_LEVEL で呼び出すことができるため、操作後コールバック ルーチンは FltLockUserBufferRtlCompareUnicodeString などの下位 IRQL で呼び出す必要があるカーネル モード ルーチンを呼び出すことはできません。 同じ理由から、操作後コールバック ルーチンで使用されるデータ構造は、非ページ・プールから割り振る必要があります。

上記の規則の例外は次のとおりです。

  • ミニフィルター ドライバーの操作前コールバック ルーチンが IRP ベースの I/O 操作の FLT_PREOP_SYNCHRONIZE を返す場合、対応する操作後コールバック ルーチンは、IRQL <= APC_LEVELで呼び出されます。これは、操作前コールバック ルーチンと同じスレッド コンテキストで行われます。

  • 高速 I/O 操作の操作後コールバック ルーチンは、IRQL = PASSIVE_LEVELで、操作前コールバック ルーチンと同じスレッド コンテキストで呼び出されます。

  • 作成後コールバック ルーチンは、IRP_MJ_CREATE 操作を開始したスレッドのコンテキストで、IRQL = PASSIVE_LEVEL で呼び出されます。

フィルター マネージャーが特定の I/O 操作に対してミニフィルター ドライバーの操作後コールバック ルーチンを呼び出すと、ミニフィルター ドライバーは I/O 操作を一時的に制御します。 ミニフィルター ドライバーは、次のいずれかの操作を行うまで、このコントロールを保持します。

  • 操作後コールバック ルーチンから FLT_POSTOP_FINISHED_PROCESSING を返します。

  • 操作後コールバック ルーチンでペンドされた IRP ベースの I/O 操作を処理した作業ルーチンから FltCompletePendedPostOperation を呼び出します。

このセクションには、次が含まれます。

I/O 操作の完了処理を実行する

操作後コールバック ルーチン内で I/O 操作を保留にする

操作後コールバック ルーチン内で I/O 操作が失敗する