文档库 最新最全的文档下载
当前位置:文档库 › NTFS文件系统规范

NTFS文件系统规范

NTFS文件系统规范
NTFS文件系统规范

硬件白皮书

NTFS文件系统规范

关键字:Windows NT NTFS 文件系统

NTFS作为Microsoft Windows NT?操作系统的标配文件系统克服了FAT/FAT32文件系统的大量缺点;同时又随着Microsoft Windows 2000?、Microsoft Windows XP操作系统的推广得到越来越广泛的应用。

和FAT/FAT32文件系统相比,NTFS文件系统主要有以下优点。

2GB)

?支持大容量存储单元(最大支持46

?内建数据压缩支持

?支持事务日志文件

?加强数据安全

目录

目录 (1)

基本数据类型 (3)

MFT文件记录 (3)

更新序列号 (3)

虚拟簇号 (4)

逻辑簇号 (4)

数据流描述 (4)

文件属性记录 (6)

属性记录头 (6)

STANDARD_INFORMATION (0x10 常驻属性len=0x30,0x48) (8)

ATTRIBUTE_LIST (0x20 len > 26) (9)

FILE_NAME (0x30 常驻属性len = 68~578)) (10)

VOLUME_VERSION (0x40 NT) (11)

OBJECT_ID (0x40 2K) (11)

SECRUITY_DESCRIPTOR (0x50 ) (11)

VOLUME_NAME (0x60) (12)

VOLUME_INFORMA TION (0x70 len = 0x0c ) (12)

DA TA (0x80) (12)

INDEX_ROOT (0x90) (13)

索引块头(16 bytes) (13)

索引项(目录项) (14)

INDEX_ALLOCATION (0xA0大目录使用) (14)

IA索引块(INDEX_ALLOCATION指向的外部索引区) (14)

BITMAP (0xB0 MFT文件或外部索引块使用) (15)

SYMBOL_LINK (0xC0 NT) (15)

REPARSE_POINT (0xC0 2K) (15)

EA_INFORMATION (0xD0 ) (15)

EA (0xE0 ) (16)

PROPERTY_SET (0xF0 NT) (16)

LOGGED_UNTILITY_STREAM (0x100 2K) (16)

系统文件 (16)

$MFT (17)

未命名数据流格式 (18)

$MFTMirr (18)

未命名数据流格式 (18)

$LogFile (18)

$V olume (18)

未命名数据流格式 (19)

$AttrDef (19)

未命名数据流格式 (19)

整理规则 (19)

$AttrDef Flags (19)

. (Root Directory) (20)

$MountMgrDatabase 数据流 (20)

$Bitmap (20)

$Boot (20)

引导扇区与BPB (21)

$BadClus (22)

$Secure (22)

$SDS 数据流 (22)

$SDH Index (23)

$SII Index (23)

$UpCase (23)

未命名数据流格式 (24)

$Extend (24)

$ObjId (24)

$ObjId:$O (24)

$Quota (25)

$Quota:$O (25)

$Quota:$Q (25)

$Quota flags (26)

$Reparse (26)

$Reparse:$R (26)

$UsnJrnl (27)

$UsnJrnl:$J (27)

$UsnJrnl reason flags (27)

$UsnJrnl source info flags (29)

$UsnJrnl:$Max (29)

NTFS卷初始化 (29)

分区结尾与备份主引导扇区 (29)

目录结构 (30)

基本数据类型

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(Update Sequence Array)的数据块中,系统将记录数据从磁盘读入内存时将检查每个校验值是否与记录头的中序列号是否相同,如果相同则用USA中相应位置的数据恢复校验值位置的数据,反之则表明该记录被没有正确地修改。

在每次写记录数据时序列号都会加1,当序列号为0时则再加1。

校验码第1个512字节

扇区末原值第2个512字节

扇区末原值

。。。。最后一个512字

节扇区末原值

扇区数据结构

00H

10H

F0H

更新码检验

虚拟簇号

非驻留数据中的每个簇都有一个特定的序号,这个序号就叫做虚拟簇号,虚拟簇号0指向数据流的第一个簇。

逻辑簇号

卷中的每一个簇都有一个特定的序号,这个序号就叫做逻辑簇号,逻辑簇号0指向卷中的第一个簇(引导扇区)。

数据流描述

存放在间隔的簇中的属性数据称为流。每一个流都由起始簇号和尺寸来描述。流的起始簇号是相对于前一个流的偏移,该值是一个有符号数。流描述的格式如下:

名字偏移尺寸说明

SD_Desc 0 1 流描述说明,高4位(M)描述流描述偏移的字节数,低4

位(N)描述流描述尺寸的字节数

SD_Size 1 N 当前流的尺寸

SD_Off N+1 M 当前流相对于上一个流的偏移,如果该值的最高位为1则

表示该值是一个负数

一个流描述之后紧随着下一个流描述,如果下一个描述的SD_Desc为0则表示当前描述是最后一个。

一般情况下压缩文件和稀疏文件数据都以流的形式描述。

例1:通常情况

流描述:21 20 ED 5 22 48 7 48 22 21 28 C8 DB 0

流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:压缩流

流描述:11 08 40 01 08 11 10 08 11 0C 10 01 04 00 流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_INFORMA TION

0x80 DA TA

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_NonResFla g 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_INFORMA TION属性只用于存放文件的时间和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则表示更新日志被禁止

ATTRIBUTE_LIST (0x20 len > 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字符为结束

标志

注:使用属性表属性通常因为以下情况:

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:Win32Win32是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”的值。

VOLUME_VERSION (0x40 NT)

本属性只用于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,后面跟索引块头+索引项(目录项)表

索引块头(16 bytes)

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的细分)

IE_SubNodeFR 对簇尺寸!=4k的有用

INDEX_ALLOCATION (0xA0大目录使用)

该属性是索引数据(比如磁盘目录)的基本组成部分,用于存放B+树的子节点和实现索引数据。属性非驻留,则属性的数据流描述指向一个外部索引(索引项(目录项))区。

名字偏移尺寸描述

- - 标准属性头

ATTR_DataRuns 0x40+2*N 属性数据流描述(为各非常驻属性逻辑簇区域

指向,具体实体在指向区域)

IA索引块(INDEX_ALLOCATION指向的外部索引区)

索引项(目录项)记录由标准头和存储目录键及目录数据的数据块组成,在$Boot文件中定义了目录记录的尺寸,这个值通常是4KB(到目录为止没有使用其他值)。

名字偏移尺寸描述

IB_Sign 0 4 记录签名:值为:‘XDNI’

IB_USOff 4 2 更新序列号的偏移(M) 恒=0x28

IB_USNSz 6 2 更新序列号个数+1(N) 恒=0x09(4K/512+1)

IB_LSN 8 8 日志文件序列号,该值在记录每次被修改时都会被改动

IB_VCN0x10 8 当前索引块在目录文件中的虚拟簇号

后面跟IA索引块头

IR_EntryOff 0x18 4 第一个索引项(目录项)的偏移(相对IA索引块头)

IR_EntrySz 0x1c 4 索引块的总有效尺寸(从IR_Sign开始)

IR_AllocSz 0x20 4 为索引项(目录项)分配的空间的尺寸

IR_Flags 0x24 1 为1表示块内有带子节点的索引项

IR_Resvd 0x25 3 保留

IR_USN 0x28 2 更新序列号

IR_USA 0x1a 2* 8 更新序列值占用的空间的原值

后面紧跟索引项(目录项)

BITMAP (0xB0 MFT文件或外部索引块使用)

该属性记录了一组BIT序列,每个位描述一个单元的使用情况。

该属性主要用于两种情况:索引(比如目录)和$MFT文件中。

在用于索引时,每个位表示一个索引项是否被使用。每个位描述一个虚拟簇号(VCN)。

在用于$MFT文件时,每个位记录一个文件记录是否使用。

位序列表紧随属性头存放。同DA TA(0x80)

名字偏移尺寸描述

- - 标准属性头

ATTR_DataRuns 0x40+2*N 数据或数据运行

SYMBOL_LINK (0xC0 NT)

本属性只用于Microsoft Windows NT。

REPARSE_POINT (0xC0 2K)

该属性描述对象的解析信息,该属性最大尺寸是16384字节。

名字偏移尺寸描述

- - 标准属性头

RP_Type 0 4 重解析数据类型,该值可以是以下值之一

0x20000000 别名

0x40000000 最高等待时间

0x80000000 微软使用

0x68000005 NSS

0x68000006 NSS恢复

0x68000007 SIS

0x68000008 DFS

0x88000003 卷挂接点

0xA8000004 HSM

0xE8000000 硬连接

RP_DatSz 4 2 重解析数据尺寸

RP_Resvd 6 2 保留

RP_Data 8 L 重解析数据

EA_INFORMATION (0xD0 )

该属性用于实现为OS/2子系统或Windows NT服务器的OS/2客户提供基于NTFS的

HPFS扩展属性。因为数据流可能会增大,所以该属性可以是非驻留的。

名字偏移尺寸描述

- - 标准属性头

EI_PackedSz 0 2 压缩扩展属性尺寸

EI_NumOfEA 0 2 拥有NEED_EA记录的扩展属性个数

EI_UnpackedSz 4 4 未压缩扩展属性尺寸

EA (0xE0 )

该属性用于在NTFS卷上实现HPFS的扩展属性。因为数据流可能会增大,所以该属性可以是非驻留的。该属性的最大尺寸是65536字节。

该属性保存HPFS卷所需的名字-参数对。

名字偏移尺寸描述

- - 标准属性头

EA_Next 0 4 下一个扩展属性的偏移(本记录的尺寸)

EA_Flags 4 1 标志位,值取0x80表示需要EA

EA_NamLen 5 1 名字数据的长度(M)

EA_ValLen 6 2 值数据的长度

EA_Name 8 M 名字数据

EA_Value 8+M N 值数据

EA名字不使用UNICODE字符。关于该属性的特性,参考一下HPFS的规范会很有帮助。

PROPERTY_SET (0xF0 NT)

本属性只用于Microsoft Windows NT。

LOGGED_UNTILITY_STREAM (0x100 2K)

该属性记录日志操作的元数据。

Offset Size Description

- - 标准属性头

0x00 Any data

系统文件

不同于FAT/FAT32分区固定的数据块布局,NTFS卷中所有的数据都以文件的方式保存,包括引导记录与目录等卷重要数据(在NTFS卷中重要数据块被称为系统文件),这样就允许将卷重要数据存放到卷中的任何地方(除了引导记录),并且对于所有重要数据都有一个标准的方法对其进行操作。这个特性使得任意改变卷尺寸十分方便(在卷位图文件后加上或减去增减的扇区信息就行了),而且也可以很容易地避免了FAT/FAT32卷中FAT表部分有物理损坏则卷中就会有很大部分空间使用的问题。

对应于重要数据的种类,NTFS分区共有16个系统文件,他们分别是:

记录号名字OS 描述

0 $MFT Master File Tab 主文件表。该文件记录了卷中所有的文件

(包括$MFT自己)的描述信息,通过$MFT文件可以访问

卷中的所有信息。$MFT文件由多个文件记录(FRS)组成。

每个文件的描述信息占用一个或多个文件记录。对于每一个

文件,$MFT用一套被称为属性(Attributes)的记录来保存其

信息。$MFT中前12个文件信息分别记录了12个系统文件

的信息,从12-23号记录保留,从24号记录起记录其他文

件的信息。

1 $MFTMirr Mirror of $MFT $MFT文件中前4个文件($MFT、$MFTMirr、

$LogFile、$V olume)的描述的备份。本文件主要用于卷数据

损坏时恢复卷。

2 $LogFile 卷事务的日志信息文件。

3 $Volume 卷基本信息,包括卷名,序列号等信息。

4 $AttrDef 属性定义,该文件定义了本卷中可用的属性类型。

5 .(Root Directory) NTFS卷的根目录。

6 $Bitmap 记录卷中所有分配单元的使用情况。本文件中每一个Bit数

据对应一个簇。

7 $Boot 引导记录,通过本文件的代码系统才能从NTFS卷中启动。

本文件是NTFS卷中唯一一个位置固定的文件,必须置于卷

的第一个扇区处。

8 $BadClus 记录卷中坏簇的信息,本文件是稀疏文件,只包含坏簇的信

息。

9 $Qutoa NT

9 $Secure 2K 记录卷中用到的安全描述符信息。

10 $UpCase 本记录Unicode编码下的所有字符的大写的代码,用于比较

和排序文件名。

11 $Extend 2K 本文件是一个目录,扩展元数据目录,其中记录了卷中的对

象的GUID及配额等信息。$ObjId, $Quota, $Reparse, $UsnJrnl

12 $Extend\$Reparse2K 重解析点文件11~15 标记为使用

13 $Extend\$UsnJrnl2K 变更日志文件

14 $Extend\$Quota2K 配额管理文件

15 $Extend\$ObjId2K 对象ID文件

16~23 保留,标记为未使用

>24 A File 一般文件

>24 A Dir 一般目录

……

文件至少含有$STANDARD_INFORMATION , $FILE_NAME属性

$MFT

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $MFT

0x80 $DATA [Unnamed]

0xB0 $BITMAP [Unnamed]

未命名数据流格式

Inode Filename Description

0 $MFT Master File Table -An index of every file

1 $MFTMirr A backup copy of the first 4 records of the MFT

2 $LogFile Transactional logging file

3 $Volume Serial number, creation time, dirty flag

... ... ...

$MFTMirr

该文件是$MFT文件的备份,存放了$MFT中前4个文件的文件记录。该文件的作用就

是当$MFT文件被损坏时恢复卷中的数据。

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $MFTMirr

0x80 $DATA [Unnamed]

未命名数据流格式

Inode Filename Description

0 $MFT Master File Table -An index of every file

1 $MFTMirr A backup copy of the first 4 records of the MFT

2 $Logfile Transactional logging file

3 $Volume Serial number, creation time, dirty flag

4 ... If present, further FILE records from the MFT (see $MFT)

$LogFile

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $LogFile

0x80 $DATA [Unnamed]

$Volume

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $Volume 0x50 $SECURITY_DESCRIPTOR

0x60 $VOLUME_NAME

0x70 $VOLUME_INFORMATION

0x80 $DATA [Unnamed]

未命名数据流格式

0 字节长

$AttrDef

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $AttrDef 0x50 $SECURITY_DESCRIPTOR

0x80 $DATA [Unnamed]

未命名数据流格式

Offset Size Description

0x00 128 Label in Unicode

0x80 4 Type

0x84 4 Display rule

0x88 4 Collation rule

0x8C 4 Flags

0x90 8 Minimum size

0x98 8 Maximum size

整理规则

Flag Description

0x00 Binary

0x01 Filename

0x02 Unicode String

0x10 Unsigned Long

0x11 SID

0x12 Security Hash

0x13 Multiple Unsigned Longs

$AttrDef Flags

Flag Description

0x02 Indexed

0x40 Resident (always)

0x80 Non-Resident (allowed to be)

. (Root Directory)

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME .

0x50 $SECURITY_DESCRIPTOR

0x80 $DATA $MountMgrDatabase

0x90 $INDEX_ROOT $I30

0xA0 $INDEX_ALLOCATION $I30

0xB0 $BITMAP $I30

$MountMgrDatabase 数据流

仅当Reparse Points on the Volume.

Offset Size Description

0x00 4 Size of entry

0x04 4 Flags? (bitfield?)

0x08 2 Offset to UNC Path

0x0A 2 Size of UNC Path

0x0C 2 Offset to data

0x0E 2 Size of data

$Bitmap

该文件记录了卷中所有逻辑簇的使用情况。文件中每个BIT表示一个逻辑簇。在每个字节中,逻辑簇号按从小到大的顺序排列,如:BIT0对应逻辑簇号A,则BIT1对应逻辑簇号A+1。

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $Bitmap

0x80 $DATA [Unnamed]

$Boot

在MFT 文件的属性记录集

Type Description Name

0x10 $STANDARD_INFORMATION

0x30 $FILE_NAME $Boot

0x50 $SECURITY_DESCRIPTOR

相关文档