NTFS文件系统规范
文件记录是$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(Update Sequence Array)的数据块中,系统将记录数据从磁盘读入内存时将检查每个校验值是否与记录头的中序列号是否相同,如果相同则用USA中相应位置的数据恢复校验值位置的数据,反之则表明该记录被没有正确地修改。
在每次写记录数据时序列号都会加1,当序列号为0时则再加1。
|
|
|
|
|
校验码
|
第1个512字节扇区末原值
|
第2个512字节扇区末原值
|
。。。。
|
最后一个512字节扇区末原值
|
|