文件属性记录
文件中的每个记录都是由属性组成。每个属性由相同的格式构成,首先是一个标准属性记录头,然后存放属性的专用数据。下面列出$AttrDef中定义的可用到的属性。
类型
|
操作系统
|
描述
|
0x10
|
|
STANDARD_INFORMATION
|
0x20
|
|
ATTRIBUTE_LIST
|
0x30
|
|
FILE_NAME
|
0x40
|
NT
|
VOLUME_VERSION
|
0x40
|
2K
|
OBJECT_ID
|
0x50
|
|
SECURITY_DESCRIPTOR
|
0x60
|
|
VOLUME_NAME
|
0x70
|
|
VOLUME_INFORMATION
|
0x80
|
|
DATA
|
0x90
|
|
INDEX_ROOT
|
0xA0
|
|
INDEX_ALLOCATION
|
0xB0
|
|
BITMAP
|
0xC0
|
NT
|
SYMBOL_LINK
|
0xC0
|
2K
|
REPARSE_POINT
|
0xD0
|
|
EA_INFORMATION
|
0xE0
|
|
EA
|
0xF0
|
NT
|
PROPERTY_SET
|
0x100
|
2K
|
LOGGED_UNTILITY_STREAM
|
每个MFT属性记录都有一个属性记录头,这个头记录了属性的类型、名字(可选)、有两种格式:
1. 驻留属性
名字
|
偏移
|
尺寸
|
说明
|
ATTR_Type
|
0x00
|
4
|
属性类型。该值必须是$AttrDef文件中定义的属性列表中的一项
|
ATTR_Size
|
0x04
|
4
|
记录尺寸(包括记录头)
|
ATTR_NonResFlag
|
0x08
|
1
|
属性数据非驻留标志,值为0,驻留属性不能被压缩
|
ATTR_NamSz
|
0x09
|
1
|
属性名尺寸,该值为0时表示当前属性没有名字
|
ATTR_NamOff
|
0x0a
|
2
|
属性名相对于属性头的偏移,该值总是固定为0x18
|
ATTR_Flags
|
0x0c
|
2
|
属性标志,在当前的版本中只支持以下3个标志:
0x4000属性被加密
0x8000稀疏属性
注意:只有非驻留的数据(Data)属性才能被压缩
|
ATTR_Id
|
0x0d
|
2
|
属性ID,在MFT记录中的每个属性都有一个唯一的ID。与MFT 的FR_NxtAttrId对应
|
ATTR_DatSz
|
0x10
|
4
|
属性数据尺寸
|
ATTR_DatOff
|
0x14
|
2
|
属性数据相对于属性头的偏移
|
ATTR_Indx
|
0x16
|
1
|
属性索引标志(对FILE_NAME有效)
|
ATTR_Resvd
|
0x17
|
1
|
保留
|
ATTR_AttrNam
|
0x18
|
2*N
|
属性名字Unicode字符串,这个字符串不用在结尾处加0
|
ATTR_AttrDat
|
0x18+2*N
|
|
属性数据,所以的数据都应该按双字对齐
(为各常驻属性实体部分)
|
>=24 bytes
2. 非驻留属性
名字
|
偏移
|
尺寸
|
说明
|
ATTR_Type
|
0x00
|
4
|
属性类型。该值必须是$AttrDef文件中定义的属性列表中的一项
|
ATTR_Size
|
0x04
|
4
|
记录尺寸(包括记录头)
|
ATTR_NonResFlag
|
0x08
|
1
|
属性数据非驻留标志,值为1
|
ATTR_NamSz
|
0x09
|
1
|
属性名尺寸,该值为0时表示当前属性没有名字
|
ATTR_NamOff
|
0x0a
|
2
|
属性名相对于属性头的偏移,该值总是固定为0x18
|
ATTR_Flags
|
0x0c
|
2
|
属性标志,在当前的版本中只支持以下3个标志:
0x0001属性被压缩
0x4000属性被加密
0x8000稀疏属性
注意:只有非驻留的数据(Data)属性才能被压缩
|
ATTR_Id
|
0x0d
|
2
|
属性ID,在MFT记录中的每个属性都有一个唯一的ID。
|
ATTR_StartVCN
|
0x10
|
8
|
本属性中数据流开始的簇号
|
ATTR_EndVCN
|
0x18
|
8
|
本属性中数据流最后一簇的簇号
|
ATTR_DataOff
|
0x20
|
2
|
数据流描述相对于属性头的偏移,数据应该按双字对齐
|
ATTR_CmpSz
|
0x22
|
2
|
压缩单元的尺寸。压缩单元的尺寸必须是2的整数次幂,为0表示未压缩
|
ATTR_Resvd
|
0x24
|
4
|
保留
|
ATTR_AllocSz
|
0x28
|
8
|
属性记录数据块分配的空间的尺寸,该尺寸按簇尺寸对齐
|
ATTR_ValidSz
|
0x30
|
8
|
属性记录数据块的实际尺寸
|
ATTR_InitedSz
|
0x38
|
8
|
属性记录数据块已经初始化数据的尺寸,到目前为止该值都与属性记录数据块分配的尺寸相同
|
ATTR_AttrNam
|
0x40
|
2*N
|
属性名的UNICODE字符串,该字符串不以0结尾
|
ATTR_DataRuns
|
0x40+2*N
|
|
属性数据流描述(为各非常驻属性逻辑簇区域指向,具体实体在指向区域)
|
>=64 bytes
注意
1. 只有非驻留的数据(Data)属性才可以被压缩或是稀疏类型。
2. 只有驻留属性才有索引标志,是否表示只有驻留属性才能被索引?
STANDARD_INFORMATION (0x10 常驻属性 len=0x30,0x48)
在老的NTFS版本中,STARDAND_INFORMATION属性只用于存放文件的时间和DOS文件属性信息。在Windows 2000中新引进了4个域来描述配额、安全、文件尺寸和日志信息。
属性描述如下表:
名字
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头(24 字节)
|
SI_CreatTime
|
0x00
|
8
|
文件创建时间
|
SI_AlterTime
|
0x08
|
8
|
文件最后一次修改时间
|
SI_MFTChgTime
|
0x10
|
8
|
文件的MFT记录修改的时间
|
SI_ReadTime
|
0x18
|
8
|
最后一次访问的时间
|
SI_DOSAttr
|
0x20
|
4
|
DOS文件属性,可以是以下各值的组合:
0x0001 只读
0x0002 隐藏
0x0004 系统
0x0020 归档
0x0040 设备
0x0080 常规
0x0100 临时文件
0x0200 稀疏文件
0x0400 重解析点
0x0800 压缩
0x1000 离线
0x2000 无内容索引
0x4000 加密
|
SI_MaxVer
|
0x24
|
4
|
文件可用的最大版本号,此值为0表示版本功能被禁止(目前未使用?)
|
SI_Ver
|
0x28
|
4
|
文件版本号,如果最大版本号为0则值也必须为0
|
SI_ClassId
|
0x2c
|
4
|
不明(目前未使用?)
|
SI_OwnerId
|
0x30
|
4(2K)
|
文件拥有者的ID,本ID是$Quota文件中$O或$Q记录中的键,如果该值为0则表示配额设置被禁止
|
SI_SecurityId
|
0x34
|
4(2K)
|
安全ID,本值是$Securce文件中$SII索引及$SDS数据流的键
|
SI_QuotaCharged
|
0x38
|
8(2K)
|
该文件最大可使用的空间配额。如果该值为0则表示无配额限制
|
SI_USN
|
0x40
|
8(2K)
|
文件最后一次更新的记录号,该值是$UsnJrnl文件的直接索引,如果该值为0则表示更新日志被禁止
|
当MFT记录中的属性太多太长时,MFT记录就容纳不下这么多属性记录了,这时就只能将属性的数据以非驻留数据的形式存放到卷中的其他位置,如果这样还是存放不下,就必须用到属性表属性了。存放不下的属性会被转移到一个新分配的MFT记录中,然后在原MFT中加入一个属性表属性以描述如何搜索到当前文件的所有属性。
紧随标准属性头之后存放各属性的描述记录,记录了属性的位置和所在MFT记录,每个属性描述按4字对齐,记录了属性的类型、名字(有名属性)、序号。
属性表属性中不包括对自身的描述。
名字
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头
|
AL_RD_Type
|
0
|
4
|
属性类型
|
AL_RD_Len
|
4
|
2
|
属性描述尺寸
|
AL_RD_NamLen
|
6
|
1
|
属性名尺寸,值为N
|
AL_RD_NamOff
|
7
|
1
|
属性名相对于属性描述的偏移
|
AL_RD_StartVCN
|
8
|
8
|
本属性中数据流开始的簇号
|
AL_RD_BaseFRS
|
0x10
|
8
|
本属性记录所属的MFT记录的记录号。
注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号
|
AL_RD_AttrId
|
0x18
|
2
|
属性的ID
|
AL_RD_Name
|
0x1a
|
2*N
|
属性名UNICODE字符串。该字符串不以0字符为结束标志
|
注:使用属性表属性通常因为以下情况:
1. 文件有太多的别名。
2. 碎片太多以至于数据流描述填满了MFT记录。
3. 有太复杂的安全描述(在NTFS 3.0以后的版本中不会再出现这种情况)。
4. 有太多的命令流,比如数据流。
FILE_NAME (0x30 常驻属性 len = 68~578))
本属性用于描述文件的名字,本属性总是驻留在MFT记录中。
在$AttrDef的定义中,本属性的最小尺寸是68字节,最大是578字节,因此最大文件名长度是255个字节。
名字
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头(24 字节)
|
FN_ParentFR
|
0
|
8
|
父目录的MFT记录的记录索引。
注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号
|
FN_CreatTime
|
8
|
8
|
文件创建的时间
|
FN_AlterTime
|
0x10
|
8
|
文件最后一次被修改的时间
|
FN_MFTChg
|
0x18
|
8
|
文件的MFT记录被修改的时间
|
FN_ReadTime
|
0x20
|
8
|
最后一次访问文件的时间
|
FN_AllocSz
|
0x28
|
8
|
文件数据占用的空间尺寸,该值按簇尺寸对齐
|
FN_ValidSz
|
0x30
|
8
|
文件的真实尺寸,索引项(目录项)中显示的文件尺寸就是该值。如果文件的数据属性中的开始簇号不为0则本项的值为空,此时需要查询文件尺寸的话必须访问SI属性
|
FN_DOSAttr
|
0x38
|
4
|
DOS文件属性,可以是以下各值的组合:
0x0001 只读
0x0002 隐藏
0x0004 系统
0x0020 归档
0x0040 设备
0x0080 常规
0x0100 临时文件
0x0200 稀疏文件
0x0400 重解析点
0x0800 压缩
0x1000 离线
0x2000 无内容索引
0x4000 加密
0x10000000 目录
0x20000000 索引视
|
FN_EA_Reparse
|
0x3c
|
4
|
扩展属性与链接
|
FN_NameSz
|
0x40
|
1
|
文件名的字符数
|
FN_NamSpace
|
0x41
|
1
|
命名空间,该值可为以下值中的任意一个
0:POSIX 可以使用除NULL和分隔符“/”之外的所有UNICODE字符,最大可以使用255个字符。注意:“:”是合法字符,但Windows不允许使用。
1:Win32 Win32是POSIX的一个子集,不区分大小写,可以使用除““”、“*”、“?”、“:”、“/”、“<”、“>”、“\”、“|”之外的任意UNICODE字符,但名字不能以“.”或空格结尾。
2:DOS DOS命名空间是Win32的子集,只支持ASCII码大于空格的8BIT大写字符并且不支持以下字符““”、“*”、“?”、“:”、“/”、“<”、“>”、“\”、“|”、“+”、“,”、“;”、“=”;同时名字必须按以下格式命名:1~8个字符,然后是“.”,然后再是1~3个字符。
3:Win32&DOS 这个命名空间意味着Win32和DOS文件名都存放在同一个文件名属性中。
|
FN_FileName
|
0x42
|
2*L
|
不需要以0作为结束字符
|
将POSIX或Win32文件名转换成DOS文件名要遵循以下步骤:
1. 去掉所有的UNICODE字符。
2. 去掉除最后一个以外的所有“.”,除非该符号在文件名的最前面。
3. 所有字符转换成大写。
4. 去掉所有禁止的字符。
5. 把“.”号前面的字符减少到6个,然后在后面加上“~1”。
6. 把“.”号后面的字符缩减为3个。
7. 如果文件名已经存在,则增加字符串“~1”的值。
本属性只用于Microsoft Windows NT。
OBJECT_ID (0x40 2K)
对象ID属性是从Microsoft Windows 2000开始引入的新属性。每个MFT记录都有一个唯一的GUID。同样地,一个记录也包含了出生卷ID,原始对象ID和域ID,它们都拥有GUID。
该属性没有最小尺寸限制,但最大尺寸不得超过256个字节。
名字
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头
|
OID_Head
|
-
|
-
|
属性头
|
OID_ObjID
|
0
|
16
|
文件的GUID
|
OID_BirthVolID
|
0x10
|
16
|
文件建立时所在卷的ID
|
OID_BirthID
|
0x20
|
16
|
文件的原始ID
|
OID_DomainID
|
0x30
|
16
|
对象所创建时所在域的ID
|
SECRUITY_DESCRIPTOR (0x50 )
偏移
|
尺寸
|
描述
|
|
0x00
|
1
|
Revision (a)
|
|
0x01
|
1
|
Padding
|
|
0x02
|
2
|
Control Flags (b)
|
|
0x04
|
4
|
Offset to User SID
|
|
0x08
|
4
|
Offset to Group SID
|
|
0x0C
|
4
|
Offset to SACL
|
|
0x10
|
4
|
Offset to DACL
|
|
VOLUME_NAME (0x60)
该属性记录卷的名字。该属性最小2个字节,最大256个字节,因此卷标最大允许有127个字符。卷名的UNICODE字符串紧随属性头存放,卷名的长度由记录头中的ATTR_DatSz来指定。
卷序列号存放在$Boot文件中。
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头(24 字节)
|
|
0x00
|
|
Unicode 命名字符串
|
VOLUME_INFORMATION (0x70 len = 0x0c )
该属性记录卷的基本信息,如版本号。
名字
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头(24 字节)
|
VI_Resvd
|
0
|
8
|
保留,始终为0
|
VI_MajVer
|
8
|
1
|
卷主版本号
|
VI_MinVer
|
9
|
1
|
卷次版本号
|
VI_Flags
|
0x0a
|
2
|
标志位,可以是以下各值组合
0x0001 脏位,当该值被设置时Windows将会在下次启动时运行chkdsk/F命令。
0x0002 日志文件改变尺寸
0x0004 卷挂接时升级
0x0008 由Windows NT 4挂接
0x0010 启动时删除USN
0x0020 修复过的ID
0x8000 被chkdsk修改过
|
|
0x0c
|
4
|
保留,始终为0
|
操作系统格式化的卷对应的NTFS卷版本
操作系统
|
NTFS版本
|
Microsoft Windows NT
|
1.2
|
Microsoft Windows 2000
|
3.0
|
Microsoft Windows XP
|
3.1
|
DATA (0x80)
该属性包含文件的数据,文件的尺寸就是记录中无名数据流的尺寸。该属性没有最大最小值限制。
名字
|
偏移
|
尺寸
|
描述
|
|
-
|
-
|
标准属性头
|
ATTR_DataRuns
|
0x40+2*N
|
|
数据或数据运行
|
对于驻留数据,数据紧接着记录头存放;对于非驻留数据,记录头后存放的是数据流的描述。
通常目录文件没有数据属性,文件的数据属性是没有名字的。文件必须有一个无名的数据属性。
注:NTFS有一个特性:允许在一个文件存放多个数据属性,这就使得用户可以轻松的实现HFS提供的那种将文件分为两部分(在HFS术语中被称为叉):一个资源块一个数据块。对于数据块可以使用缺省的无名数据属性,对于资源块可以使用一个命名数据属性,如:“resource”
INDEX_ROOT (0x90)
该属性作为B+树的根节点以实现目录功能(比如目录文件)。该属性总是驻留。
Standard Attribute Header
• Index Root
• Index Header
• Index Entry
• Index Entry
名字
|
偏移
|
尺寸
|
描述
|
所属结构
|
|
-
|
-
|
标准属性头
|
目录根节点
(16字节)
|
IR_AttrType
|
0
|
4
|
属性的类型
|
IR_ColRule
|
4
|
4
|
整理规则
|
IR_EntrySz
|
8
|
4
|
每个索引块 尺寸(4k)
|
IR_ClusPerRec
|
0x0c
|
1
|
每个索引块 占用的簇数
|
IR_Resvd
|
0x0d
|
3
|
保留
|
如果索引项(目录项)在INDEX_ROOT,后面跟索引块头+索引项(目录项)表
|
IH_EntryOff
|
0x0
|
4
|
第一个索引项(目录项)的偏移(相对索引块头)
|
IR索引块头
(16字节)
|
IH_TalSzOfEntries
|
0x4
|
4
|
所有索引项的总尺寸
|
IH_AllocSize
|
0x8
|
4
|
所有索引项的总分配尺寸
|
IH_Flags
|
0xc
|
1
|
标志位
0x00小目录(目录项存放IR中)
0x01大目录(需要外部索引块和位图)
|
IH_Resvd
|
0xd
|
3
|
保留
|
IE_FR
|
0x0
|
8
|
索引项(目录项)对应的文件的MFT记录索引。
注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号
|
索引项(目录项)(8字节对齐)
(不在IR属性,便在IA中)
|
IE_Size
|
0x8
|
2
|
整个当前索引项(目录项)的尺寸 (L)
|
IE_DataSize
|
0xa
|
2
|
索引项(目录项)数据尺寸 (M)
|
IE_Flags
|
0xc
|
1
|
标志。该值可能是以下值之一:
0x01 有SubNodeFR值
0x02 当前项是最后索引项(目录项,此时无IE_Stream)
在读取索引项数据时应该首先检查该成员的值以确定当前项的类型
|
IE_Stream
|
0x10
|
M
|
索引项(目录项)数据,结构与文件名属性的数据相同
|
IE_SubNodeFR
|
0x10+M
|
L-8
|
索引项(目录项)在目录文件的VCN 值(对IB_VCN的细分)
|
|