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