FLT_IO_PARAMETER_BLOCK構造体 (fltkernel.h)
FLT_IO_PARAMETER_BLOCK 構造体には、FLT_CALLBACK_DATA コールバック データ構造によって表される I/O 操作のパラメーターが含まれています。
構文
typedef struct _FLT_IO_PARAMETER_BLOCK {
ULONG IrpFlags;
UCHAR MajorFunction;
UCHAR MinorFunction;
UCHAR OperationFlags;
UCHAR Reserved;
PFILE_OBJECT TargetFileObject;
PFLT_INSTANCE TargetInstance;
FLT_PARAMETERS Parameters;
} FLT_IO_PARAMETER_BLOCK, *PFLT_IO_PARAMETER_BLOCK;
メンバーズ
IrpFlags
I/O 操作のさまざまな側面を指定するフラグのビットマスク。 これらのフラグは、IRP ベースの操作にのみ使用されます。 フラグ値を次の表に示します。
価値 | 意味 |
---|---|
IRP_BUFFERED_IO | この操作は、バッファー内の I/O 操作です。 |
IRP_CLOSE_OPERATION | 操作はクリーンアップ操作または終了操作です。 |
IRP_DEALLOCATE_BUFFER | I/O マネージャーは、IRP の完了フェーズ中にバッファーを解放します。 |
IRP_INPUT_OPERATION | 操作は入力操作です。 |
IRP_NOCACHE | この操作は、キャッシュされていない I/O 操作です。 |
IRP_PAGING_IO | 操作はページング I/O 操作です。 |
IRP_SYNCHRONOUS_API | I/O 操作は同期です。 |
IRP_SYNCHRONOUS_PAGING_IO | 操作は同期ページング I/O 操作です。 |
IRP_MOUNT_COMPLETION | 操作のボリューム マウントが完了しました。 |
IRP_CREATE_OPERATION | 操作は、作成操作または開いている操作です。 |
IRP_READ_OPERATION | I/O 操作は読み取り用です。 |
IRP_WRITE_OPERATION | I/O 操作は書き込み用です。 |
IRP_DEFER_IO_COMPLETION | 操作の I/O 完了は遅延されます。 |
IRP_ASSOCIATED_IRP | 操作はマスター IRP に関連付けられています。 |
IRP_OB_QUERY_NAME | 操作は非同期の名前クエリです。 |
IRP_HOLD_DEVICE_QUEUE | 引っ込み思案。 |
IRP_UM_DRIVER_INITIATED_IO | 操作は、ユーザー モード ドライバーから発生しました。 |
MajorFunction
I/O 操作の主要な関数コード。 主要な関数コードは、IRP ベースの操作、高速 I/O 操作、およびファイル システム (FSFilter) コールバック操作に使用されます。 その他の操作の詳細については、FLT_PARAMETERSを参照してください。
MinorFunction
I/O 操作のマイナー関数コード。 このメンバーは省略可能であり、NULL できます。 MajorFunction メンバー 値によって、使用可能な値が決まります。 マイナー関数コードの詳細については、FLT_PARAMETERSを参照してください。
OperationFlags
I/O 操作のさまざまな側面を指定するフラグのビットマスク。 これらのフラグは、IRP ベースの操作にのみ使用されます。 フィルター マネージャーは、IRPに関連付けられている IO_STACK_LOCATION 構造体の フラグ メンバーからこれらのフラグをコピーします。 次の表は、最もよく使用されるフラグ値を示しています。
価値 | 意味 |
---|---|
SL_CASE_SENSITIVE | IRP_MJ_CREATEに使用されます。 このフラグが設定されている場合、ファイル名の比較では大文字と小文字が区別されます。 |
SL_EXCLUSIVE_LOCK | IRP_MJ_LOCK_CONTROLに使用されます。 このフラグが設定されている場合は、排他的バイト範囲ロックが要求されます。 それ以外の場合は、共有ロックが要求されます。 |
SL_FAIL_IMMEDIATELY | IRP_MJ_LOCK_CONTROLに使用されます。 このフラグが設定されている場合、すぐに許可できない場合、ロック要求は失敗します。 |
SL_FORCE_ACCESS_CHECK | IRP_MJ_CREATEに使用されます。 このフラグが設定されている場合は、IRP の RequestorMode メンバーの値が KernelMode 場合でも、アクセス チェックを実行する必要があります。 |
SL_FORCE_DIRECT_WRITE | IRP_MJ_WRITEとIOCTL_DISK_COPY_DATAに使用されます。 このフラグが設定されている場合、カーネル モード ドライバーは、通常、セキュリティ上の理由から書き込みがブロックされているボリューム領域に書き込むことができます。 このフラグは、ファイル システム レイヤーとストレージ スタック レイヤーの両方でオンになります。 SL_FORCE_DIRECT_WRITE フラグは、Windows Vista 以降のバージョンの Windows で使用できます。 |
SL_INDEX_SPECIFIED | IRP_MJ_DIRECTORY_CONTROL、IRP_MJ_QUERY_EA、および IRP_MJ_SET_QUOTAに使用されます。 このフラグが設定されている場合、ディレクトリ、クォータ、または拡張属性の情報のスキャンは、インデックスが指定されているリスト内のエントリから開始する必要があります。 |
SL_OPEN_PAGING_FILE | IRP_MJ_CREATEに使用されます。 このフラグが設定されている場合、ファイルはページング ファイルです。 |
SL_OPEN_TARGET_DIRECTORY | IRP_MJ_CREATEに使用されます。 このフラグが設定されている場合は、ファイルの親ディレクトリを開く必要があります。 |
SL_OVERRIDE_VERIFY_VOLUME | IRP_MJ_DIRECTORY_CONTROL、IRP_MJ_READ、および IRP_MJ_WRITEに使用されます。 このフラグが設定されている場合、ボリュームのデバイス オブジェクトに DO_VERIFY_VOLUME フラグが設定されている場合でも、I/O 操作を実行する必要があります。 |
SL_RESTART_SCAN | IRP_MJ_DIRECTORY_CONTROL、IRP_MJ_QUERY_EA、および IRP_MJ_SET_QUOTAに使用されます。 このフラグが設定されている場合、ディレクトリ、クォータ、または拡張属性の情報のスキャンは、ディレクトリまたはリストの最初のエントリから開始する必要があります。 それ以外の場合は、前のスキャンからスキャンを再開する必要があります。 |
SL_RETURN_SINGLE_ENTRY | IRP_MJ_DIRECTORY_CONTROL、IRP_MJ_QUERY_EA、および IRP_MJ_SET_QUOTAに使用されます。 このフラグが設定されている場合、ディレクトリ、クォータ、または拡張属性の情報をスキャンすると、最初に見つかったエントリのみが返されます。 |
SL_WATCH_TREE | IRP_MJ_DIRECTORY_CONTROLに使用されます。 このフラグが設定されている場合は、このディレクトリのすべてのサブディレクトリも監視する必要があります。 それ以外の場合は、ディレクトリ自体のみが監視されます。 |
SL_WRITE_THROUGH | IRP_MJ_WRITEに使用されます。 このフラグが設定されている場合、ファイル データはキャッシュに書き込まれるだけでなく、永続ストレージに書き込まれる必要があります。 |
Reserved
システム用に予約されています。 使用しないでください。
TargetFileObject
この I/O 操作のターゲットであるファイルまたはディレクトリのファイル オブジェクト ポインター。
TargetInstance
この I/O 操作のターゲットであるミニフィルターの不透明なインスタンス ポインター。
Parameters
MajorFunction および MinorFunction メンバーで指定された I/O 操作のパラメーター 含む FLT_PARAMETERS 構造体。
備考
FLT_IO_PARAMETER_BLOCK 構造体には、コールバック データ (FLT_CALLBACK_DATA) 構造体で表される I/O 操作のパラメーターが含まれています。 コールバック データ構造体には、Iopb メンバー内のFLT_IO_PARAMETER_BLOCK構造体へのポインターが含まれています。
ミニフィルターは、コールバック データ構造体へのポインターを、データ として受け取るか、次のコールバック ルーチン型への入力パラメーター CallbackData 受け取ります。
- PFLT_POST_OPERATION_CALLBACK
- PFLT_PRE_OPERATION_CALLBACK
- PFLT_COMPLETED_ASYNC_IO_CALLBACK
- PFLT_GENERATE_FILE_NAME
ミニフィルターの事前操作コールバック ルーチンと事後操作コールバック ルーチンは、MajorFunction および予約済み メンバーを除き、I/O 操作のFLT_IO_PARAMETER_BLOCK構造体 内容を変更できます。 その場合は、操作のコールバック データ構造の IoStatus メンバーも変更していない限り、FltSetCallbackDataDirty呼び出す必要があります。 それ以外の場合、変更された値は無視されます。
フィルター マネージャーがミニフィルターに対して事前操作コールバックまたは事後処理コールバックを発行した場合、FltObjects- >FileObject と TargetFileObject (CallbackData->Iopb->TargetFileObject) は、最初は同じです。 ミニフィルターが TargetFileObject 変更するか、TargetInstance をした場合、後続の呼び出しでプリオペレーション コールバックから FltSetCallbackDataDirty を すると、フィルター マネージャーは、操作を下位フィルターに送信する前に、FltObjects->FileObject と fltObjects->インスタンス 置き換えます。
ミニフィルターの事前操作コールバック ルーチンが I/O 操作のパラメーターを変更した場合、ミニフィルター インスタンス スタック内のミニフィルターの下にあるすべてのミニフィルターは、その前操作および事後操作コールバック ルーチンで変更されたパラメーターを受け取ります。
変更されたパラメーターは、ミニフィルターの独自のポスト操作コールバック ルーチン、またはミニフィルター インスタンス スタック内のミニフィルターの上のミニフィルターでは受け取りません。 いずれの場合も、ミニフィルターの事前操作コールバック ルーチンと事後操作コールバック ルーチンは、同じ入力パラメーター値を受け取ります。
ミニフィルターが TargetInstance メンバーの値を変更する場合、新しい値は、異なるボリューム上の同じ高度にある同じミニフィルターのインスタンスへのポインターである必要があります。 さらに、新しいボリュームのデバイス オブジェクトには、元のボリュームのデバイス オブジェクト以上のスタック サイズが必要です。
ボリュームにアタッチされているインスタンスの不透明なインスタンス ポインターを指定して、ボリューム デバイス オブジェクトのスタック サイズを取得するには、次の操作を行います。
- FltGetVolumeFromInstance 呼び出して、ボリューム ポインターを取得します。
- FltGetDeviceObject 呼び出して、ボリューム デバイス オブジェクトへのポインターを取得します。 このポインターは、DeviceObject パラメーターで返されます。 デバイス オブジェクトのスタック サイズは、DeviceObject->StackSize にあります。
- ボリューム ポインターが不要になったら、FltObjectDereference 呼び出して参照カウントを減らします。
- ボリューム デバイス オブジェクト ポインターが不要になったら、ObDereferenceObject を呼び出して、その参照カウントを減らします。
ミニフィルターは、TargetFileObject メンバーの値を変更できます。 ただし、新しい値は、TargetInstance メンバーによって指定されたインスタンスと同じボリューム上にあるファイルのファイル オブジェクトへのポインターである必要があります。
ミニフィルターは、MajorFunction メンバーの値を安全に変更できません。 代わりに、新しい I/O 操作を開始する必要があります。
ミニフィルターは、FltReadFileなどのサポート ルーチンを呼び出すか、fltAllocateCallbackData呼び出してコールバック データ構造を割り当てることによって、I/O 操作を開始できます。FLT_IO_PARAMETER_BLOCK 構造体の I/O パラメーターを初期化し、コールバック データ構造を FltPerformSynchronousIoまたは fltPerformAsynchronousIo渡します。
手記
I/O 操作を開始するときは、可能な限りサポート ルーチンを使用します。 ミニフィルターは、特定の I/O 操作のサポート関数がない場合にのみ、独自のコールバック データを割り当てる必要があります。
必要条件
要件 | 価値 |
---|---|
ヘッダー | fltkernel.h (Fltkernel.h を含む) |
関連項目
FltAllocateCallbackDataの
FltClearCallbackDataDirtyをする
FltDecodeParametersの
FltIsCallbackDataDirtyの
FltReadFileの
FltSetCallbackDataDirtyの
- IRP_MJ_ACQUIRE_FOR_MOD_WRITEのFLT_PARAMETERS
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATIONのFLT_PARAMETERS
- IRP_MJ_CREATEのFLT_PARAMETERS
- IRP_MJ_CREATE_MAILSLOTのFLT_PARAMETERS
- IRP_MJ_CREATE_NAMED_PIPEのFLT_PARAMETERS
- IRP_MJ_DEVICE_CONTROLのFLT_PARAMETERS
- IRP_MJ_DIRECTORY_CONTROLのFLT_PARAMETERS
- IRP_MJ_FAST_IO_CHECK_IF_POSSIBLEのFLT_PARAMETERS
- IRP_MJ_FILE_SYSTEM_CONTROLのFLT_PARAMETERS
- IRP_MJ_INTERNAL_DEVICE_CONTROLのFLT_PARAMETERS
- IRP_MJ_LOCK_CONTROLのFLT_PARAMETERS
- IRP_MJ_MDL_READのFLT_PARAMETERS
- IRP_MJ_MDL_READ_COMPLETEのFLT_PARAMETERS
- IRP_MJ_MDL_WRITE_COMPLETEのFLT_PARAMETERS
- IRP_MJ_NETWORK_QUERY_OPENのFLT_PARAMETERS
- IRP_MJ_PNPのFLT_PARAMETERS
- IRP_MJ_PREPARE_MDL_WRITEのFLT_PARAMETERS
- IRP_MJ_QUERY_EAのFLT_PARAMETERS
- IRP_MJ_QUERY_INFORMATIONのFLT_PARAMETERS
- IRP_MJ_QUERY_OPENのFLT_PARAMETERS
- IRP_MJ_QUERY_QUOTAのFLT_PARAMETERS
- IRP_MJ_QUERY_SECURITYのFLT_PARAMETERS
- IRP_MJ_QUERY_VOLUME_INFORMATIONのFLT_PARAMETERS
- IRP_MJ_READのFLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_MOD_WRITEのFLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATIONのFLT_PARAMETERS
- IRP_MJ_SET_EAのFLT_PARAMETERS
- IRP_MJ_SET_INFORMATIONのFLT_PARAMETERS
- IRP_MJ_SET_QUOTAのFLT_PARAMETERS
- IRP_MJ_SET_SECURITYのFLT_PARAMETERS
- IRP_MJ_SET_VOLUME_INFORMATIONのFLT_PARAMETERS
- IRP_MJ_SYSTEM_CONTROLのFLT_PARAMETERS
- IRP_MJ_VOLUME_MOUNTのFLT_PARAMETERS
- IRP_MJ_WRITEのFLT_PARAMETERS