FSRTL_ADVANCED_FCB_HEADER 構造体 (ntifs.h)
FSRTL_ADVANCED_FCB_HEADER構造体には、ファイル システムがファイルに関して保持するコンテキスト情報が含まれています。
構文
typedef struct _FSRTL_ADVANCED_FCB_HEADER {
FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
PFAST_MUTEX FastMutex;
LIST_ENTRY FilterContexts;
EX_PUSH_LOCK PushLock;
PVOID *FileContextSupportPointer;
union {
OPLOCK Oplock;
PVOID ReservedForRemote;
};
PVOID AePushLock;
PVOID ReservedContextLegacy;
ULONG BypassIoOpenCount;
struct _FSRTL_PER_STREAM_CONTEXT *ReservedContext;
} FSRTL_ADVANCED_FCB_HEADER;
メンバー
DUMMYSTRUCTNAME
FSRTL_COMMON_FCB_HEADER型の構造体を含む名前のないメンバー。
FastMutex
DUMMYSTRUCTNAME の次のメンバーへのアクセスを同期するために使用される、初期化された高速ミューテックスへのポインター。
- AllocationSize
- FileSize
- ValidDataLength
存在する場合は、 PushLock メンバーを使用して FilterContexts メンバーへのアクセスを同期します。それ以外の場合は、 FastMutex が使用されます。
FilterContexts
ファイルに関連付けられているすべてのコンテキスト構造のリストの先頭へのポインター。 フィルター ドライバーは、 FsRtlLookupPerStreamContext を 呼び出してこの一覧を検索し、 FsRtlInsertPerStreamContext と FsRtlRemovePerStreamContext を呼び出して変更できます。
PushLock
FilterContexts リストへのアクセスを同期するために使用されるプッシュ ロック。 このフィールドは、Windows Vista 以降でのみ使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V1 以上の場合)。
FileContextSupportPointer
ファイル システム ランタイム ライブラリ (FSRTL) がファイル コンテキストを追跡するために使用するポインター フィールドへのポインター。 NULL でない場合、このメンバーは、構造を作成したファイル システムのファイルごとの構造内の PVOID 変数へのポインターである必要があります。 NULL の場合、ファイル コンテキストはサポートされません。 このメンバーは、Windows Vista 以降でのみ使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V1 以上の場合)。
Oplock
ファイルまたはディレクトリの oplock。 このフィールドは、Windows 8 以降でのみ使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V2 以上の場合)。
ReservedForRemote
ファイル システムがリモートの場合、このフィールドは予約されています。 Windows 8 以降でのみ使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V2 以上の場合)。
AePushLock
ストリーム コンテキストの一覧へのアクセスを同期するために PushLock の代わりに使用される自動展開プッシュ ロック。 詳細については、「解説」を参照してください。
AePushlock は、バージョン 20H2 Windows 10以降で使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドがFSRTL_FCB_HEADER_V3以上の場合)、FsRtlSetupAdvancedHeaderEx2 を呼び出して初期化する必要があります。
ReservedContextLegacy
このフィールドは、システムで使用するために予約されています。 Windows 10バージョン 1803 までのWindows 8.1でのみ使用されます (FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V3 以上の場合)。
BypassIoOpenCount
このストリームで BypassIO が有効になっている状態で現在開いているハンドルの数を追跡します。
このフィールドは、Windows 11以降で使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V4 以上の場合)。
ReservedContext
システムで使用するために予約されています。
このフィールドは、バージョン 22H2 Windows 11以降で使用できます (つまり、FSRTL_COMMON_FCB_HEADER構造体の Version ビット フィールドが FSRTL_FCB_HEADER_V5 以上の場合)。
注釈
FSRTL_ADVANCED_FCB_HEADER構造体は、FSRTL_COMMON_FCB_HEADER構造体のスーパーセットです。 ファイル システム (レガシ フィルタードライバーやミニフィルター ドライバーを含む)は、 FSRTL_ADVANCED_FCB_HEADER 構造を使用する必要があります。
ファイル システムでは、次のいずれかのマクロを使用して 、FSRTL_ADVANCED_FCB_HEADER 構造を初期化する必要があります。
- FsRtlSetupAdvancedHeader
- FsRtlSetupAdvancedHeaderEx
- FsRtlSetupAdvancedHeaderEx2。Windows 10 バージョン 20H2 以降で使用できます。
これらのマクロでは、次のフラグが設定されます。
フラグ | 説明 |
---|---|
FSRTL_FLAG_ADVANCED_HEADER | このフラグは、FSRTL_COMMON_FCB_HEADER構造体の Flags メンバーに設定され、FSRTL_ADVANCED_FCB_HEADER構造体に対するファイル システム ドライバーのサポートを示します。 このフラグは変更しないでください。 |
FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS | FSRTL_COMMON_FCB_HEADER の Flags2 メンバーに設定すると、このフラグはフィルター ドライバー コンテキストのサポートを示します。 このフラグは、ページング ファイルに対してのみクリアできます (表の後の情報を参照してください)。 |
ファイル システムでは、FSRTL_ADVANCED_FCB_HEADER構造体を指すように、すべてのファイル オブジェクトの FsContext メンバーを設定する必要があります。 この構造体は、ファイル システム ストリームに固有のコンテキスト オブジェクト構造内に埋め込むことができます (構造体の残りの部分はファイル システム固有です)。 通常、この構造はファイル制御ブロック (FCB) です。 ただし、NTFS などの複数のデータ ストリームをサポートする一部のファイル システムでは、ストリーム制御ブロック (SCB) です。 ボリュームオープン要求を含め、オープン要求のすべてのクラスの FCB と SCB には、この構造を含める必要があることに注意してください。
ファイルがページング ファイルの場合は、非ページ プールから FSRTL_ADVANCED_FCB_HEADER 構造体を割り当てる必要があります。 それ以外の場合は、ページ プールまたは非ページ プールから割り当てられます。
すべての Microsoft ファイル システムは、FsRtlSetupAdvancedHeader を呼び出した後、FSRTL_COMMON_FCB_HEADER の Flags2 メンバーのFSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS フラグをクリアすることで、ページング ファイルのストリーム コンテキストのサポートを無効にします。 (FASTFAT WDK サンプルについては、Strucsup.c の FatCreateFcb 関数を参照してください)。オペレーティング システムがすべてのファイル システムで一貫した方法で動作するように、ファイル システムまたはシステムで同じ操作を行うことを強くお勧めします。
プッシュ ロックの自動展開
自動拡張プッシュ ロックは、Windows 10 バージョン 20H2 で導入されました。 フィルタマネージャのロックが当初設計されていたとき、大規模なマルチプロセッサシステムは非常に珍しく、RAMは貴重でした。 このようなシステムが一般的になり、RAMが制限されていないので、自動拡張プッシュロックはメモリ消費と速度の間で有益なトレードオフを提供します。
自動拡張プッシュ ロックは、多数の同時共有取得者が原因でキャッシュ競合が大きくなることが検出されると、通常のキャッシュ対応以外のプッシュ ロックからキャッシュ対応プッシュ ロックに自動的に変更される可能性があります。 自動拡張プッシュ ロックは、展開されていない場合は通常のプッシュ ロックよりも大きくなりますが、キャッシュ対応のプッシュ ロックほど大きくはありません。 このプッシュ ロックの種類は、マルチプロセッサ システムでよりパフォーマンスが高くなります。
要件
要件 | 値 |
---|---|
Header | ntifs.h (Ntifs.h、Fltkernel.h を含む) |