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で操作後コールバック ルーチンが呼び出されます。 |
戻り値
このコールバック ルーチンは、次のいずれかの状態値を返します。
リターン コード | 形容 |
---|---|
|
ミニフィルター ドライバーは、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で呼び出されることを保証します。
ミニフィルター ドライバーは、コールバック ルーチンのエントリ ポイントを 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 | 「解説」セクションを参照してください |
関連項目
FltCancelFileOpen を する
FltCompletePendedPostOperation の
FltDoCompletionProcessingWhenSafe の
FltQueueDeferredIoWorkItem を する
FltRegisterFilter の
FltSetCallbackDataDirty の