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構造体の Flags メンバーからこれらのフラグをコピーします。 次の表は、最もよく使用されるフラグ値を示しています。
値 | 意味 |
---|---|
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構造体へのポインターが含まれています。
ミニフィルターは、次のコールバック ルーチン型への Data または 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 を事前操作コールバックから呼び出すと、操作を下位フィルターに送信する前に、Filter Manager によって FltObjects-FileObject>と FltObjects-Instance> が置き換えられます。
ミニフィルターの相互運用前コールバック ルーチンが I/O 操作のパラメーターを変更した場合、ミニフィルター インスタンス スタック内のその下にあるすべてのミニフィルターは、その前操作および事後操作コールバック ルーチンで変更されたパラメーターを受け取ります。
変更されたパラメーターは、ミニフィルター独自の postoperation コールバック ルーチン、またはミニフィルター インスタンス スタック内のミニフィルターの上のミニフィルターによって受信されません。 いずれの場合も、ミニフィルターのプリ操作コールバック ルーチンと事後操作コールバック ルーチンは、同じ入力パラメーター値を受け取ります。
ミニフィルターが 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 操作のサポート関数がない場合にのみ、独自のコールバック データを割り当てる必要があります。
要件
要件 | 値 |
---|---|
Header | fltkernel.h (Fltkernel.h を含む) |
こちらもご覧ください
- 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