次の方法で共有


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

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

[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 完了処理は、ポスト操作コールバック ルーチンで直接実行することはできません。 代わりに、FltDoCompletionProcessingWhenSafe や FltQueueDeferredIoWorkItemなどのルーチンを呼び出して、作業キューにポストする必要があります。

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

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

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

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

必要条件

要件 価値
サポートされる最小クライアント Microsoft Windows 2000 Update Rollup 1 for SP4、Windows XP SP2、Windows Server 2003 SP1、およびそれ以降の Windows オペレーティング システムで使用できます。
ターゲット プラットフォーム デスクトップ
ヘッダー 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