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 来搜索此列表,并通过调用 FsRtlInsertPerStreamContextFsRtlRemovePerStreamContext 对其进行修改。

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。 此字段仅在FSRTL_COMMON_FCB_HEADER结构的Version 位字段大于或等于FSRTL_FCB_HEADER_V2) 时Windows 8 (才可用。

ReservedForRemote

如果文件系统是远程的,则保留此字段。 仅当FSRTL_COMMON_FCB_HEADER结构的Version 位字段大于或等于FSRTL_FCB_HEADER_V2) 时,Windows 8 (才可用。

AePushLock

自动展开推送锁,用于而不是 PushLock 来同步对流上下文列表的访问。 有关详细信息,请参阅“备注”。

AePushlock 从 Windows 10 版本 20H2 (开始可用,也就是说,如果 FSRTL_COMMON_FCB_HEADER 结构的 Version 位字段大于或等于 FSRTL_FCB_HEADER_V3) ,则必须通过调用 FsRtlSetupAdvancedHeaderEx2 进行初始化。

ReservedContextLegacy

BypassIoOpenCount

跟踪当前在此流上启用 BypassIO 的情况下打开的句柄数。

此字段从Windows 11 (开始可用,即,如果FSRTL_COMMON_FCB_HEADER结构的 Version 位字段大于或等于FSRTL_FCB_HEADER_V4) 。

ReservedContext

此字段保留供系统使用。 仅当 FSRTL_COMMON_FCB_HEADER 结构的 Version 位字段大于或等于 FSRTL_FCB_HEADER_V3) 时,Windows 10版本 1803 (才在Windows 8.1中使用。

注解

FSRTL_ADVANCED_FCB_HEADER结构是FSRTL_COMMON_FCB_HEADER结构的超集。 文件系统 (包括旧版筛选器和微筛选器驱动程序(如果适用) 必须使用 FSRTL_ADVANCED_FCB_HEADER 结构)。

文件系统必须使用以下宏之一来初始化 FSRTL_ADVANCED_FCB_HEADER 结构:

以下标志由这些宏设置。

标志 含义
FSRTL_FLAG_ADVANCED_HEADER FSRTL_COMMON_FCB_HEADER 结构的 Flags 成员中设置此标志,指示文件系统驱动程序支持FSRTL_ADVANCED_FCB_HEADER结构。 不应修改此标志。
FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS FSRTL_COMMON_FCB_HEADERFlags2 成员中设置此标志表示支持筛选器驱动程序上下文。 只能为分页文件清除此标志, (表) 后查看信息。

文件系统必须将每个文件对象的 FsContext 成员设置为指向 FSRTL_ADVANCED_FCB_HEADER 结构。 此结构可以嵌入特定于文件系统流的上下文对象结构内, (结构的其余部分是特定于文件系统的) 。 通常,此结构是 FCB) (文件控制块。 但是,在支持多个数据流的某些文件系统(如 NTFS)上,它是 SCB) (流控制块。 请注意,所有类别的打开请求(包括批量打开请求)的 FDB 和 SCB 必须包含此结构。

如果文件是分页文件,则必须从非分页池分配 FSRTL_ADVANCED_FCB_HEADER 结构。 否则,可以从分页池或非分页池中分配该池。

所有 Microsoft 文件系统在调用 FsRtlSetupAdvancedHeader 后,通过在 FSRTL_COMMON_FCB_HEADER 的 Flags2 成员中清除FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS标志,禁用对分页文件的流上下文支持。 (请参阅 Strucsup.c 中的 FatCreateFcb 函数以获取 FASTFAT WDK sample.) 强烈建议在文件系统中执行相同的操作,以便操作系统在所有文件系统中以一致的方式运行。

自动扩展推送锁

Windows 10版本 20H2 中引入了自动扩展推送锁。 最初设计筛选器管理器的锁时,大型多处理器系统非常罕见,RAM 非常珍贵。 由于此类系统现在很常见,并且 RAM 没有限制,自动扩展推送锁在内存消耗和速度之间提供了有益的权衡。

当自动扩展推送锁检测到由于大量并发共享获取器而出现高缓存争用时,它会自动从常规的非缓存感知推送锁更改为缓存感知推送锁。 自动扩展推送锁在未展开时大于普通的推送锁,但不如缓存感知的推送锁大。 此推送锁类型在多处理器系统上的性能更高。

要求

要求
Header ntifs.h (包括 Ntifs.h、Fltkernel.h)

另请参阅

FSRTL_COMMON_FCB_HEADER

FSRTL_PER_STREAM_CONTEXT

FsRtlInsertPerStreamContext

FsRtlLookupPerStreamContext

FsRtlRemovePerStreamContext

FsRtlSetupAdvancedHeader

FsRtlSetupAdvancedHeaderEx

FsRtlSetupAdvancedHeaderEx2

FsRtlTeardownPerStreamContexts