次の方法で共有


PFLT_POST_OPERATION_CALLBACK コールバック関数 (fltkernel.h)

ミニフィルター ドライバーは、I/O 操作の完了処理を実行するPFLT_POST_OPERATION_CALLBACK型の 1 つ以上のルーチンを登録できます。

構文

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

パラメーター

[in, out] Data

I/O 操作のコールバック データ FLT_CALLBACK_DATA 構造体へのポインター。

[in] FltObjects

フィルター マネージャーへのポインターは 、現在の I/O 要求に関連するオブジェクトの不透明なポインターを含むFLT_RELATED_OBJECTS構造体を維持しました。

[in, optional] CompletionContext

ミニフィルター ドライバーの操作 前コールバック PFLT_PRE_OPERATION_CALLBACK ルーチンによって返されたコンテキスト ポインター。 CompletionContext ポインターは、操作前のコールバック ルーチンから操作後のコールバック ルーチンに情報を通信する方法を提供します。

[in] Flags

操作後のコールバックの実行方法を指定するフラグのビットマスク。

フラグ 説明
FLTFL_POST_OPERATION_DRAINING フィルター マネージャーは、ミニフィルター ドライバー インスタンスがデタッチされていること、およびミニフィルター ドライバーの完了コンテキストをクリーンするためにこの操作後のコールバック ルーチンが呼び出されていることを示すように、このフラグを設定します。 操作後のコールバックは、FLT_POSTOP_FINISHED_PROCESSINGを返す必要があります。 このフラグが設定されている場合、 Data パラメーターは、元のコールバック データ構造ではなく、操作の元のコールバック データ構造のコピーを指します。 さらに、このフラグを設定すると、操作後のコールバック ルーチンが IRQL <= APC_LEVELで呼び出されます。

戻り値

このコールバック ルーチンは、次のいずれかの状態値を返します。

リターン コード 説明
FLT_POSTOP_FINISHED_PROCESSING
ミニフィルター ドライバーは、I/O 操作の完了処理を完了し、フィルター マネージャーに操作の制御を返しています。

操作後のコールバックがこの状態値を返した後、フィルター マネージャーは I/O 操作の完了処理を続行します。

FLT_POSTOP_MORE_PROCESSING_REQUIRED
ミニフィルター ドライバーは、I/O 操作の完了処理を停止しましたが、フィルター マネージャーに操作の制御を返していません。

ミニフィルター ドライバーの操作後コールバックは、ミニフィルター ドライバーの操作後のコールバックが作業キューに I/O 操作を投稿した場合にのみ、この状態値を返すことができます。 ミニフィルター ドライバーは、最終的に I/O 操作の完了処理を再開する必要があります。

操作後のコールバックがFLT_POSTOP_MORE_PROCESSING_REQUIREDを返した後、フィルター マネージャーは、次の両方の条件が当てはまる場合を除き、I/O 操作のそれ以上の完了処理を実行しません。

  • 操作後のコールバックによって、I/O 操作が作業キューにポストされました。
  • 作業ルーチンは、操作の完了処理を実行した後、 FltCompletePendedPostOperation を呼び出して、操作の制御をフィルター マネージャーに返します。
この状態の値は、IRP ベースの I/O 操作でのみ返すことができます。 指定されたコールバック データ構造が IRP ベースの I/O 操作を表すかどうかを確認するには、 FLT_IS_IRP_OPERATION マクロを使用します。
FLT_POSTOP_DISALLOW_FSFILTER_IO
ミニフィルター ドライバーは、高速 QueryOpen 操作を禁止し、低速パスを強制的に操作します。 これにより、I/O マネージャーはファイルのオープン/クエリ/クローズを実行して要求を処理します。 ミニフィルター ドライバーは、QueryOpen の場合にのみこの状態を返す必要があります。

注釈

ミニフィルター ドライバーの操作後コールバック ルーチンは、1 つ以上の種類の I/O 操作の完了処理を実行します。

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

操作後のコールバック ルーチンは、IRQL <= DISPATCH_LEVELで任意のスレッド コンテキストで呼び出されます。 このコールバック ルーチンは IRQL DISPATCH_LEVELで呼び出すことができるため、次の制約が適用されます。

  • 低い IRQL で実行する必要があるカーネル モード ルーチンを安全に呼び出すことはできません。
  • このルーチンで使用されるすべてのデータ構造は、非ページ プールから割り当てる必要があります。
  • ページング可能にすることはできません。
  • リソース、ミューテックス、または高速ミューテックスを取得できません。 ただし、スピン ロックを取得できます。
  • コンテキストを取得、設定、または削除することはできませんが、コンテキストを解放することはできます。

IRQL < DISPATCH_LEVELで実行する必要がある I/O 完了処理は、運用後コールバック ルーチンで直接実行することはできません。 代わりに、 FltDoCompletionProcessingWhenSafeFltQueueDeferredIoWorkItem などのルーチンを呼び出して、作業キューにポストする必要があります。

操作後コールバックの Flags パラメーターに FLTFL_POST_OPERATION_DRAINING ビットが設定されている場合は、FltDoCompletionProcessingWhenSafe を呼び出さないでください。 この規則の例外を次に示します。

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

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

ミニフィルター ドライバーは、操作前コールバック (PFLT_PRE_OPERATION_CALLBACK) ルーチンを登録せずに、特定の種類の I/O 操作の操作後コールバック ルーチンを登録できます。その逆も可能です。

要件

要件
サポートされている最小のクライアント Sp4、Windows XP SP2、Windows Server 2003 SP1、およびそれ以降の Windows オペレーティング システム用の Microsoft Windows 2000 更新プログラムロールアップ 1 で使用できます。
対象プラットフォーム デスクトップ
Header fltkernel.h (FltKernel.h を含む)
IRQL 「解説」セクションを参照してください

こちらもご覧ください

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK