NTFS文件系统规范(二)

  文件属性记录

文件中的每个记录都是由属性组成。每个属性由相同的格式构成,首先是一个标准属性记录头,然后存放属性的专用数据。下面列出$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的细分)

 
本站域名:www.mrtlab.com | QQ交流群:250649022 | 使用条款 | 备案:鄂ICP备2020023514号
MRT数据恢复网,专业的硬盘固件维修与数据恢复技术资料提供站!
Copyright 2003-2020 Powered By MrtLab