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で呼び出されます。 |
戻り値
このコールバック ルーチンは、次のいずれかの状態値を返します。
リターン コード | 説明 |
---|---|
|
ミニフィルター ドライバーは、I/O 操作の完了処理を完了し、フィルター マネージャーに操作の制御を返しています。
操作後のコールバックがこの状態値を返した後、フィルター マネージャーは I/O 操作の完了処理を続行します。 |
|
ミニフィルター ドライバーは、I/O 操作の完了処理を停止しましたが、フィルター マネージャーに操作の制御を返していません。
ミニフィルター ドライバーの操作後コールバックは、ミニフィルター ドライバーの操作後のコールバックが作業キューに I/O 操作を投稿した場合にのみ、この状態値を返すことができます。 ミニフィルター ドライバーは、最終的に I/O 操作の完了処理を再開する必要があります。 操作後のコールバックがFLT_POSTOP_MORE_PROCESSING_REQUIREDを返した後、フィルター マネージャーは、次の両方の条件が当てはまる場合を除き、I/O 操作のそれ以上の完了処理を実行しません。
|
|
ミニフィルター ドライバーは、高速 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で呼び出されることが保証されます。
ミニフィルター ドライバーは、コールバック ルーチンのエントリ ポイントを、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 | 「解説」セクションを参照してください |
こちらもご覧ください
FltCompletePendedPostOperation