硬件白皮书001.docx
《硬件白皮书001.docx》由会员分享,可在线阅读,更多相关《硬件白皮书001.docx(51页珍藏版)》请在冰豆网上搜索。
硬件白皮书001
硬件白皮书
NTFS文件系统规范
关键字:
WindowsNTNTFS文件系统
NTFS作为MicrosoftWindowsNT®操作系统的标配文件系统克服了FAT/FAT32文件系统的大量缺点;同时又随着MicrosoftWindows2000®、MicrosoftWindowsXP操作系统的推广得到越来越广泛的应用。
矚慫润厲钐瘗睞枥庑赖賃軔。
和FAT/FAT32文件系统相比,NTFS文件系统主要有以下优点。
•支持大容量存储单元(最大支持
GB)
•内建数据压缩支持
•支持事务日志文件
•加强数据安全
基本数据类型
MFT文件记录
文件记录是$MFT文件的基本组成部分,卷中的所有文件都由至少一个文件记录来描述,对于使用多个文件记录的文件,其第一个文件记录叫基本文件记录,其余的叫做扩展文件记录。
趕輾雏纨颗锊讨跃满賺蚬騍。
文件记录由记录头,数个文件属性和结束标志(0xFFFFFFFF)组成。
文件记录头格式:
名字
偏移
尺寸
描述
FR_Sign
0
4
记录签名:
值为:
‘ELIF’
FR_USOff
4
2
更新序列号的偏移(M)(相对文件记录头)
FR_USNSz
6
2
更新序列号个数+1(N)
FR_LSN
8
8
日志文件序列号,该值在记录每次被修改时都会被改动
FR_SN
0x10
2
重复使用更新序列号(删除一次加1)
FR_LnkCnt
0x12
2
目录中记录本文件的引用计数,该值只用于基本文件记录
FR_USAOff
0x14
2
第一个属性数据的偏移
FR_Flags
0x16
2
标志,该成员可以是以下各值中之一
0x0001记录被使用
0x0002目录文件
FR_Size
0x18
4
当前记录的尺寸
FR_AllocSz
0x1c
4
当前记录分配的空间的尺寸
FR_BaseFR
0x20
8
当前文件记录的基本文件记录的索引,
如果当前文件记录是基本文件记录则该值为0,否则指向基本文件记录的记录索引。
注意:
该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号
FR_NxtAttrId
0x28
2
下一个属性的ID。
下一次将会被添加到文件记录的属性的ID,每次往文件记录中添加属性时该值都会增加,每次文件记录被重新使用时该值都会被清零,第一个值肯定是0
FR_Resvd
0x2a
2
保留(XP新增,3.1+)
FR_NumOfFR
0x2c
4
该MFT记录号(XP新增,3.1+)
FR_USN
M
2
序列号。
该值记录文件记录被修改的次数,每次修改时该值+1,(包括文件被删除操作)该值不能为0
FR_USA
M+2
(N-1)*2
序列值占用的空间的原值
更新序列号
更新序列号是Microsoft公司为了确保记录数据的可靠性而在NTFS卷中提出的一项技术,在NTFS卷中,所有的记录类型数据(FR、IR)占用的空间都是按扇区尺寸(512字节)对齐。
保护记录数据时,在每512字节的最末2个字节都会写入一个校验值以确保记录中的所有数据都被正确的写入磁盘中,而校验值所在位置的数据被拷贝到记录头之后被称作USA(UpdateSequenceArray)的数据块中,系统将记录数据从磁盘读入内存时将检查每个校验值是否与记录头的中序列号是否相同,如果相同则用USA中相应位置的数据恢复校验值位置的数据,反之则表明该记录被没有正确地修改。
夹覡闾辁駁档驀迁锬減汆藥。
在每次写记录数据时序列号都会加1,当序列号为0时则再加1。
校验码
第1个512字节扇区末原值
第2个512字节扇区末原值
。
。
。
。
最后一个512字节扇区末原值
扇区数据结构
虚拟簇号
非驻留数据中的每个簇都有一个特定的序号,这个序号就叫做虚拟簇号,虚拟簇号0指向数据流的第一个簇。
逻辑簇号
卷中的每一个簇都有一个特定的序号,这个序号就叫做逻辑簇号,逻辑簇号0指向卷中的第一个簇(引导扇区)。
数据流描述
存放在间隔的簇中的属性数据称为流。
每一个流都由起始簇号和尺寸来描述。
流的起始簇号是相对于前一个流的偏移,该值是一个有符号数。
流描述的格式如下:
视絀镘鸸鲚鐘脑钧欖粝佥爾。
名字
偏移
尺寸
说明
SD_Desc
0
1
流描述说明,高4位(M)描述流描述偏移的字节数,低4位(N)描述流描述尺寸的字节数
SD_Size
1
N
当前流的尺寸
SD_Off
N+1
M
当前流相对于上一个流的偏移,如果该值的最高位为1则表示该值是一个负数
一个流描述之后紧随着下一个流描述,如果下一个描述的SD_Desc为0则表示当前描述是最后一个。
一般情况下压缩文件和稀疏文件数据都以流的形式描述。
例1:
通常情况
流描述:
2120ED52248748222128C8DB0
流1:
SD_Desc=21–偏移占2个字节,尺寸占1个字节。
SD_Size=20(1字节)
SD_Off=5ED(2字节)
Offset=5ED
Length=20
流2:
SD_Desc=22–偏移占2个字节,尺寸占2个字节。
SD_Size=748(2字节)
SD_Off=2248(2字节)
Offset=2835(2248+5ED)
Length=748
流3:
SD_Desc=21–偏移占2个字节,尺寸占1个字节。
SD_Size=28(1字节)
SD_Off=DBC8(2字节)
Offset=3FD(2835+FFFFDBC8)
Length=28
流4:
SD_Desc=0。
描述结束标志
小计:
0x20个簇存放在簇号0x5ED开始处
0x748个簇存放在簇号0x2853开始处
0x28个簇存放在簇号0x3FD开始处
例2:
压缩流
流描述:
1108400108111008110C10010400
流1:
SD_Desc=11–偏移占1个字节,尺寸占1个字节。
SD_Size=8(1字节)
SD_Off=40(1字节)
Offset=40
Length=8
流2:
SD_Desc=01–偏移占0个字节,尺寸占1个字节。
SD_Size=8(1字节)
SD_Off=-
Offset=-
Length=8
流3:
SD_Desc=11–偏移占1个字节,尺寸占1个字节。
SD_Size=10(1字节)
SD_Off=8(1字节)
Offset=48(40+8)
Length=20
流4:
SD_Desc=11–偏移占个字节,尺寸占1个字节。
SD_Size=C(1字节)
SD_Off=10(1字节)
Offset=58(48+10)
Length=C
流5:
SD_Desc=01–偏移占0个字节,尺寸占1个字节。
SD_Size=4
SD_Off=-
Offset=-
Length=4
流6:
SD_Desc=0。
流描述结束标志。
小计:
0x08个簇存放在簇号0x40开始处
0x08个稀疏簇(未分配空间)
0x10个簇存放在簇号0x48开始处
0x0C个簇存放在簇号0x58开始处
0x04个稀疏簇(未分配空间)
文件属性记录
文件中的每个记录都是由属性组成。
每个属性由相同的格式构成,首先是一个标准属性记录头,然后存放属性的专用数据。
下面列出$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属性记录都有一个属性记录头,这个头记录了属性的类型、名字(可选)、有两种格式:
驻留属性
名字
偏移
尺寸
说明
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
属性数据,所以的数据都应该按双字对齐
(为各常驻属性实体部分)
>=24bytes
非驻留属性
名字
偏移
尺寸
说明
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
属性数据流描述(为各非常驻属性逻辑簇区域指向,具体实体在指向区域)
>=64bytes
注意
只有非驻留的数据(Data)属性才可以被压缩或是稀疏类型。
只有驻留属性才有索引标志,是否表示只有驻留属性才能被索引?
STANDARD_INFORMATION(0x10常驻属性len=0x30,0x48)
在老的NTFS版本中,STARDAND_INFORMATION属性只用于存放文件的时间和DOS文件属性信息。
在Windows2000中新引进了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则表示更新日志被禁止
ATTRIBUTE_LIST(0x20len>26)
当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字符为结束标志
注:
使用属性表属性通常因为以下情况:
文件有太多的别名。
碎片太多以至于数据流描述填满了MFT记录。
有太复杂的安全描述(在NTFS 3.0以后的版本中不会再出现这种情况)。
有太多的命令流,比如数据流。
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文件名要遵循以下步骤:
去掉所有的UNICODE字符。
去掉除最后一个以外的所有“.”,除非该符号在文件名的最前面。
所有字符转换成大写。
去掉所有禁止的字符。
把“.”号前面的字符减少到6个,然后在后面加上“~1”。
把“.”号后面的字符缩减为3个。
如果文件名已经存在,则增加字符串“~1”的值。
VOLUME_VERSION(0x40NT)
本属性只用于MicrosoftWindowsNT。
OBJECT_ID(0x402K)
对象ID属性是从MicrosoftWindows2000开始引入的新属性。
每个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
ControlFlags(b)
0x04
4
OffsettoUserSID
0x08
4
OffsettoGroupSID
0x0C
4
OffsettoSACL
0x10
4
OffsettoDACL
VOLUME_NAME(0x60)
该属性记录卷的名字。
该属性最小2个字节,最大256个字节,因此卷标最大允许有127个字符。
卷名的UNICODE字符串紧随属性头存放,卷名的长度由记录头中的ATTR_DatSz来指定。
邁茑赚陉宾呗擷鹪讼凑幟结。
卷序列号存放在$Boot文件中。
偏移
尺寸
描述
-
-
标准属性头(24字节)
0x00
Unicode命名字符串
VOLUME_INFORMATION(0x70len=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由WindowsNT4挂接
0x0010启动时删除USN
0x0020修复过的ID
0x8000被chkdsk修改过
0x0c
4
保留,始终为0
操作系统