FltReissueSynchronousIo 関数 (fltkernel.h)
FltReissueSynchronousIo は 、以前に同期された I/O 操作のパラメーターを使用する新しい同期 I/O 操作を開始します。
構文
VOID FLTAPI FltReissueSynchronousIo(
[in] PFLT_INSTANCE InitiatingInstance,
[in] PFLT_CALLBACK_DATA CallbackData
);
パラメーター
[in] InitiatingInstance
I/O 操作を再開するミニフィルター ドライバー インスタンスへの不透明なインスタンス ポインター。 前の I/O 操作を開始したのと同じインスタンスである必要があります。 このパラメーターは必須であり、NULL に設定することはできません。
[in] CallbackData
以前に同期された I/O 操作からのコールバック データ (FLT_CALLBACK_DATA) 構造体へのポインター。 このパラメーターは必須であり、NULL に設定することはできません。
戻り値
なし
解説
ミニフィルター ドライバーは、同期された I/O 要求を再発行する事後コールバック (PFLT_POST_OPERATION_CALLBACK) ルーチンから FltReissueSynchronousIo を呼び出します。 通常、別のパラメーターで失敗した操作を再発行したり、再解析バウンスを処理したりするために、Postoperation コールバック ルーチンから FltReissueSynchronousIo を呼び出します。 ただし、 FltReissueSynchronousIo を呼び出して、 FltAllocateCallbackData ルーチンと FltPerformSynchronousIo ルーチンの呼び出しによってミニフィルター ドライバーが生成した I/O を再発行することもできます。 この状況では、Postoperation コールバック ルーチンで FltReissueSynchronousIo を呼び出すか、操作コールバック ルーチンのコンテキスト外で呼び出すかは関係ありません。 postoperation コールバック ルーチンのコンテキスト外の呼び出しの場合は、代わりに FltReuseCallbackData ルーチンと FltPerformSynchronousIo ルーチンの使用を検討してください。
呼び出し元は、I/O 要求を再発行する前に、コールバック データ (FLT_CALLBACK_DATA) 構造体の I/O パラメーター ブロックの内容を変更できます。 その場合は、FltReissueSynchronousIo を呼び出す前に FltSetCallbackDataDirty を呼び出す必要があります。
たとえば、ミニフィルター ドライバーが再解析ポイントを使用し、その作成後のコールバック ルーチンが、STATUS_REPARSEを返した作成操作に対して呼び出された場合、ミニフィルター ドライバーは、独自の再解析ポイントの作成操作を再発行できます。 この場合、ミニフィルター ドライバーは次の手順を完了します。
コールバック データ構造体の I/O パラメーター ブロックで、FILE_OPEN_REPARSE_POINT フラグを設定します。
FltSetCallbackDataDirty を呼び出します。
FltReissueSynchronousIo を呼び出して、作成要求を再発行します。
フィルター マネージャーは、( InitiatingInstance パラメーターで指定された) 開始インスタンスの下にアタッチされているミニフィルター ドライバー インスタンスとファイル システムにのみ、再発行された I/O 要求を送信します。 開始インスタンスの上にアタッチされたミニフィルター ドライバー インスタンスは、再発行された I/O 要求を受け取りません。
同期された I/O 操作のみを再発行できます。 ドライバーに再発行機能を提供するには、postoperation コールバック ルーチンで FltReissueSynchronousIo を 呼び出すことによって、ミニフィルター ドライバーは、プリ操作コールバック ルーチンでFLT_PREOP_SYNCHRONIZEを明示的に返す必要があります。
注意
ミニフィルター ドライバーは 、FltIsOperationSynchronous ルーチンを呼び出して、この操作の事前操作コールバック ルーチンがFLT_PREOP_SYNCHRONIZE返されたかどうかを判断しません。 ミニフィルター ドライバーは FltIsOperationSynchronous を呼び出して、操作自体が I/O マネージャーの観点から同期しているかどうかを判断します。
IRP ベースの I/O 操作のみを再発行できます。 高速 I/O 操作とファイル システム フィルター (FSFilter) コールバック操作は再発行できません。 I/O 操作が IRP ベースであるかどうかを判断するには、 FLT_IS_IRP_OPERATION マクロを使用します。
取り消された作成 (IRP_MJ_CREATE) 操作は再発行できません。 作成操作に対して FltReissueSynchronousIo を呼び出す前に、呼び出し元は作成操作のファイル オブジェクトの Flags メンバーをチェックする必要があります。 FO_FILE_OPEN_CANCELLED フラグが設定されている場合は、作成操作が取り消され、このファイル オブジェクトに対してクローズ (IRP_MJ_CLOSE) 操作が発行されることを意味します。 取り消された作成操作に対して FltReissueSynchronousIo が呼び出された場合、フィルター マネージャーは再発行された I/O 要求をSTATUS_CANCELLEDで失敗します。
注意
ミニフィルター ドライバーが作成後のコールバックで作成を再発行する場合、再解析ポイント (CallbackData の TagData フィールド) に関連付けられているバッファーを解放して NULL に設定する必要はありません。 代わりに、フィルター マネージャーはバッファーを解放し、それらに対して NULL に設定します。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Update Rollup 1 for SP4;Windows XP SP2 |
サポートされている最小のサーバー | Windows Server 2003 SP1 |
対象プラットフォーム | ユニバーサル |
Header | fltkernel.h (FltKernel.h を含む) |
Library | FltMgr.lib |
[DLL] | Fltmgr.sys |
IRQL | <= APC_LEVEL (非ページング IO はPASSIVE_LEVELでのみ再発行できます) |