ATTRIBUTE_RECORD_HEADER 结构

[此结构仅适用于 NTFS 卷的版本 3;它可能会在将来的版本中更改。]

表示属性记录。

语法

typedef struct _ATTRIBUTE_RECORD_HEADER {
  ATTRIBUTE_TYPE_CODE TypeCode;
  ULONG               RecordLength;
  UCHAR               FormCode;
  UCHAR               NameLength;
  USHORT              NameOffset;
  USHORT              Flags;
  USHORT              Instance;
  union {
    struct {
      ULONG  ValueLength;
      USHORT ValueOffset;
      UCHAR  Reserved[2];
    } Resident;
    struct {
      VCN      LowestVcn;
      VCN      HighestVcn;
      USHORT   MappingPairsOffset;
      UCHAR    Reserved[6];
      LONGLONG AllocatedLength;
      LONGLONG FileSize;
      LONGLONG ValidDataLength;
      LONGLONG TotalAllocated;
    } Nonresident;
  } Form;
} ATTRIBUTE_RECORD_HEADER, *PATTRIBUTE_RECORD_HEADER;

成员

TypeCode

属性类型代码。

含义
$STANDARD_INFORMATION
0x10
文件属性 (,例如只读和存档) 、时间戳 ((如文件创建和上次修改) )以及硬链接计数。
$ATTRIBUTE_LIST
0x20
构成文件的属性列表,以及每个属性所在的 MFT 文件记录的文件引用。
$FILE_NAME
0x30
文件的名称(以 Unicode 字符为单位)。
$OBJECT_ID
0x40
链接跟踪服务分配的 64 字节对象标识符。
$VOLUME_NAME
0x60
卷标。 存在于 $Volume 文件中。
$VOLUME_INFORMATION
0x70
卷信息。 存在于 $Volume 文件中。
$DATA
0x80
文件的内容。
$INDEX_ROOT
0x90
用于实现大型目录的文件名分配。
$INDEX_ALLOCATION
0xA0
用于实现大型目录的文件名分配。
$BITMAP
0xB0
大型目录的位图索引。
$REPARSE_POINT
0xC0
重新分析点数据。

 

RecordLength

属性记录的大小(以字节为单位)。 此值反映记录变体所需的大小,并且始终舍入到最接近的四字边界。

FormCode

属性窗体代码。

含义
RESIDENT_FORM
0x00
值包含在文件记录中,并紧跟在属性记录标头后面。
NONRESIDENT_FORM
0x01
该值包含在磁盘上的其他扇区中。

 

NameLength

可选属性名称的大小(以字符为单位),如果没有属性名称,则为 0。 最大属性名称长度为 255 个字符。

NameOffset

属性名称与属性记录开头的偏移量(以字节为单位)。 如果 NameLength 成员为 0,则此成员未定义。

标志

属性标志。

ATTRIBUTE_FLAG_COMPRESSION_MASK (0x00FF)

ATTRIBUTE_FLAG_SPARSE (0x8000)

ATTRIBUTE_FLAG_ENCRYPTED (0x4000)

实例

文件记录中此属性的唯一实例。

形式

如果 FormCode 成员RESIDENT_FORM,则联合是 常驻 结构。 如果 FormCode 是NONRESIDENT_FORM,则联合是 一个非实体 结构。

居民

ValueLength

属性值的大小(以字节为单位)。

ValueOffset

从属性记录开始的值的偏移量(以字节为单位)。

Reserved

保留。

非resident

LowestVcn

此属性记录涵盖的最低虚拟群集数 (VCN) 。

HighestVcn

此属性记录涵盖的最高 VCN。

MappingPairsOffset

从属性记录的开头到映射对数组的偏移量(以字节为单位)。 有关详细信息,请参阅“备注”。

Reserved

保留。

AllocatedLength

文件的分配大小(以字节为单位)。 此值是群集大小的偶数倍。 如果 MinimumVcn 成员为非零,则此成员无效。

FileSize

文件大小 (可读取的最高字节加上 1) (以字节为单位)。 如果 LowestVcn 为非零,则此成员无效。

ValidDataLength

有效数据长度 (最大初始化字节加上 1) (以字节为单位)。 此值舍入到最近的群集边界。 如果 LowestVcn 不为零,则此成员无效。

TotalAllocated

为文件分配的总 (分配的群集) 的总和。

备注

请注意,此结构没有关联的头文件。

此结构定义仅对主版本 3 和次要版本 0 或 1 有效,如 FSCTL_GET_NTFS_VOLUME_DATA 报告的那样。

属性记录始终在四字边界上对齐。

如果属性为非属性,则属性记录标头包含检索信息的列表,该列表提供 VCN 与逻辑群集号之间的映射, (LCN) 属性。 如果检索信息不适合基本文件段,则可以单独将其存储在外部文件记录段中。 如果它仍然不适合一个外部文件记录段,则属性列表中有一个预配,用于包含需要其他检索信息的属性的多个条目。

映射对数组以压缩形式存储,并假定信息已由系统解压缩和缓存。 它由一系列 NextVcn/CurrentLcn 对组成。 例如,如果文件从 LCN 128 开始运行 8 个群集,而文件从 LowestVcn 0 开始,则映射对数组只有一个条目,即 NextVcn=8 和 CurrentLcn=128。 数组是一个字节流,在按顺序处理时存储对工作变量的更改。 字节流将被解释为以零结尾的三元流,如下所示:

count byte = v + (l * 16)

其中 v 是已更改的低阶 VCN 字节数, l 是已更改的低阶 LCN 字节数。

解压缩算法如下所示:

  1. 将 NextVcn 初始化为 Attribute->LowestVcn ,将 CurrentLcn 初始化为 0。
  2. 初始化指向 (PCHAR)Attribute + Attribute->AttributeForm->Nonresident->MappingPairsOffset的字节流指针。
  3. 将 CurrentVcn 设置为 NextVcn。
  4. 从流中读取下一个字节。 如果为 0,则中断;else 按前面所述提取 vl
  5. 将下一 个 v 字节解释为有符号数量,先使用低序字节。 将其解压缩为 64 位的签名扩展,并将其添加到 NextVcn。
  6. 将下一 个 l 字节解释为有符号数量,先使用低序字节。 将其解压缩为 64 位的签名,并将其添加到 CurrentLcn。 如果这生成的 CurrentLcn 为 0,则从 CurrentVcn 到 NextVcn–1 的 VPN 将取消分配。
  7. 从 CurrentVcn、NextVcn 和 CurrentLcn 更新缓存的映射信息。
  8. 转到步骤 3。

另请参阅

主文件表