次の方法で共有


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

ミニフィルター ドライバーの PFLT_PRE_OPERATION_CALLBACK ルーチンは、I/O 操作の操作前処理を実行します。

構文

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

パラメーター

[in, out] Data

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

[in] FltObjects

現在の I/O 要求に関連するオブジェクトの不透明なポインターを含む FLT_RELATED_OBJECTS 構造体へのポインター。

[out] CompletionContext

このコールバック ルーチンがFLT_PREOP_SUCCESS_WITH_CALLBACKまたはFLT_PREOP_SYNCHRONIZEを返す場合、このパラメーターは、対応する操作後コールバック ルーチンに渡される省略可能なコンテキスト ポインターです。 それ以外の場合は NULL にする必要があります。

戻り値

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

リターン コード 形容
FLT_PREOP_COMPLETE ミニフィルターが I/O 操作を完了しています。 詳細については、「解説」を参照してください。
FLT_PREOP_DISALLOW_FASTIO この操作は高速 I/O 操作であり、ミニフィルターでは高速 I/O パスをこの操作に使用できません。 詳細については、「解説」を参照してください。
FLT_PREOP_PENDING ミニフィルターによって I/O 操作がペンドされ、操作はまだ保留中です。 詳細については、「解説」を参照してください。
FLT_PREOP_SUCCESS_NO_CALLBACK ミニフィルターは、さらに処理するために FltMgr する I/O 操作を返しています。 この場合、FltMgr は、ミニフィルター ドライバーの操作後コールバックが存在する場合、I/O の完了中に呼び出されません。
FLT_PREOP_SUCCESS_WITH_CALLBACK ミニフィルターは、さらに処理するために FltMgr する I/O 操作を返しています。 この場合、FltMgr は、I/O の完了時にミニフィルターの操作後コールバックを呼び出します。
FLT_PREOP_SYNCHRONIZE ミニフィルターは、後続の処理のために FltMgr I/O 操作を返しますが、操作は完了していません。 詳細については、「解説」を参照してください。
FLT_PREOP_DISALLOW_FSFILTER_IO ミニフィルターは、高速 QueryOpen 操作を禁止し、操作を低速パスに強制しています。 これにより、I/O マネージャーはファイルのオープン/クエリ/クローズを実行して要求にサービスを提供します。 ミニフィルター ドライバーは、QueryOpen の場合にのみこの状態を返す必要があります。

備考

詳細については、「操作前コールバック ルーチン の記述」を参照してください。

ミニフィルターの操作前コールバック ルーチンは、1 つ以上の種類の I/O 操作を処理します。 (このコールバック ルーチンは、レガシ フィルター モデル ディスパッチ ルーチンに似ています。

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

ミニフィルター ドライバーの操作前または操作後のコールバック ルーチンは、操作のコールバック データ構造の内容を変更できます。 その場合は、コールバック データ構造の IoStatus フィールドの内容が変更されていない限り、FltSetCallbackDataDirty呼び出す必要があります。

このジェネリック コールバック ルーチンの IRQL は、その特定の IO パスに依存します。 現在の IRQL を知る必要がある場合は、KeGetCurrentIRQL をすばやく安価に呼び出すことができます。 IRQL の詳細については、「操作前コールバック ルーチン の記述」を参照してください。

ファイル システムは、ファイルの末尾の書き込み操作と読み取り操作を、基になるファイル ストレージ デバイスのセクター サイズの倍数に切り上げます。 事前読み取り操作または書き込み前操作を処理する場合、バッファーを割り当ておよびスワップするフィルターは、割り当てられたバッファーのサイズを、関連付けられているデバイスのセクター サイズの倍数に切り上げる必要があります。 そうでない場合、基になるファイル システムから転送されるデータの長さは、バッファーの割り当てられた長さを超えます。 バッファーのスワップの詳細については、SwapBuffers Minifilter サンプルを参照してください。

Windows 8 以降では、CompletionContext では、操作の結果に基づいて有効なコンテキスト値を定義する Flt_CompletionContext_Outptr 注釈が使用されます。 次に、CompletionContext の注釈を含むコールバック使用例を示します。

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


FLT_PREOP_COMPLETEを返す

このルーチンがFLT_PREOP_COMPLETEを返す場合は、コールバック データ構造の IoStatus.Status フィールドを、I/O 操作の最終的な NTSTATUS 値に設定する必要があります。 この NTSTATUS 値をSTATUS_PENDINGすることはできません。 クリーンアップ操作または終了操作では、クリーンアップ操作と終了操作が失敗しないため、STATUS_PENDING以外の成功 NTSTATUS 値である必要があります。

このルーチンがFLT_PREOP_COMPLETEを返す場合、FltMgr は、ドライバー スタック内の呼び出し元の下のミニフィルター ドライバーまたはファイル システムに I/O 操作を送信しません。 この場合、FltMgr は、ドライバー スタック内の呼び出し元の上にあるミニフィルター ドライバーの操作後コールバック ルーチンのみを呼び出します。

FLT_PREOP_DISALLOW_FASTIOを返す

このルーチンがFLT_PREOP_DISALLOW_FASTIOを返す場合は、fltMgr 自動的にこのフィールドがSTATUS_FLT_DISALLOW_FAST_IOに設定されるため、コールバック データ構造の IoStatus.Status フィールドを設定しないでください。

FLT_PREOP_DISALLOW_FASTIOは、高速 I/O 操作の場合にのみ返すことができます。 特定のコールバック データ構造が高速 I/O 操作を表しているかどうかを判断するには、FLT_IS_FASTIO_OPERATION マクロを使用します。

このルーチンがFLT_PREOP_DISALLOW_FASTIOを返すと、FltMgr は、ドライバー スタック内の呼び出し元の下のミニフィルター ドライバーまたはファイル システムに高速 I/O 操作を送信しません。 この場合、FltMgr は、ドライバー スタック内の呼び出し元の上にあるミニフィルター ドライバーの操作後コールバック ルーチンのみを呼び出します。

FLT_PREOP_PENDINGを返す

FLT_PREOP_PENDINGは、IRP ベースの I/O 操作のみをペンで処理できるため、IRP ベースの I/O 操作に対してのみ返すことができます。 特定のコールバック データ構造が IRP ベースの I/O 操作を表すかどうかを判断するには、FLT_IS_IRP_OPERATION マクロを使用します。

このルーチンがFLT_PREOP_PENDINGを返すと、FltMgr は、ミニフィルター ドライバーが FltCompletePendedPreOperation呼び出すまで、I/O 操作をさらに処理しません。

FLT_PREOP_SYNCHRONIZEを返す

ミニフィルターの操作前コールバック ルーチンがFLT_PREOP_SYNCHRONIZEを返す場合、ミニフィルターは、操作の対応する操作後コールバックを登録している必要があります。 このルーチンがFLT_PREOP_SYNCHRONIZEを返すと、FltMgr は、IRQL <= APC_LEVELの現在のスレッドのコンテキストでミニフィルターの操作後コールバックを呼び出します。

FLT_PREOP_SYNCHRONIZEは、IRP ベースの I/O 操作に対してのみ返す必要があります。 IRP ベースの操作ではない I/O 操作に対して返された場合、FltMgr は、この戻り値をFLT_PREOP_SUCCESS_WITH_CALLBACKしたかのように扱います。

ミニフィルター ドライバーは、作成操作のFLT_PREOP_SYNCHRONIZEを返すべきではありません。これらの操作は FltMgr によって既同期されているためです。

ミニフィルターは、非同期の読み取りおよび書き込み操作のFLT_PREOP_SYNCHRONIZEを返してはなりません。 これにより、ミニフィルター ドライバーとシステム パフォーマンスの両方が大幅に低下する可能性があります。

必要条件

要件 価値
サポートされる最小クライアント 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

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr

KeGetCurrentIRQL