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 | 「解説」セクションを参照してください |
関連項目
FltCompletePendedPostOperationの
FltCompletePendedPreOperationの
FltQueueDeferredIoWorkItemの
FltRegisterFilterの
FltSetCallbackDataDirtyの
KeGetCurrentIRQLの