操作後コールバック ルーチンの記述
ファイル システム ミニフィルター ドライバーは、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 で呼び出すことができるため、操作後コールバック ルーチンは FltLockUserBuffer や RtlCompareUnicodeString などの下位 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 を呼び出します。
このセクションには、次が含まれます。