分享

NTFS文件系统+NTFS文件系统结构解析+NTFS文件系统规范

 sdxy 2019-10-31

NTFS文件系统简介

作者:zty,来源:mrtlab.com

第一章 前言

NTFS是随着Windows NT操作系统而产生的,全称为“NT File System”,中文意为NT文件系统,如今已是windows类操作系统中的主力分区格式了。它的优点是安全性和稳定性极其出色,在使用中不易产生文件碎片,NTFS分区对用户权限作出了非常严格的限制,每个用户都只能按着系统赋予的权限进行操作,任何试图越权的操作都将被系统禁止,同时它还提供了容错结构日志,可以将用户的操作全部记录下来,从而保护了系统的安全。

NTFS是一个具备错误预警的文件系统。由于NTFS对关键文件系统的系统信息采用了冗余存储,故而当磁盘上的某个扇区损坏时,NTFS仍可以访问卷上的关键数据。NTFS分区的最开始的16个扇区是分区引导扇区,用以保存分区引导代码,接下来是主文件表(MFT),如果MFT所在的磁盘扇区出现损坏,NTFS文件系统会将MFT转移到到硬盘的其他扇区,这样就保证了NTFS文件系统和Windows操作系统的正常运行。比之先前的FAT16和FAT32文件系统的FAT(文件分配表),FAT只能固定在分区引导扇区的后面,一旦该扇区,整个文件系统就会瘫痪,NTFS文件系统显然要先进的多了。不过这种移动MFT的做法却也并非十全十美,如果分区引导代码中指向MFT的部分出现错误,那么NTFS文件系统便会不知道到哪里寻找MFT ,从而会报告“磁盘没有格式化”这样的错误信息。为了避免这样的问题发生,分区引导代码中会包含一段校验程序,专门负责侦错。

第二章 NTFS概述

NTFS是Mircrosoft推出的一种新型文件系统。Mircrosoft推出NTFS文件系统的主要目的是将其作为WindowsNT/2000/XP和服务器版本的默认文件系统。NTFS的目标是获得可靠性.高效性和安全性。

2.1 NTFS的特点

它提供了容错结构日志,可以有效地保护系统的安全。NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事务处理日志和恢复技术来保证分区的一致性。

它的可升级性基于使用常规结构对特殊数据结构进行管理。在NTFS文件系统将所有的数据都视为文件,通常在其他文件系统中被隐藏的管理数据在NTFS中也被存储在文件中,文件系统管理数据可以像普通文件一样被存放在文件系统内任何位置。

NTFS支持对分区.文件夹和文件的压缩。

在NTFS分区上,可以为共享资源.文件夹以及文件设置访问许可权限,许可的设置包括两方面的内容:一是哪些组或用户对文件夹.文件和共享资源进行访问。二是获取访问许可的组或用户可以进行什么级别的访问。

在Windows 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额限制内的磁盘空间。

NTFS被作为Windows操作系统的标准文件系统,同时也被大多数免费发行的Unix版本的支持。

NTFS支持对大容量磁盘存储,可以支持的卷大小可以达到2TB。

NTFS于FAT文件系统一样,也使用“簇”作为数据寸取的最小单位。但因为它将所有的数据,包括文件系统管理数据也作为文件进行管理,所以NTFS文件系统中的所有扇区都被分配以簇号,并以0开始对所有的簇进行编号,文件系统的0号扇区为0号簇的起始位置。

2.2 NTFS的基本概念

MFT

MFT,即主文件分配表的简称,它是NTFS文件系统的核心。MFT由一个或几个MFT项(文件记录)组成,每个MFT项占用1024字节的空间。每个MFT项的前部几十个字节有着固定的头结构,用来描述本MFT项的相关信息。后面的字节用于存放“属性”。每个文件和目录的信息都包含在MFT中,每个文件和目录在表中至少有有一个MFT项。初引导扇区外,访问其他任何一个前都要先访问MFT,在MFT中找到该文件的MFT项,根据MFT项中的记录的信息找到内容并对其进行访问。

属性

在NTFS中,所有与数据相关的信息都称为“属性”,NTFS与其他文件系统最大的不同之处在于,大多数文件系统是对文件的内容进行读写,而NTFS则是对包含文件内容的属性进行读写。

在数据结构中,属性又可以分为常驻属性和非常驻属性

常驻属性。有的属性其属性内容很小,它的MFT项可以容纳下它的全部内容,为了节约空间,系统会直接将其存放在MFT项中,而不再为其另外分配簇空间,这样的属性称为常驻属性

非常驻属性。非常驻属性是指那些内容较大,无法完全存放在其MFT项中的属性。如文件的数据属性,通常内容很大,需要在MFT之外另为其分配足够的簇空间进行存储,这样的属性就是非常驻属性。

2.3 NTFS元文件

NTFS文件系统被创建时,会同时建立一些重要的系统信息。这些系统信息也全是以文件的形式存在,被称为元文件。元文件的文件名都以 $ 符号开头,表示其为隐藏的系统文件,用户不可直接访问。

NTFS下的元文件总共有17个,其具体含义如下:

$MFT:它其实是整个主文件表,也就是将整个MFT看做一个文件。

$MFTMirr:MFT前几个MFT项的备份,NTFS也将其作为一个文件看待。

$LogFile:日志文件。

$Volume:卷文件,包含卷标和其他版本信息。

$AttDef:属性定义列表,定义每种属性的名字和类型。

$Root:根目录文件。

$Bitmap:位图文件,它的数据属性的每个bit对应文件系统中的一个簇,用以描述簇的分配情况。

$Boot:引导文件,DBR扇区就是引导文件的第一个扇区。

$BadClus:坏簇记录文件。

$Quota:早期的NT系统中记录磁盘配额信息。

$Secure:安全文件。

$UpCase:大小写字符转换表文件。

$Extend metadata directory:扩展元数据目录。

$Extend\$Reparse:重解析点文件。

$Extend\$UsnJrnl:变更日志文件。

$Extend\$Quota:配额管理文件。

$Extend\$ObjId:对象ID文件。

第三章 NTFS文件系统的布局

一个NTFS文件系统大致上可以分为引导区、MFT、MFT备份区、数据区和DBR备份扇区几个部分。因为NTFS将所有的数据都视为文件,理论上除引导扇区必须位于第一个扇区外,NTFS卷可以在任意位置存放任意文件,但通常情况下会遵循一定的习惯布局。在XP系统下NTFS卷大致布局如下图:

DBR引导区

用户数据

MFT区

用户数据

MFT部分记录备份

用户数据

DBR备份

NTFS的特点

1)引导扇区。引导区部分包括DBR和引导代码,一般系统为其分配16个扇区,未完全使用。

2)MFT区。文件系统中出现一个“MFT”区,这个“MFT区”是一个连续的簇空间,除非其他空间已全部被分配使用,否则不会在此空间中存储用户文件或目录。在WINXP下创建的NTFS,其MFT通常距离引导扇区较远,但在WIN2000下创建的NTFS,其MFT通常起始于4号簇位置。

3)MFT备份区。由于MFT备份的重要性,在文件系统的中部为其保存了一个备份,不过这个备份很小,只是MFT前几个项的备份。

4)引导扇区备份扇区。在卷的最后一个扇区,保存了一份DBR扇区的备份。这个扇区包含在分区表描述的该分区大小中,但却不在DBR描述的文件系统大小范围之内。DBR描述文件系统大小时,总是比分区表描述的扇区数小1个扇区。

第四章 DBR(引导扇区)

NTFS的引导扇区也位于文件系统的0号扇区,这是它与FAT文件系统在布局 上的唯一相同之处。数据结构如下图,此图为一个硬盘的DBR:

NTFS文件系统简介

4.1 DBR的作用

DBR(DOS BOOT RECORD,DOS引导记录),位于柱面0,磁头1,扇区1,即逻辑扇区0。DBR分为两部分:DOS引导程序和BPB(BIOS参数块)。其中DOS引导程序完成DOS系统文件(IO.SYS,MSDOS.SYS)的定位与装载,而BPB用来描述本DOS分区的磁盘信息,BPB位于DBR偏移0BH处,共13字节。 它包含逻辑格式化时使用的参数,可供DOS计算磁盘上的文件分配表,目录区和数据区的起始地址,BPB之后三个字提供物理格式化(低格)时采用的一些参数。引导程序或设备驱动程序根据这些信息将磁盘逻辑地址(DOS扇区号)转换成物理地址(绝对扇区号)。

4.2 DBR的数据结构

以上引导扇区最为关键的字节数是0B-0C(每扇区字节数) 0B-0C(每扇区字节数) 0D(每簇扇区数)28-2F(文件系统扇区总和) 30-37(MFT起始簇号)38-3F(MFT备份的起始簇号)40(每MFT项大小)44(每个索引的簇数),但数据发生不可预料的损坏时,可以根据以上信息重建分区表,定位数据区,恢复MFT,重建DBR,这些关键字节码的用处不言而喻。

第五章 主文件表MFT

格式化成NTFS文件系统时,就是在其中建立了一个主文件表MFT,其中包含16个元文件的文件记录。 为了尽可能减少$MFT文件产生碎片的可能性,系统预先为其预先为其预留整个文件系统大约12.5%的空间。只有在用户数据区的空间用尽时,才会临时让出MFT区的部分空间存储数据,但一旦数据区有了足够的空间,就会立即收回原来让出的MFT空间。主文件表MFT由一个个的MFT项组成,每个MFT项实际就是一个文件记录,其中用各种属性记录着该文件或目录的各种信息。每个MFT项实际的大小在引导扇区中进行说明,Microsoft的所有版本都使用1024字节的大小。前部为一个包含几十个字节的具有固定的大小和结构的MFT头,剩余的字节为属性列表,用于存放各种属性。

5.1 MFT的基本特点:

MFT的第一个区域是签名,所有的MFT项都有相同的签名(FILE)。如果在项中发现错误,可能将其改写成“BAAD”的字样。

MFT项还有一个标志域用以说明该项是一个文件项还是目录项,以及它的分配状态。MFT的分配状态也在一个$BITMAP属性文件中进行描述。

每个MFT项占用两个扇区,每个扇区的结束两个字节都有一个修正值,这个修正值与MFT项的更新序列号相同,如果发现不同,会认为该MFT项存在错误。

如果一个文件的属性较多,使用一个MFT项无法容纳下全部的属性,可以使用多个MFT项,第一个项被称为基本文件记录或基本MFT项。

5.2 MFT的数据结构:

重要字节码解释如下:

1)00-03:MFT项签名值“46494C45”,明文为“FILE”。

2)04-05:更新序列号编号的偏移。

3)06-07:更新序列号的数组个数,通常为3。

4)08-0F:日志序列号。

NTFS数据恢复实例

数据丢失的具体故障为:盘分了三个区在一次意外死机后磁盘提示(前两个区是正常的)提示未格式化(其实大多数朋友知道这时的问题简单得多也许重建DBR后整个盘里面的数据都在,这里暂且就不谈这种问题的解决方法了),要命的是这时已经鬼使神差地点击了格式化了,结果大家当然就知道了,数据肯定是没有了。据转到我这里的那同行说他用各种搜索软件对整个区搜了好几遍(这也是大多数所谓专业的数据恢复商所用的恢复方法了),当然也搜到了很多数据,尽管很乱但还能正常打开。最后客户确认搜出来数据大部份正常,但最重要的的一个压缩文件损坏了,大家知道压缩文件损坏了是很难很难修复的了。首先我用WINHEX把他搜出来的那个压缩文件打开分析了下,文件头乱了,中间的数据也不正常。无法修复,只好从原盘着手了。竟然搜索软件搜出来的是损坏的,那就只有用手工来做了,当然用手工做这种格式化了的数据很费时,且计算量也很大,只能针对像这样的个别特重要的数据。

对原盘的那个格式化掉的分区做完镜像后,用WINHEX打开镜像,设置镜像文件为磁盘。如下图所示:

NTFS数据恢复实例

分区是NTFS格式的,整个分区大小为25.4G。对NTFS分区格式研究过的朋友会知道,在NTFS文件系统中,文件亦是按簇进行分配的,文件通过主文件表MFT(Master File Table)来确定其在磁盘上的存储位置、大小、属性等信息。相当于FAT系统下的FAT+FDT的功能。每文件都有一个文件记录。其中第一个记录就是MFT自己本身。我们转到第一个文件记录也就是MFT了直接点可以看到如下图所示:

NTFS数据恢复实例

通过第一个文件记录往下观察发现格式化了后对文件记录没有产生破坏。那么这时我们就可以有一个恢复的思路了:找到所说的那个压缩文件的在MFT中的记录,再通过对文件记录的分析来确定文件在磁盘中的位置及大小,就可以直接从中提出文件了。想到做到,只知道一个压缩文件的压缩文件名为:源文件与素材。那好,我们可以新建一个文本记事本只输入压缩文件名―――源文件与素材!保存,再用WINHEX打开可以看到如下图:

NTFS数据恢复实例

然后再转回来,直接从第一个文件记录往下开始搜索十六进制数值90 6E 87 65 F6 4E 0E 4E 20 7D 50 67搜索到了一个地方停下来了,看看是不是那个压缩文件的记录呢看下图:

NTFS数据恢复实例

根据观察可以看出正是客户要的那个压缩文件的记录,那么我们又如何来确定这个压缩文件在磁盘上的那一个扇区?占用了多少的扇区呢?这个就需要对NTFS格式有所了解了。NTFS将文件作为属性、属性值集合来处理,这一点其他文件系统不一样。可以看到在MFT中用了不同颜色的段来区分,

NTFS数据恢复实例

如上图所标记的,第一个为文件记录头,第二个10H表示标准属性,第三个30H表示文件名属性,最后一个80H表示数据流属性也就是关键所在了。这里我们只分析数据流属性,其它属性就不一一分析了,可以查看相关资料。每一个属性都为两部份:属性头和内容。先来分析数据流属性的属性头:从第1第4四个字节表示属性的类型,第5第8四个字节这里的值是48 00 00 00表示属性的长度(包括属性头和内容)为72个字节。从17到24共8个字节表示起始的VCN即虚拟簇号,第25到32共8个字节表示结束的VCN此处为2D7FH也就是 这个压缩文件占用了11648个簇。再往下分析从33到40共8个字节表示数据运行的偏移。此处为40H也就是从第64个字节开始了。我们就直接来分析数据运行也只有这一个运行32 80 2D D5 58 17所以起始的LCN即逻辑簇号为1758D5H=1530069,长度为2D80H=11648。接下来我们转到1530069簇看,第一个字节右键选块开始,上面算出来这个文件的,如下图:

NTFS数据恢复实例

大小为11648个簇,也就是1530069+11648=1541717再转到1541717簇,所在的扇区的上一扇区也就是文件的结尾了。最后一个字节右键选块结尾。再在所选块中右键编辑-复制扇区-到新文件即指点到路径保存。然后改扩展名为RAR。

至此恢复完成。经检查没有一个损坏的。

手工定位NTFS文件系统下的文件

相信很多朋友在认真看完数据恢复书籍中,关于NTFS文件系统中讲述的一系列属性以后,或多或少还是有些范迷糊。确实,NTFS文件系统结构比较复杂,且书中也没有讲到如何利用这些属性来定位文件,这对于初学者来说,无疑是一个缺憾.

现在就以一个叫“MFT结构分析”的图片文件来进行手工定位,其存储路径为E:\教程\数据恢复。

接下来我们一层一层的去定位文件.以对所学的属性做一个融会贯通.或许有的朋友会说:在实际操作中,可以通过在MFT中搜索文件名的方式来做出定位,这样也是可以的。我制作本分析过程的初衷也就是给初学者对NTFS的理解提供一个思路。

学过FAT文件系统的,一定知道如何定位分区以及DBR,那好,我们就直接从DBR开始

从DBR中得出,每簇扇区数为08H,($MFT一下简称MFT).MFT的起始簇为:00000C00H,转换为十六进制分别为8扇区和786432簇。现在跳转到786432簇,如下图:

我们可以看到,这是MFT的第一个记录,记录的是它自己。,接下来我们跳转到MFT的关于根目录的记录,也就是第5号记录。根目录一般存储的文件以及文件夹比较多。所以,它是非常驻的,关于这些文件夹的信息记录在了其它的位置。而记录在什么位置是由索引分配属性来记录的,也就是A0属性,接下来着重看一下A0属性,如图:

上图红色的标注的位置是运行(Data run)31H表示用三个字节描述的是索引的位置的起始LCN(3E9002H),一个字节描述的是长度(02H)。下一个运行的位置描述的是00H表示到此结束,只有一个运行。(提示:如果下一个运行由内容,那么它描述的LCN加上前一个运行描述的LCN才是其真正的LCN,如果由三个运行,用第三个运行的LCN加上前两个的LCN就是第三个运行的真正的LCN,以此类推!)

我们将其转换为10进制数值得到这样一个信息,索引项的起始位置为167998簇,乘以每簇扇区数8,等于1343984扇区,长度为2个簇,跳转到1343984扇区,如图:

这个位置是根目录的索引项,可以看到里面索引的文件名为元数据。“教程”这个文件夹也存放在根目录里面,我们搜索该文件名,以找到相对应的索引项,由于NTFS里面文件名是用Unincode字符来表示的,所以该文件名转换为16进制数值为59650B7A8765H,我们在根目录索引项里搜索此文件名:

在1343994扇区找到了“教程”的索引项,(1343994-1343984=10,每簇扇区数为8,说明次索引项存放在第二簇里面)从上图可以看出,其文件记录存放在第6B3500H号扇区,转换为十六进制为13675号记录,一个MFT占用2个扇区,其文件记录的开始为,从MFT第一号记录向下数27350个扇区,就其文件记录存放的位置,计算方式为:6291456 +(13675*2)=6318806,跳转到6318806扇区,如图:

图中描述的本MFT号正是我们要找的,看下面的运行31011BEB01H,转换为16进制数值为:125723,再乘以每簇扇区数8等于1005784扇区,现在跳转到1005784扇区搜索“数据恢复”这个文件夹的十六进制数值70656E6362600D59H,结果没找到,难道是此文件夹没有记录?不可能。猜想,会不会是被驻留了。存放在MFT里面,跳回6318806扇区,搜索70656E6362600D59 ,在该MFT的第二个扇区里面找到了该文件夹的记录。

跳转到文件的“数据恢复”文件MFT记录号:23A100000000H,十进制为41251号,乘以2加上6291456,等于6373958。如图:

对NTFS多少有点了解的人都会发现,这并不是MFT。为什么?看一下我的MFT的分布情况,如图:

我的MFT是分三大块来存放的,(我自己的命名)接下来计算一下:

第一块:MFT从786432簇开始,到796687结束用了10255个簇=82040扇区,每2个扇区为一个完整的MFT。

第二块:MFT从397607开始到结束397686,用了79个簇632

第三块:……

第一块MFT只用了10255个簇来记录,(我用簇为来但来计算)而我们要找的文件“数据恢复”存放在41251号,(41251*2/8= 10312.75簇)已经超出了第一块的记录范围,超出75.75个簇,经计算,在第二块里面才是存放的“数据恢复”的MFT。第二块的开始位置为397607簇,加上75簇,等于397664簇,由于硬盘是从0开始记录数据的,所以,这个地方应该还要减去1。跳转到397663簇的四分之三(0.75)位置,也就是第6个扇区

根据运行,得知其起始LCN为A08AH(35488*8=283904),占用一个簇。跳转到283904扇区:搜索文件名“MFT”结构分析4D0046005400D37E7E00H

其文件MFT号为26A1H(41254号记录),根据前面的MFT记录块的计算,在“数据恢复”MFT记录向下数三个记录,就是“MFT结构分析”这个文件的MFT记录了。跳转到该位置

其运行为3281000F8F00H,起始LCN为0F8F00(36623*8=292984扇区),长度为8100H(129*8=1032扇区),那么结束位置为292984+1032=294016扇区

跳转到文件的开始292984

跳转到294016,选取上一个扇区的结尾

编辑-复制-植入新文件-保存文件名为“MFT结构分析.jpg”。双击,能够正常打开。

NTFS文件系统结构解析

NTFS是一个比FAT复杂的多的文件系统,我们一起努力来把它完整的解读出来。

NTFS 的引导扇区也是完成引导和定义分区参数,和FAT分区不同,FAT分区的BOOT记录正常,就显示分区没有错误,即使文件不正确,而NTFS分区的 BOOT不是分区的充分条件,它要求必须MFT中的系统记录如$MFT等正常该分区才能正常访问。其BPB参数如下表所示。

字节偏移 长度 常用值 意义

0x0B 字 0x0002 每扇区字节数

0x0D 字节 0x08 每簇扇区数

0x0E 字 0x0000 保留扇区

0x10 3字节 0x000000 总为0

0x13 字 0x0000 NTFS未使用,为0

0x15 字节 0xF8 介质描述

0x16 字 0x0000 总为0

0x18 字 0x3F00 每磁盘扇区数

0x1A 字 0xFF00 磁头数

0x1C 双字 0x3F000000 隐含扇区

0x20 双字 0x00000000 NTFS未使用,为0

0x28 8字节 0x4AF57F0000000000 扇区总数

0x30 8字节 0x0400000000000000 $MFT的逻辑簇号

0x38 8字节 0x54FF070000000000 $MFTMirr的逻辑簇号

0x40 双字 0xF6000000 每MFT记录簇数

0x44 双字 0x01000000 每索引簇数

0x48 8字节 0x14A51B74C91B741C 卷标

0x50 双字 0x00000000 检验和

MFT中的文件记录大小一般是固定的,不管簇的大小是多少,均为1KB。文件记录在MFT文件记录数组中物理上是连续的,且从 0开始编号,所以,NTFS是预定义文件系统。MFT仅供系统本身组织、架构文件系统使用,这在NTFS中称为元数据(metadata,是存储在卷上支 持文件系统格式管理的数据。它不能被应用程序访问,只能为系统提供服务)。其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。这些元数据文 件的名字都以“$”开始,所以是隐藏文件,在Windows 2000/XP中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出。在WINHEX中带有NFI.EXE,用此工具可以显示这些记录与文件的 对应关系,下一次再详细解释。

这些元数据文件是系统驱动程序管理卷所必需的,Windows 2000/XP给每个分区赋予一个盘符并不表示该分区包含有Windows 2000/XP可以识别的文件系统格式。如果主文件表损坏,那么该分区在Windows 2000/XP下是无法读取的。为了使该分区能够在Windows 2000/XP下能被识别,就必须首先建立Windows 2000/XP可以识别的文件系统格式即主文件表,这个过程可通过高级格式化该分区来完成。Windows以簇号来定位文件在磁盘上的存储位置,在FAT 格式的文件系统中,有关簇号的指针包含在FAT表中,在NTFS中,有关簇号的指针则包含在$MFT及$MFTMirr文件中。

NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来对簇进行定位。LCN是对整个卷中所有的簇从头到尾所进行的简单编号。用卷因子乘以LCN,NTFS就能够得到卷上的物理字节偏 移量,从而得到物理磁盘地址。VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。VCN可以映射成LCN,而不必要求在物理上连 续。

在NTFS卷上,跟随在BPB后的数据字段形成一个扩展BPB。这些字段中的数据使得 Ntldr能够在启动过程中找到主文件表MFT(Master File Tabl )。在NTFS卷上,MFT并不象在FAT 16卷和FAT 32卷上一样,被放在一个预定义的扇区中。由于这个原因,如果在MTF的正常位置中有坏扇区的话,就可以把MFT移到别的位置。但是,如果该数据被破坏, 就找不到MFT的位置,Windows 2000假设该卷没有被格式化。

因此,如果一个ntfs的卷提示未格式化,可能并未破坏MFT,依据BPB的各字段的意思是可以重建BPB的。

NTFS的缺省簇的大小

卷大小       每簇的扇区  缺省的簇大小

小于等于512MB    1      512字节

513MB~1024MB(1GB)  2      1024字节(1KB)

1025MB~2048MB(2GB)  4      2048字节(2KB)

大于等于2049MB    8      4KB

从上面可以看出,也就是说不管驱动器多大 NTFS 簇的大小不会超过 4KB

NTFS文档:文档属性定义

每个文档属性都由以下部分组成:

一个由该属性的实际值组成的被称为“流”的重要的字节序列,元数据可访问该流。

文件中的每个文件属性都可能会有一个名字:在这种情况下,在命令行方式下可以通过语法“文件名:属性名”来访问该流(这也是文 件名中不能使用“:”的原因)。Windows NT® 使用以下在元数据文件$AttrDef中预定义的文件属性列表(一般会有一个未命名流,为缺省流,未命名流只能有一个,而命名流可以有多个,NTFS支持 多流文件):

10 $STANDARD_INFORMATION (标准信息)

20 $ATTRIBUTE_LIST (属性列表)

30 $FILE_NAME (文件名)

40 $VOLUME_VERSION (卷版本)

50 $SECURITY_DEscriptOR (安全描述符)

60 $VOLUME_NAME (卷名)

70 $VOLUME_INFORMATION (卷信息)

80 $DATA (数据)

90 $INDEX_ROOT (索引根)

A0 $INDEX_ALLOCATION (索引分配)

B0 $BITMAP (位图)

C0 $SYMBOLIC_LINK(符号链接)

D0 $EA_INFORMATION (?信息)

E0 $EA

属性流结构

每个文件属性都分为两部分:尽管这两部分属性在文件记录的属性列表中以倒序方式进行记录,但是为了更好的理解它,让我们按下面的顺序进行介绍: 

内容部分:

它的结构总是以属性名开始(N字节长),在属性名之后定义该属性是否为常驻属性。当文件属性的数据流就存储在其属性名后时,它 就是常驻属性,这样,对于那些流较小且不会增长的文件属性就可以提供更佳的访问次数。如果一个文件属性是非常驻的,那么其流就存储在一个或多个扩展或称为 运行中。运行是一个在逻辑簇号上连续的区域。为访问这些运行,NTFS紧跟在文件属性名后存储有一个称为运行列表的表。

头部:

从头部开始的偏移长度描述:

0 4 Type (类型)

4 4 Length (长度)

8 1 Non-resident flag (非常驻标志)

9 1 N=Name length (文件名长度)

A 2 Offset to the content part (相对内容部分的偏移值)

C 2 Compressed flag (压缩标志)

E 2 Identificator (标识)

文件名长度:

00 表示文件属性没有命名。 

压缩标志:在NTFS中,数据压缩是在文件属性级别上实现的,这就意味着,如果出现意外,你也不会释放出很多的数据。这样,尽管只是对文件进行压缩,但压缩文件同时就意味着其属性数据也一样被压缩。从现在开始, 其头部的安排依赖文件的常驻属性:

对一个常驻属性来说,从头部开始的偏移描述如下:

10 4 Length of the stream (流长度)

14 2 Offset to the stream (流偏移)

16 2 Indexed flag (索引标志)

索引标志:

文件属性通过一个索引入口进行索引。

对于一个非常驻的文件属性,从头部开始的偏移描述如下:

10 8 Starting VCN (起始VCN)

18 8 Last VCN (结束VCN)

20 2 Offset to the runlist (运行列表偏移)

22 2? Number of compression engine ? (压缩引擎号)

28 8 Allocated size of the stream (为流分配的单元大小)

30 8 Real size of the stream (实际的流大小)

38 8 Initialized data size of the stream (流已初始化大小)

VCN :Virtual Cluster Number(虚拟簇号)的缩略词。VCN是一个与非常驻属性相关联的概念。VCN从文件属性流的第一个运行的第一个簇(VCN 0)到最后一个运行的最后一个簇进行编号。 当某个运行列表非常大,文件属性不能放在一个文件记录中时,描述文件的文件属性就会存储在几个文件记录中,运行列表也分成几个小片。起始VCN域和结束 VCN域都用于定位其文件记录指示—即运行列表—运行所指定的VCN 。

注:如果属性可以放在一个文件记录内,则结束VCN域(这种情况下没有使用)可能是“00 00 00 00 00 00 00 00”。

压缩引擎的数量:

为达到最好的压缩比率,NTFS可以根据不同类型的数据使用不同的压缩引擎。当前的压缩引擎使用值04。

为流分配的单元大小:它几倍于卷上用来存储文件属性流所描述的分配空间。

如果流没有压缩,它就是数倍于簇空间大小的实际大小,相反,则比较小。

流的实际大小:文件属性流在压缩前的大小。

流的初始化大小:这是文件属性流的压缩后的大小(总是低于分配大小)。如果此流未被压缩,就是它的实际大小 。

注意:常驻文件属性从不被压缩(也没有压缩引擎号域),因为它的流太小。

信息是足够的:名字长+内容部分的偏移值 =到流的偏移值(常驻属性)或者到运行列表的偏移值(非常驻悔改)。

NTFS文件系统结构分析

在NTFS文件系统中,文件存取是按簇进行分配,一个簇必需是物理扇区的整数倍,而且总是2的整数次方。NTFS文件系统并不 去关心什么是扇区,也不会去关心扇区到底有多大(如是不是512字节),而簇大小在使用格式化程序时则会由格式化程序根据卷大小自动的进行分配。

文件通过主文件表(MFT)来确定其在磁盘上的存储位置。主文件表是一个对应的数据库,由一系列的文件记录组成--卷中每一个文件都有一个文件记录(对于大型文件还可能有多个记录与之相对应)。主文件表本身也有它自己的文件记录。

NTFS卷上的每个文件都有一个64位(bit)称为文件引用号(File Reference Number,也称文件索引号)的唯一标识。文件引用号由两部分组成:一是文件号,二是文件顺序号。文件号为48位,对应于该文件在MFT中的位置。文件 顺序号随着每次文件记录的重用而增加,这是为NTFS进行内部一致性检查而设计的。

NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来进行簇的定位。LCN是对整个卷中所有的簇从头到尾所进行的简单编号。卷因子乘以LCN,NTFS就能够得到卷上的物理字节偏移 量,从而得到物理磁盘地址。VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。VCN可以映射成LCN,而不必要求在物理上连续。

NTFS的目录只是一个简单的文件名和文件引用号的索引,如果目录的属性列表小于一个记录的长度,那么该目录的所有信息都存储在主文件表的记录中,对于大于记录的目录则使用B+树进行管理。

主文件表中的基本文件记录中有一个指针指向一个存储非常驻索引缓冲--包括该目录下所有下一级子目录和文件的外部簇,而B+树结构便于大型目录中文件和子目录的快速查找。

在NTFS中,所有存储在卷上的数据都包含在文件中,包括用来定位和获取文件的数据结构,引导程序和记录这个卷的记录(NTFS元数据)的位图,这体现了 NTFS的原则:磁盘上的任何事物都为文件。在文件中存储一切使得文件系统很容易定位和维护数据,而在NTFS中,卷中所有存放的数据均在一个叫做MFT 的文件记录数组中,称为主文件表(Master File Table),MFT是由高级格式化产生的。而MFT则由文件记录(File Record)数组构成。File Record的大小一般是固定的,不管簇的大小是多少,均为1KB,这个概念相当于Linux中的inode(i节点)。File Record在MFT文件记录数组中物理上是连续的,且从0开始编号。MFT仅供系统本身组织、架构文件系统使用,这在NTFS中称为元数据 (metadata)。其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。这些NTFS主文件表的重要的元数据文件都是以$(美元符号)开 始的名字,所以是隐藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据文件。实际上File System Driver(ntfs.sys)维护了一个系统变量NTFS Protect System Files用于隐藏这些元数据。但是微软公司也提供了一个OEM TOOL,叫做NFI.EXE,用此工具可以转储NTFS主文件表的重要的元数据文件(元数据:是存储在卷上支持文件系统格式管理的数据。它不能被应用程 序来访问,它只能为系统提供服务),使用NFI显示结果如下:

C:/>nfi C: |MORE

而这些元数据文件文件是系统驱动程序装配卷所必需的,WINDOWS 2000给每个分区赋予一个盘符并不表示该分区包含有WINDOWS 2000可以识别的文件系统格式,如果一旦主文件表损坏,那么该分区在WINDOWS 2000下是无法读取的。为了使该分区能够在WINDOWS 2000下能被识别,也就是必须首先建立WINDOWS 2000可以识别的文件系统格式即主文件表,这可通过高级格式化该分区来完成。众所周知,Windows以簇号来定位文件在磁盘存储的位置,在FAT格式 的文件系统中有关簇号的指针是包含在FAT表中的,而在NTFS中有关簇号的指针是包含在$MFT及$MFTMirr文件中的。

NTFS元文件

伴随着以上这些新增功能的是更多的用于存放与功能相关的数据的元文件。最后,在下面的表中罗列出NTFS5中所有的元文件:

每个MFT记录都对应着不同的文件,如果一个文件有很多属性或是分散成很多碎片,就很可能需要多个文件记录。这时,存放其文件记录位置的第一个记录就叫做“基文件记录”(base file record)。

MFT中的第1个记录就是MFT自身。由于MFT文件本身的重要性,为了确保文件系统结构的可靠性,系统专门为它准备了一个镜像文件($MftMirr),也就是MFT中的第2个记录。

第3个记录是日志文件($LogFile)。该文件是NTFS为实现可恢复性和安全性而设计 的。当系统运行时,NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,例如复制,从而在系统失败时能够恢 复NTFS卷。

第4个记录是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一个标明该磁盘是否损坏的标志位(NTFS系统以此决定是否需要调用Chkdsk程序来进行修复)。

第5个记录是属性定义表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。

第6个记录是根目录(/),其中保存了存放于该卷根目录下所有文件和目录的索引。在访问了一个文件后,NTFS就保留该文件的MFT引用,第二次就能够直接进行对该文件的访问。

第7个记录是位图文件($Bitmap)。NTFS卷的分配状态都存放在位图文件中,其中每 一位(bit)代表卷中的一簇,标识该簇是空闲的还是已被分配了的,由于该文件可以很容易的被扩大,所以NTFS的卷可以很方便的动态的扩大,而FAT格 式的文件系统由于涉及到FAT表的变化,所以不能随意的对分区大小进行调整。

第8个记录是引导文件($Boot),它是另一个重要的系统文件,存放着Windows 2000/XP的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统。该文件是在Format程序运行时创建的,这正体现了NTFS把磁盘 上的所有事物都看成是文件的原则。这也意味着虽然该文件享受NTFS系统的各种安全保护,但还是可以通过普通的文件I/O操作来修改。

第9个记录是坏簇文件($BadClus),它记录了磁盘上该卷中所有的损坏的簇号,防止系统对其进行分配使用。

第10个记录是安全文件($Secure),它存储了整个卷的安全描述符数据库。NTFS文件和目录都有各自的安全描述符,为了节省空间,NTFS将具有相同描述符的文件和目录存放在一个公共文件中。

第11个记录为大写文件($UpCase,upper case file),该文件包含一个大小写字符转换表。

第12个记录是扩展元数据目录($Extended metadata directory)。

第13个记录是重解析点文件($Extend/$Reparse)。

第14个记录是变更日志文件($Extend/$UsnJrnl)。

第15个记录是配额管理文件($Extend/$Quota)。

第16个记录是对象ID文件($Extend/$ObjId)。

第17~23记录是是系统保留记录,用于将来扩展。

MFT的前16个元数据文件是如此重要,为了防止数据的丢失,NTFS系统在该卷文件存储部分的正中央对它们进行了备份,参见下图。

NTFS把磁盘分成了两大部分,其中大约12%分配给了MFT,以满足其不断增长的文件数 量。为了保持MFT元文件的连续性,MFT对这12%的空间享有独占权。余下的88%的空间被分配用来存储文件。而剩余磁盘空间则包含了所有的物理剩余空 间--MFT剩余空间也包含在里面。MFT空间的使用机制可以这样来描述:当文件耗尽了存储空间时,Windows操作系统会简单地减少MFT空间,并把 它分配给文件存储。当有剩余空间时,这些空间又会重新被划分给MFT。虽然系统尽力保持MFT空间的专用性,但是有时不得不做出牺牲。尽管MFT碎片有时 是无法忍受的,却无法阻止它的发生。

那么NTFS到底是怎么通过MFT来访问卷的呢?首先,当NTFS访问某个卷时,它必须“装 载”该卷:NTFS会查看引导文件(在图中的$Boot元数据文件定义的文件),找到MFT的物理磁盘地址。然后它就从文件记录的数据属性中获得VCN到 LCN的映射信息,并存储在内存中。这个映射信息定位了MFT的运行(run或extent)在磁盘上的位置。接着,NTFS再打开几个元数据文件的 MFT记录,并打开这些文件。如有必要NTFS开始执行它的文件系统恢复操作。在NTFS打开了剩余的元数据文件后,用户就可以开始访问该卷了。

文件和目录记录

NTFS将文件作为属性/属性值的集合来处理,这一点与其他文件系统不一样。文件数据就是未命名属性的值,其他文件属性包括文件名、文件拥有者、文件时间标记等。下图显示了一个用于小文件的MFT记录。

每个属性由单个的流(stream)组成,即简单的字符队列。严格地说,NTFS并不对文件 进行操作,而只是对属性流进行读写。NTFS提供对属性流的各种操作:创建、删除、读取(字节范围)以及写入(字节范围)。读写操作一般是针对文件的未命 名属性的,对于已命名的属性则可以通过已命名的数据流句法来进行操作。

一个文件通常占用一个文件记录。然而,当一个文件具有很多项属性值或很零碎的时候,就可能需 要占用一个以上的文件记录。这种情况下,第一个文件记录是其基本的文件记录,存储有该文件需要的其它文件记录的位置。小文件和文件夹(典型的如1500字 节或更少)将全部存储在文件的MFT记录里。

文件夹记录包括索引信息,小文件夹记录完全存储在MFT结构内,然而大的文件夹则被组织成B+树结构,用一个指针指向一个外部簇,该簇用来存储那些MFT内存储不了的文件夹的属性。

NTFS卷上文件的常用属性在下表中列出(并不是所有文件都有所有这些属性)。

常驻属性与非常驻属性

当一个文件很小时,其所有属性和属性值可存放在MFT的文件记录中。当属性值能直接存放在 MFT中时,该属性就称为常驻属性(resident attribute)。有些属性总是常驻的,这样NTFS才可以确定其他非常驻属性。例如,标准信息属性和根索引就总是常驻属性。

每个属性都是以一个标准头开始的,在头中包含该属性的信息和NTFS通常用来管理属性的信息。该头总是常驻的,并记录着属性值是否常驻、对于常驻属性,头中还包含着属性值的偏侈量和属性值的长度。

如果属性值能直接存放在MFT中,那么NTFS对它的访问时间就将大大缩短。NTFS只需访问磁盘一次,就可立即获得数据;而不必像FAT文件系统那样,先在FAT表中查找文件,再读出连续分配的单元,最后找到文件的数据。

小文件或小目录的所有属性,均可以在MFT中常驻。小文件的未命名属性可以包括所有文件数据。建立一个小文件如下图所示:


该文件的内容


文件属性

如通过NFI查看文件“新建 文本文档.txt”的文件记录号为36,显示内容如下:

File 36

/新建 文本文档.txt

$STANDARD_INFORMATION (resident)

$FILE_NAME (resident)

$FILE_NAME (resident)

$DATA (resident)

从显示内容可以看出文件的全部属性都是常驻属性,包括DATA属性,没有非常驻属性,所以,用WINHEX打开MFT,查看该文件记录,有如下图的内容

小文件的文件记录

小目录的索引根属性可以包括其中所有文件和子目录的索引。参见下图

小目录的MFT记录

大文件或大目录的所有属性,就不可能都常驻在MFT中。如果一个属性(如文件数据属性)太大而不能存放在只有1KB的MFT文件记录中,那么NTFS将从 MFT之外分配区域。这些区域通常称为一个运行(run)或一个盘区(extent),它们可用来存储属性值,如文件数据。如果以后属性值又增加,那么 NTFS将会再分配一个运行,以便用来存储额外的数据。值存储在运行中而不是在MFT文件记录中的属性称为非常驻属性(nonresident attribute)。NTFS决定了一个属性是常驻还是非常驻的;而属性值的位置对访问它的进程而言是透明的。

当一个属性为非常驻时,如大文件的数据,它的头部包含了NTFS需要在磁盘上定位该属性值的有关信息。下图显示了一个存储在两个运行中的非常驻属性。

存储在两个运行中的非常驻属性

在标准属性中,只有可以增长的属性才是非常驻的。对文件来说,可增长的属性有数据、属性列表等。标准信息和文件名属性总是常驻的。

一个大目录也可能包括非常驻属性(或属性部分),参见下图。在该例中,MFT文件记录没有足够空间来存储大目录的文件索引。其中,一部分索引存放在索引根 属性中,而另一部分则存放在叫作“索引缓冲区”(index buffer)的非常驻运行中。这里,索引根、索引分配以及位图属性都是简化表示的,这些属性将在后面详细介绍。对目录而言,索引根的头及部分值应是常驻 的。

大目录的MFT记录

当一个文件(或目录)的属性不能放在一个MFT文件记录中,而需要分开分配时,NTFS通过VCN-LCN之间的映射关系来记录运行(run)或盘区情 况。LCN用来为整个卷中的簇按顺序从0到n进行编号,而VCN则用来对特定文件所用的簇按逻辑顺序从0到m进行编号。下图显示了一个非常驻数据属性的运 行所使用的VCN与LCN编号。


非常驻数据属性的VCN

当该文件含有超过2个运行时,则第三个运行从VCN8开始,数据属性头部含有前两个运行VCN的映射,这便于NTFS对磁盘文件分配的查询。为了便于NTFS快速查找,具有多个运行文件的常驻数据属性头中包含了VCN-LCN的映射关系,参见下图


非常驻数据属性的VCN-LCN映射

虽然数据属性常常因太大而存储在运行中,但是其他属性也可能因MFT文件记录没有足够空间而需要存储在运行中。另外,如果一个文件有太多的属性而不能存放 在MFT记录中,那么第二个MFT文件记录就可用来容纳这些额外的属性(或非常驻属性的头)。在这种情况下,一个叫作“属性列表”(attribute list)的属性就加进来。属性列表包括文件属性的名称和类型代码以及属性所在MFT的文件引用。属性列表通常用于太大或太零散的文件,这种文件因 VCN-LCN映射关系太大而需要多个MFT文件记录。具有超过200个运行的文件通常需要属性列表。

MFT文件记录结构分析

主文件表MFT的文件记录由记录头和属性列表组成,由“FF FF FF FF”结束,一般大小为1K,或一个簇大小(这样一般就更大),记录头包括以下一些域:

偏移  长度(字节)  属性

0X00    4     标志,一定是“FILE”

0X04    2     更新序列US的偏移

0X06    2     更新序列号USN的大小与数组,包括第一个字节

0X08    8     日志文件序列号LSN

0X10    2     序列号(SN)

0X12    2     硬连接数

0X14    2     第一个属性的偏移地址

0X16    2     标志,1表示记录正在使用,2表示该记录为目录

0X18    4     记录头和属性的总长度,即文件记录的实际长度,

0X1C    4     总共分配给记录的长度

0X20    8     基本文件记录中的文件索引号

0X28    2     下一属性ID

0X2A    2     XP中使用,边界

0X2C    4     XP中使用,本文件记录号

每次记录被修改都将导致日志文件序列号$LogFile Sequence Number(LSN)发生变化。

序列号Sequence Number(SN)用于记录主文件表记录被重复使用的次数。

硬连接数Hard Link Count记录硬连接的数目,只出现在基本文件记录中。

文件记录的实际长度是文件记录在磁盘上实际占用的字节空间。

基本文件记录中的文件索引号,对于基本文件记录,其值为0,如果不为0,则是一个主文件表的文件索引号,指向所属的基本文件记录中的文件记录号,在基本文件记录中包含有扩展文件记录的信息,存储在“属性列表ATTRIBUTE_LIST”属性中。

属性列表是可变长度区,以“FF FF FF FF”结束,对于1K长度的MFT记录,属性列表的起始偏移为0x30。

索引记录结构分析

第一个索引记录都是由一个标准的索引头和一些包含索引键和索引数据的块组成的。索引记录的大小在引导记录 $Boot中定义,一般总是4KB。

标准索引头的结构如下:

偏移    大小    说明

0X00    4    总是“INDX”

0X04  2    更新序号偏移

0X06    2    更新序列号USN的大小与排列,包括第一个字节

0X08        日志文件序列号LSN

0X10    8    该索引缓冲在索引分配中的索引VCN

0X18    4    索引入口的偏移(相对于0X18)

0X1C    4    索引入口的大小(相对于0X18)

0X20&    4    索引入口的分配大小(相对于0X18)

0X24    1    非页级节点为1(有子索引)

0X25    3    总是0

0X28    2    更新序列号

0X2A    2S-2    更新序列排列

常用索引列表

名称    索引    说明

$I30    文件名    目录使用

$SDH       安全描述    $SECURE

$SII    安全IDS    $SECURE

$O    对象IDS    $OBJID

$O     所有者IDS    $QUOTA

$Q     配额    $QUOTA

$R      重解析点    $REPARSE

NTFS文件系统规范

基本数据类型

MFT文件记录

文件记录是$MFT文件的基本组成部分,卷中的所有文件都由至少一个文件记录来描述,对于使用多个文件记录的文件,其第一个文件记录叫基本文件记录,其余的叫做扩展文件记录。

文件记录由记录头,数个文件属性和结束标志(0xFFFFFFFF)组成。

文件记录头格式:

名字偏移尺寸描述
FR_Sign04记录签名:值为:'ELIF’
FR_USOff42更新序列号的偏移(M)(相对文件记录头)
FR_USNSz62更新序列号个数+1(N)
FR_LSN88日志文件序列号,该值在记录每次被修改时都会被改动
FR_SN0x102重复使用 更新序列号(删除一次加1)
FR_LnkCnt0x122目录中记录本文件的引用计数,该值只用于基本文件记录
FR_USAOff0x142第一个属性数据的偏移
FR_Flags0x162

标志,该成员可以是以下各值中之一

0x0001记录被使用

0x0002目录文件

FR_Size0x184当前记录的尺寸
FR_AllocSz0x1c4当前记录分配的空间的尺寸
FR_BaseFR0x208

当前文件记录的基本文件记录的索引,如果当前文件记录是基本文件记录则该值为0,否则指向基本文件记录的记录索引。

注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号

FR_NxtAttrId0x282

下一个属性的ID。

下一次将会被添加到文件记录的属性的ID,每次往文件记录中添加属性时该值都会增加,每次文件记录被重新使用时该值都会被清零,第一个值肯定是0

FR_Resvd0x2a2保留(XP新增,3.1+)
FR_NumOfFR0x2c4该MFT 记录号 (XP新增,3.1+)
FR_USNM2

序列号。

该值记录文件记录被修改的次数,每次修改时该值+1,(包括文件被删除操作)该值不能为0

FR_USAM+2(N-1)*2序列值占用的空间的原值

目录记录

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

名字

偏移

尺寸

描述

IR_Sign

0

4

记录签名:,值为:'XDNI’

IR_USOff

4

2

序列号的偏移(M)

IR_USNSz

6

2

序列值个数+1(N)

IR_LSN

8

8

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

IR_VCN

16

8

当前目录记录在目录存储区中的虚拟簇号

IR_EntryOff

24

4

第一个目录项的偏移

IR_EntrySz

28

4

目录项的尺寸

IR_AllocSz

32

4

为目录项分配的空间的尺寸

IR_Flags

36

1

为1表示有子节点

IR_Resvd

37

3

保留

IR_USN

40

2

序列号

IR_USA

42

2

序列值占用的空间的原值

更新序列号

更新序列号是Microsoft公司为了确保记录数据的可靠性而在NTFS卷中提出的一项技术,在NTFS卷中,所有的记录类型数据(FR、IR)占用的空间都是按扇区尺寸(512字节)对齐。保护记录数据时,在每512字节的最末2个字节都会写入一个校验值以确保记录中的所有数据都被正确的写入磁盘中,而校验值所在位置的数据被拷贝到记录头之后被称作USA(Update Sequence Array)的数据块中,系统将记录数据从磁盘读入内存时将检查每个校验值是否与记录头的中序列号是否相同,如果相同则用USA中相应位置的数据恢复校验值位置的数据,反之则表明该记录被没有正确地修改。

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

校验码第1个512字节扇区末原值第2个512字节扇区末原值。。。。最后一个512字节扇区末原值

扇区数据结构

虚拟簇号

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

逻辑簇号

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

数据流描述

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

名字偏移尺寸说明
SD_Desc01流描述说明,高4位(M)描述流描述偏移的字节数,低4位(N)描述流描述尺寸的字节数
SD_Size1N当前流的尺寸
SD_OffN+1M当前流相对于上一个流的偏移,如果该值的最高位为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 个稀疏簇(未分配空间)

引导扇区与BPB

NTFS卷的第一个重要的数据区是BPB(BIOS Parameter Block),数据区位于卷中第一个个区域:$Boot文件的第一个扇区中。该扇区也叫做引导扇区。

引导扇区与BPB结构

名字

偏移

尺寸

描述

BS_jmpBoot

0

3

跳转到引导代码处。本域允许有以下两种格式:

jmpBoot[0]=0xEB,jmpBoot[1]=0x??,jmpBoot[2]=0x90

jmpBoot[0]=0xE9,jmpBoot[1]=0x??,jmpBoot[2]=0x??

0x??指这里可以是任意值,上述格式是跳转到代码的Intel x86无条件跳转指令,引导代码存放在卷中第一个扇区中BPB表的后面

BS_OEMName

3

8

“NTFS”本域是判别卷是否为NTFS卷的必要条件,NTFS卷中此域必须设置为上述值

BPB_BytsPerSec

11

2

每扇区字节数,该值仅可以从以下值中选取一个:512、1024、2048、1096。为了兼容以前的软件,建议使用512这个值

BPB_SecPerClus

13

1

每个分配单元扇区数,大于0而且必须是2的整数次幂,本值可以是1,2,4,8,16,32,64,128。注意本值必须保证使每簇字节数(BPB_BytsPerSec * BPB_SecPerClus)小于4K。

BPB_RsvdSecCnt

14

2

保留区域中保留的扇区数

BPB_NumFATs

16

1

FAT表的个数,本域是为了保持与FAT/FAT32的BPB兼容而保留,其值固定为0

BPB_RootEntCnt

17

2

为保持兼容性而保留,值固定为0

BPB_TotSec16

19

2

为保持兼容性而保留,值固定为0

BPB_Media

21

1

存储介质代码,对固定磁盘为0xF8,对于可移动介质,其值通常是0xF0,合法的值有0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF。

BPB_FATSz16

22

2

为保持兼容性而保留,值固定为0

BPB_SecPerTrk

24

2

Int 13H调用中的每磁道扇区,本值仅当存储介质按CHS方式寻址且能被Int 13H识别才有意义。

BPB_NumHeads

26

2

Int 13H调用中的磁头数,其意义同前面的BPB_SecPerTrk。注意该值的基数是1。

BPB_HiddenSec

28

4

隐藏扇区数,分区每一个扇区相对于分区表的偏移扇区数。

BPB_TotSec32

32

4

为保持兼容性而保留,值固定为0

BS_DrvNum

36

1

Int 13H调用的磁盘号参数。

BS_Reserved1

37

1

保留,值为0。

BS_Reserved2

38

2

保留,值80H。

BS_TotSec64

40

8

卷总扇区数。

BS_1stClusOfMFT

48

8

$MFT文件第一个簇的簇号

BS_1stClusOfMFTMirr

56

8

$MFTMirr文件第一个簇的簇号

BS_ClusPerFR

64

4

每个文件记录占用的簇数1

BS_ClusPerDR

68

4

每个目录记录点用的簇数1

BS_Serial

72

8

卷序列号

注1:每个记录占用的簇数如果为正值则表示该记录占用的簇数;如果为负值则表明记录尺寸小于簇尺寸,此时计算记录尺寸的方法应该是:记录的尺寸=2^(~每文件记录占用簇数)。

比如:BS_ClusPerFR=0xF6(-10),此时记录的尺寸是

BytsPerRecord=2^(~0xf6)

=2^10

=1024

系统文件

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

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

名字

描述

$MFT

Master File Tab 主文件表。该文件记录了卷中所有的文件(包括$MFT自己)的描述信息,通过$MFT文件可以访问卷中的所有信息。$MFT文件由多个文件记录(FRS)组成。每个文件的描述信息占用一个或多个文件记录。对于每一个文件,$MFT用一套被称为属性(Attributes)的记录来保存其信息。$MFT中前12个文件信息分别记录了12个系统文件的信息,从12-23号记录保留,从24号记录起记录其他文件的信息。

$MFTMirr

Mirror of $MFT $MFT文件中前4个文件($MFT、$MFTMirr、$LogFile、$Volume)的描述的备份。本文件主要用于卷数据损坏时恢复卷。

$LogFile

卷事务的日志信息文件。

$Volume

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

$AttrDef

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

. (Root Directory)

NTFS卷的根目录。

$Bitmap

记录卷中所有分配单元的使用情况。本文件中每一个Bit数据对应一个簇。

$Boot

引导记录,通过本文件的代码系统才能从NTFS卷中启动。本文件是NTFS卷中唯一一个位置固定的文件,必须置于卷的第一个扇区处。

$BadClus

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

$Secure

记录卷中用到的安全描述符信息。

$UpCase

本记录Unicode编码下的所有字符的大写的代码,用于比较和排序文件名。

$Extend

本文件是一个目录,其中记录了卷中的对象的GUID及配额等信息。

文件属性记录

文件中的每个记录都是由属性组成。每个属性由相同的格式构成,首先是一个标准属性记录头,然后存放属性的专用数据。下面列出$AttrDef中定义的可用到的属性。

类型操作系统描述
0x10STANDARD_INFORMATION
0x20ATTRIBUTE_LIST
0x30FILE_NAME
0x40NTVOLUME_VERSION
0x402KOBJECT_ID
0x50SECURITY_DESCRIPTOR
0x60VOLUME_NAME
0x70VOLUME_INFORMATION
0x80DATA
0x90INDEX_ROOT
0xA0INDEX_ALLOCATION
0xB0BITMAP
0xC0NTSYMBOL_LINK
0xC02KREPARSE_POINT
0xD0EA_INFORMATION
0xE0EA
0xF0NTPROPERTY_SET
0x1002KLOGGED_UNTILITY_STREAM

属性记录头

每个MFT属性记录都有一个属性记录头,这个头记录了属性的类型、名字(可选)、有两种格式:

1.驻留属性

名字偏移尺寸说明
ATTR_Type0x004属性类型。该值必须是$AttrDef文件中定义的属性列表中的一项
ATTR_Size

0x04

4

记录尺寸(包括记录头)

ATTR_NonResFlag0x081属性数据非驻留标志,值为0,驻留属性不能被压缩
ATTR_NamSz0x091属性名尺寸,该值为0时表示当前属性没有名字
ATTR_NamOff0x0a2属性名相对于属性头的偏移,该值总是固定为0x18
ATTR_Flags0x0c2

属性标志,在当前的版本中只支持以下3个标志:

0x4000属性被加密

0x8000稀疏属性

注意:只有非驻留的数据(Data)属性才能被压缩

ATTR_Id0x0d2属性ID,在MFT记录中的每个属性都有一个唯一的ID。与MFT 的FR_NxtAttrId对应
ATTR_DatSz0x104属性数据尺寸
ATTR_DatOff0x142属性数据相对于属性头的偏移
ATTR_Indx0x161属性索引标志(对FILE_NAME有效)
ATTR_Resvd0x171保留
ATTR_AttrNam0x182*N属性名字Unicode字符串,这个字符串不用在结尾处加0
ATTR_AttrDat0x18+2*N

属性数据,所以的数据都应该按双字对齐

(为各常驻属性实体部分)

>=24 bytes

2.非驻留属性

名字偏移尺寸说明
ATTR_Type0x004属性类型。该值必须是$AttrDef文件中定义的属性列表中的一项
ATTR_Size

0x04

4

记录尺寸(包括记录头)

ATTR_NonResFlag0x081属性数据非驻留标志,值为1
ATTR_NamSz0x091属性名尺寸,该值为0时表示当前属性没有名字
ATTR_NamOff0x0a2属性名相对于属性头的偏移,该值总是固定为0x18
ATTR_Flags0x0c2

属性标志,在当前的版本中只支持以下3个标志:

0x0001属性被压缩

0x4000属性被加密

0x8000稀疏属性

注意:只有非驻留的数据(Data)属性才能被压缩

ATTR_Id0x0d2属性ID,在MFT记录中的每个属性都有一个唯一的ID。
ATTR_StartVCN0x108本属性中数据流开始的簇号
ATTR_EndVCN0x188本属性中数据流最后一簇的簇号
ATTR_DataOff0x202数据流描述相对于属性头的偏移,数据应该按双字对齐
ATTR_CmpSz0x222压缩单元的尺寸。压缩单元的尺寸必须是2的整数次幂,为0表示未压缩
ATTR_Resvd0x244保留
ATTR_AllocSz0x288属性记录数据块分配的空间的尺寸,该尺寸按簇尺寸对齐
ATTR_ValidSz0x308属性记录数据块的实际尺寸
ATTR_InitedSz0x388属性记录数据块已经初始化数据的尺寸,到目前为止该值都与属性记录数据块分配的尺寸相同
ATTR_AttrNam0x402*N属性名的UNICODE字符串,该字符串不以0结尾
ATTR_DataRuns0x40+2*N
属性数据流描述(为各非常驻属性逻辑簇区域指向,具体实体在指向区域)

>=64 bytes

注意

1.只有非驻留的数据(Data)属性才可以被压缩或是稀疏类型。

2.只有驻留属性才有索引标志,是否表示只有驻留属性才能被索引?

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

在老的NTFS版本中,STARDAND_INFORMATION属性只用于存放文件的时间和DOS文件属性信息。在Windows 2000中新引进了4个域来描述配额、安全、文件尺寸和日志信息。

属性描述如下表:

名字偏移尺寸描述

--标准属性头(24 字节)
SI_CreatTime0x008文件创建时间
SI_AlterTime0x088文件最后一次修改时间
SI_MFTChgTime0x108文件的MFT记录修改的时间
SI_ReadTime0x188最后一次访问的时间
SI_DOSAttr0x204

DOS文件属性,可以是以下各值的组合:

0x0001只读

0x0002隐藏

0x0004系统

0x0020归档

0x0040设备

0x0080常规

0x0100临时文件

0x0200稀疏文件

0x0400重解析点

0x0800压缩

0x1000离线

0x2000无内容索引

0x4000加密

SI_MaxVer0x244文件可用的最大版本号,此值为0表示版本功能被禁止(目前未使用?)
SI_Ver0x284文件版本号,如果最大版本号为0则值也必须为0
SI_ClassId0x2c4不明(目前未使用?)
SI_OwnerId0x304(2K)文件拥有者的ID,本ID是$Quota文件中$O或$Q记录中的键,如果该值为0则表示配额设置被禁止
SI_SecurityId0x344(2K)安全ID,本值是$Securce文件中$SII索引及$SDS数据流的键
SI_QuotaCharged0x388(2K)该文件最大可使用的空间配额。如果该值为0则表示无配额限制
SI_USN0x408(2K)文件最后一次更新的记录号,该值是$UsnJrnl文件的直接索引,如果该值为0则表示更新日志被禁止

ATTRIBUTE_LIST(0x20 len > 26)

当MFT记录中的属性太多太长时,MFT记录就容纳不下这么多属性记录了,这时就只能将属性的数据以非驻留数据的形式存放到卷中的其他位置,如果这样还是存放不下,就必须用到属性表属性了。存放不下的属性会被转移到一个新分配的MFT记录中,然后在原MFT中加入一个属性表属性以描述如何搜索到当前文件的所有属性。

紧随标准属性头之后存放各属性的描述记录,记录了属性的位置和所在MFT记录,每个属性描述按4字对齐,记录了属性的类型、名字(有名属性)、序号。

属性表属性中不包括对自身的描述。

名字偏移尺寸描述

--标准属性头
AL_RD_Type04属性类型
AL_RD_Len42属性描述尺寸
AL_RD_NamLen61属性名尺寸,值为N
AL_RD_NamOff71属性名相对于属性描述的偏移
AL_RD_StartVCN88本属性中数据流开始的簇号
AL_RD_BaseFRS0x108

本属性记录所属的MFT记录的记录号。

注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号

AL_RD_AttrId0x182属性的ID
AL_RD_Name0x1a2*N属性名UNICODE字符串。该字符串不以0字符为结束标志

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

1.文件有太多的别名。

2.碎片太多以至于数据流描述填满了MFT记录。

3.有太复杂的安全描述(在NTFS 3.0以后的版本中不会再出现这种情况)。

4.有太多的命令流,比如数据流。

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

本属性用于描述文件的名字,本属性总是驻留在MFT记录中。

在$AttrDef的定义中,本属性的最小尺寸是68字节,最大是578字节,因此最大文件名长度是255个字节。

名字偏移尺寸描述

--标准属性头(24 字节)
FN_ParentFR08

父目录的MFT记录的记录索引。

注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号

FN_CreatTime88文件创建的时间
FN_AlterTime0x108文件最后一次被修改的时间
FN_MFTChg0x188文件的MFT记录被修改的时间
FN_ReadTime0x208最后一次访问文件的时间
FN_AllocSz0x288文件数据占用的空间尺寸,该值按簇尺寸对齐
FN_ValidSz0x308文件的真实尺寸,索引项(目录项)中显示的文件尺寸就是该值。如果文件的数据属性中的开始簇号不为0则本项的值为空,此时需要查询文件尺寸的话必须访问SI属性
FN_DOSAttr0x384

DOS文件属性,可以是以下各值的组合:

0x0001只读

0x0002隐藏

0x0004系统

0x0020归档

0x0040设备

0x0080常规

0x0100临时文件

0x0200稀疏文件

0x0400重解析点

0x0800压缩

0x1000离线

0x2000无内容索引

0x4000加密

0x10000000 目录

0x20000000 索引视

FN_EA_Reparse0x3c4扩展属性与链接
FN_NameSz0x401文件名的字符数
FN_NamSpace0x411

命名空间,该值可为以下值中的任意一个

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_FileName0x422*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_ObjID016文件的GUID
OID_BirthVolID0x1016文件建立时所在卷的ID
OID_BirthID0x2016文件的原始ID
OID_DomainID0x3016对象所创建时所在域的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_Resvd08保留,始终为0
VI_MajVer81卷主版本号
VI_MinVer91卷次版本号
VI_Flags0x0a2

标志位,可以是以下各值组合

0x0001脏位,当该值被设置时Windows将会在下次启动时运行chkdsk/F命令。

0x0002日志文件改变尺寸

0x0004卷挂接时升级

0x0008由Windows NT 4挂接

0x0010启动时删除USN

0x0020修复过的ID

0x8000被chkdsk修改过


0x0c4保留,始终为0

操作系统格式化的卷对应的NTFS卷版本

操作系统NTFS版本
Microsoft Windows NT1.2
Microsoft Windows 20003.0
Microsoft Windows XP3.1

DATA (0x80)

该属性包含文件的数据,文件的尺寸就是记录中无名数据流的尺寸。该属性没有最大最小值限制。

名字偏移尺寸描述

--标准属性头
ATTR_DataRuns0x40+2*N
数据或数据运行

对于驻留数据,数据紧接着记录头存放;对于非驻留数据,记录头后存放的是数据流的描述。

通常目录文件没有数据属性,文件的数据属性是没有名字的。文件必须有一个无名的数据属性。

注:NTFS有一个特性:允许在一个文件存放多个数据属性,这就使得用户可以轻松的实现HFS提供的那种将文件分为两部分(在HFS术语中被称为叉):一个资源块一个数据块。对于数据块可以使用缺省的无名数据属性,对于资源块可以使用一个命名数据属性,如:“resource”

INDEX_ROOT (0x90)

该属性作为B+树的根节点以实现目录功能(比如目录文件)。该属性总是驻留。

名字

偏移

尺寸

描述

所属结构

IR_Head

-

-

标准属性头

目录根节点

IR_AttrType

0

4

属性的类型

IR_ColRule

4

4

整理规则

IR_EntrySz

8

4

目录分配项尺寸

IR_ClusPerRec

12

1

每个目录项占用的簇数

IR_Resvd

13

3

保留

IH_EntryOff

16

4

第一个目录项的偏移

目录头

IH_TalSzOfEntries

20

4

目录项的总尺寸

IH_AllocSize

24

4

目录项分配的尺寸

IH_Flags

28

1

标志位,此值可能是以下和值之一:

0x00  小目录(数据存放在根节点的数据区中)

0x01  大目录(需要目录项存储区和索引项位图)

IH_Resvd

29

3

保留

IE_FR

32

8

目录项对应的文件的记录索引。

注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号

目录项

如果当前属性驻留则目录项直接存放在当前属性的数据区中,否则会放到目录存储区属性中

IE_Size

40

2

整个当前目录项的尺寸(L)

IE_DataSize

42

2

目录项数据尺寸(M)

IE_Flags

44

1

标志。该值可能是以下值之一:

0x00  普通文件项

0x01  有子项

0x02  当前项是最后一个目录项

在读取索引项数据时应该首先检查该成员的值以确定当前项的类型

IE_Stream

45

M

目录项数据,结构与文件名属性的数据相同

IE_SubNodeFR

45+M

L-8

子项的记录索引。

注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号

Standard Attribute Header

· Index Root

· Index Header

· Index Entry

· Index Entry

名字偏移尺寸描述所属结构

--标准属性头

目录根节点

(16字节)

IR_AttrType04属性的类型
IR_ColRule44整理规则
IR_EntrySz84每个索引块 尺寸(4k)
IR_ClusPerRec0x0c1每个索引块 占用的簇数
IR_Resvd0x0d3保留
如果索引项(目录项)在INDEX_ROOT,后面跟索引块头+索引项(目录项)表

索引块头(16 bytes)

IH_EntryOff0x04第一个索引项(目录项)的偏移(相对索引块头)

IR索引块头

(16字节)

IH_TalSzOfEntries0x44所有索引项的总尺寸
IH_AllocSize0x84所有索引项的总分配尺寸
IH_Flags0xc1

标志位

0x00小目录(目录项存放IR中)

0x01大目录(需要外部索引块和位图)

IH_Resvd0xd3保留

索引项(目录项)

IE_FR0x08

索引项(目录项)对应的文件的MFT记录索引。

注意:该值的低6字节是MFT记录号,高2字节是该MFT记录的序列号

索引项(目录项)(8字节对齐)

(不在IR属性,便在IA中)

IE_Size0x82整个当前索引项(目录项)的尺寸 (L)
IE_DataSize0xa2索引项(目录项)数据尺寸 (M)
IE_Flags0xc1

标志。该值可能是以下值之一:

0x01 有SubNodeFR值

0x02 当前项是最后索引项(目录项,此时无IE_Stream)

在读取索引项数据时应该首先检查该成员的值以确定当前项的类型

IE_Stream0x10M索引项(目录项)数据,结构与文件名属性的数据相同
IE_SubNodeFR0x10+ML-8索引项(目录项)在目录文件的VCN 值(对IB_VCN的细分)

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

INDEX_ALLOCATION (0xA0大目录使用)

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

名字偏移尺寸描述

--标准属性头
ATTR_DataRuns0x40+2*N
属性数据流描述(为各非常驻属性逻辑簇区域指向,具体实体在指向区域)

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

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

名字偏移尺寸描述
IB_Sign04记录签名:值为:'XDNI’
IB_USOff42更新序列号的偏移(M) 恒=0x28
IB_USNSz62更新序列号个数+1(N) 恒=0x09(4K/512+1)
IB_LSN88日志文件序列号,该值在记录每次被修改时都会被改动
IB_VCN0x108当前 索引块 在目录文件 中的虚拟簇号
后面跟IA索引块头
IR_EntryOff0x184第一个索引项(目录项)的偏移(相对IA索引块头)
IR_EntrySz0x1c4索引块的 总有效尺寸(从IR_Sign开始)
IR_AllocSz0x204为索引项(目录项)分配的空间的尺寸
IR_Flags0x241为1表示块内 有带子节点的索引项
IR_Resvd0x253保留
IR_USN0x282更新序列号
IR_USA0x1a2* 8更新序列值占用的空间的原值
后面紧跟索引项(目录项)

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

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

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

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

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

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

名字偏移尺寸描述

--标准属性头
ATTR_DataRuns0x40+2*N
数据或数据运行

SYMBOL_LINK (0xC0 NT)

本属性只用于Microsoft Windows NT。

REPARSE_POINT (0xC0 2K)

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

名字偏移尺寸描述

--标准属性头
RP_Type04

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

0x20000000别名

0x40000000最高等待时间

0x80000000微软使用

0x68000005NSS

0x68000006NSS恢复

0x68000007SIS

0x68000008DFS

0x88000003卷挂接点

0xA8000004 HSM

0xE8000000 硬连接

RP_DatSz42重解析数据尺寸
RP_Resvd62保留
RP_Data8L重解析数据

EA_INFORMATION (0xD0 )

该属性用于实现为OS/2子系统或Windows NT服务器的OS/2客户提供基于NTFS的HPFS扩展属性。因为数据流可能会增大,所以该属性可以是非驻留的。 

名字偏移尺寸描述

--标准属性头
EI_PackedSz02压缩扩展属性尺寸
EI_NumOfEA02拥有NEED_EA记录的扩展属性个数
EI_UnpackedSz44未压缩扩展属性尺寸

EA(0xE0)

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

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

 

名字偏移尺寸描述

--标准属性头
EA_Next04下一个扩展属性的偏移(本记录的尺寸)
EA_Flags41标志位,值取0x80表示需要EA
EA_NamLen51名字数据的长度(M)
EA_ValLen62值数据的长度
EA_Name8M名字数据
EA_Value8+MN值数据

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、$Volume)的描述的备份。本文件主要用于卷数据损坏时恢复卷。
2$LogFile
卷事务的日志信息文件。
3$Volume
卷基本信息,包括卷名,序列号等信息。
4$AttrDef
属性定义,该文件定义了本卷中可用的属性类型。
5.(Root Directory)
NTFS卷的根目录。
6$Bitmap
记录卷中所有分配单元的使用情况。本文件中每一个Bit数据对应一个簇。
7$Boot
引导记录,通过本文件的代码系统才能从NTFS卷中启动。本文件是NTFS卷中唯一一个位置固定的文件,必须置于卷的第一个扇区处。
8$BadClus
记录卷中坏簇的信息,本文件是稀疏文件,只包含坏簇的信息。
9$QutoaNT
9$Secure2K记录卷中用到的安全描述符信息。
10$UpCase
本记录Unicode编码下的所有字符的大写的代码,用于比较和排序文件名。
11$Extend2K

本文件是一个目录,扩展元数据目录,其中记录了卷中的对象的GUID及配额等信息。$ObjId, $Quota, $Reparse, $UsnJrnl

12$Extend\$Reparse2K重解析点文件 11~15 标记为使用
13$Extend\$UsnJrnl2K变更日志文件
14$Extend\$Quota2K配额管理文件
15$Extend\$ObjId2K对象ID文件
16~23

保留,标记为未使用

>24A File
一般文件
>24A 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


0x80

$DATA

[Unnamed]

未命名数据流格式

引导扇区与BPB

NTFS卷的第一个重要的数据区是BPB(BIOS Parameter Block),数据区位于卷中第一个个区域:$Boot文件的第一个扇区中。该扇区也叫做引导扇区。

引导扇区与BPB结构

名字偏移尺寸描述
BS_jmpBoot03

跳转到引导代码处。本域允许有以下两种格式:

jmpBoot[0]=0xEB,jmpBoot[1]=0x??,jmpBoot[2]=0x90

jmpBoot[0]=0xE9,jmpBoot[1]=0x??,jmpBoot[2]=0x??

0x??指这里可以是任意值,上述格式是跳转到代码的Intel x86无条件跳转指令,引导代码存放在卷中第一个扇区中BPB表的后面

BS_OEMName38“NTFS”本域是判别卷是否为NTFS卷的必要条件,NTFS卷中此域必须设置为上述值
BPB_BytsPerSec0x0b2每扇区字节数,该值仅可以从以下值中选取一个:512、1024、2048、1096。为了兼容以前的软件,建议使用512这个值
BPB_SecPerClus0x0d1每个分配单元扇区数,大于0而且必须是2的整数次幂,本值可以是1,2,4,8,16,32,64,128。注意本值必须保证使每簇字节数(BPB_BytsPerSec * BPB_SecPerClus)小于4K。
BPB_RsvdSecCnt0x0e2保留区域中保留的扇区数,0
BPB_NumFATs0x101FAT表的个数,本域是为了保持与FAT/FAT32的BPB兼容而保留,其值固定为0
BPB_RootEntCnt0x112为保持兼容性而保留,值固定为0
BPB_TotSec160x132为保持兼容性而保留,值固定为0
BPB_Media0x151存储介质代码,对固定磁盘为0xF8,对于可移动介质,其值通常是0xF0,合法的值有0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF。
BPB_FATSz160x162为保持兼容性而保留,值固定为0
BPB_SecPerTrk0x182Int 13H调用中的每磁道扇区,本值仅当存储介质按CHS方式寻址且能被Int 13H识别才有意义。
BPB_NumHeads0x1a2Int 13H调用中的磁头数,其意义同前面的BPB_SecPerTrk。注意该值的基数是1。
BPB_HiddenSec0x1c4隐藏扇区数,分区每一个扇区相对于分区表的偏移扇区数。
BPB_TotSec320x204为保持兼容性而保留,值固定为0
BS_DrvNum0x241Int 13H调用的磁盘号参数。
BS_Reserved10x251保留,值为0。
BS_Reserved20x262保留,值80H。
BS_TotSec640x288卷总扇区数。
BS_1stClusOfMFT0x308$MFT文件第一个簇的簇号
BS_1stClusOfMFTMirr0x388$MFTMirr文件第一个簇的簇号
BS_ClusPerFR0x404每个文件记录占用的簇数1
BS_ClusPerDR0x484每个目录记录点用的簇数1
BS_Serial0x708卷序列号
~



0x200
NT loader

1:每个记录占用的簇数如果为正值则表示该记录占用的簇数;如果为负值则表明记录尺寸小于簇尺寸,此时计算记录尺寸的方法应该是:记录的尺寸=2^(~每文件记录占用簇数)。

比如:BS_ClusPerFR=0xF6(-10),此时记录的尺寸是 BytsPerRecord=2^(~0xf6)=2^10=1024

$BadClus

该文件记录了卷中的坏簇的信息。该文件是一个稀疏文件,只记录有坏簇的描述。该文件拥有两个数据属性,第一个数据属性无名且是空属性,第二个数据属性名为:“$Bad”,该属性记录了卷中的坏簇的VCN,该属性中的数据分配的空间是整个卷的尺寸,数据占用的实际空间也是卷的尺寸,已初始化数据尺寸为0。在属性的数据流描述中非稀疏的描述就是坏簇的VCN。

坏簇在$Bitmap文件中相应的位总是被标记为已使用。

在MFT 文件的属性记录集

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$BadClus

0x80

$DATA

[Unnamed]

0x80

$DATA

$Bad

$Secure

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$Secure

0x80

$DATA

$SDS

0x90

$INDEX_ROOT

$SDH

0x90

$INDEX_ROOT

$SII

0xA0

$INDEX_ALLOCATION

$SDH

0xA0

$INDEX_ALLOCATION

$SII

0xB0

$BITMAP

$SDH

0xB0

$BITMAP

$SII

$SDS 数据流

Offset

Size

Description

0x00

4

Hash of Security Descriptor

0x04

4

Security Id

0x08

8

Offset of this entry in this file

0x10

4

Size of this entry

0x04

V

Self-relative Security Descriptor

V+0x04

P16

Padding

$SDH Index

Offset

Size

Value

Description


~

~

~

Standard Index Header


0x00

2

0x18

Offset to data


0x02

2

0x14

Size of data


0x04

4

0x00

Padding


0x08

2

0x30

Size of Index Entry


0x0A

2

0x08

Size of Index Key


0x0C

2


Flags


0x0E

2

0x00

Padding


0x10

4


Key

Hash of Security Descriptor

0x14

4


Key

Security Id

0x18

4


Data

Hash of Security Descriptor

0x1C

4


Data

Security Id

0x20

8


Data

Offset to Security Descriptor (in $SDS)

0x28

4


Data

Size of Security Descriptor (in $SDS)

0x2C

P8


Data

Padding

$SII Index

Offset

Size

Value

Description


~

~

~

Standard Index Header


0x00

2

0x14

Offset to data


0x02

2

0x14

Size of data


0x04

4

0x00

Padding


0x08

2

0x28

Size of Index Entry


0x0A

2

0x04

Size of Index Key


0x0C

2


Flags


0x0E

2

0x00

Padding


0x10

4


Key

Security Id

0x14

4


Data

Hash of Security Descriptor

0x18

4


Data

Security Id

0x1C

8


Data

Offset to Security Descriptor (in $SDS)

0x24

4


Data

Size of Security Descriptor (in $SDS)

$UpCase

在MFT 文件的属性记录集

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$UpCase

0x80

$DATA

[Unnamed]

未命名数据流格式

$Extend

This is a directory containing the Metadata files: $ObjId, $Quota, $Reparse and $UsnJrnl.

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$Extend

0x90

$INDEX_ROOT

$I30

$ObjId

This system file is an index of all the $OBJECT_ID Attributes in use on the volume.

 

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$ObjId

0x90

$INDEX_ROOT

$O

0xA0

$INDEX_ALLOCATION

$O

0xB0

$BITMAP

$O

$ObjId:$O

Offset

Size

Value

Description


~

~

~

Standard Index Header


0x00

2

0x20

Offset to data


0x02

2

0x38

Size of data


0x04

4

0x00

Padding


0x08

2

0x58

Size of Index Entry


0x0A

2

0x10

Size of Index Key


0x0C

2


Flags


0x0E

2

0x00

Padding


0x10

16


Key

GUID Object Id

0x20

8


Data

MFT Reference

0x28

16


Data

GUID Birth Volume Id

0x38

16


Data

GUID Birth Object Id

0x48

16


Data

GUID Domain Id

 Flags

Flag

Description

0x01

Entry has subnodes

0x02

Last Entry

$Quota

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$Quota

0x90

$INDEX_ROOT

$O

0x90

$INDEX_ROOT

$Q

0xA0

$INDEX_ALLOCATION

$O

0xA0

$INDEX_ALLOCATION

$Q

0xB0

$BITMAP

$O

0xB0

$BITMAP

$Q

$Quota:$O

 

Offset

Size

Value

Description


~

~

~

Standard Index Header


0x00

2

0x1C

Offset to data


0x02

2

0x04

Size of data


0x04

4

0x00

Padding


0x08

2

0x20

Size of Index Entry


0x0A

2

0x0C

Size of Index Key (K)


0x0C

2


Flags


0x0E

2

0x00

Padding


0x10

K


Key

SID

K+0x10

4


Data

Owner Id

K+0x14

P


Data

Padding8

$Quota:$Q

Offset

Size

Value

Description


~

~

~

Standard Index Header


0x00

2

0x14

Offset to data


0x02

2


Size of data


0x04

4

0x00

Padding


0x08

2


Size of Index Entry


0x0A

2

0x04

Size of Index Key


0x0C

4

0x00

Padding


0x10

4


Key

Owner Id

0x14

4

0x02

Data

Version

0x18

4


Data

Flags

0x1C

8


Data

Bytes Used

0x24

8


Data

Change Time

0x2C

8


Data

Warning Limit

0x34

8


Data

Hard Limit

0x3C

8


Data

Exceeded Time

0x44

V


Data

SID

V+0x44

P

0x00

Data

Padding8

$Quota flags

Flag

Description

0x0001

Default Limits

0x0002

Limit Reached

0x0004

Id Deleted

0x0010

Tracking Enabled

0x0020

Enforcement Enabled

0x0040

Tracking Requested

0x0080

Log Threshold

0x0100

Log Limit

0x0200

Out Of Date

0x0400

Corrupt

0x0800

Pending Deletes

$Reparse

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$Reparse

0x90

$INDEX_ROOT

$R

0xA0

$INDEX_ALLOCATION

$R

0xB0

$BITMAP

$R

$Reparse:$R

Offset

Size

Value

Description

~

~

~

Standard Index Header

0x00

2

0x1C

Offset to data

0x02

2

0x00

Size of data

0x04

4

0x00

Padding

0x08

2

0x20

Size of Index Entry

0x0A

2

0x0C

Size of Index Key

0x0C

2


Flags

0x0E

2

0x00

Padding

0x10

4


Key Reparse Tag (and Flags)

0x14

8


Key MFT Reference of Reparse Point

0x1C

4

0x00

Key Padding (align to 8 bytes)

$UsnJrnl

在MFT 文件的属性记录集

Type

Description

Name

0x10

$STANDARD_INFORMATION


0x30

$FILE_NAME

$UsnJrnl

0x80

$DATA

$J

0x80

$DATA

$Max

$UsnJrnl:$J

Offset

Size

Description

0x00

4

Size of entry

0x04

2

Major Version

0x06

2

Minor Version

0x08

8

MFT Reference

0x10

8

Parent MFT Reference

0x18

8

Offset of this entry in $J

0x20

8

Timestamp

0x28

4

Reason

0x2B

4

SourceInfo

0x30

4

SecurityID

0x34

4

FileAttributes

0x38

2

Size of filename (in bytes)

0x3A

2

Offset to filename

0x3C

V

Filename

V+0x3C

P

Padding (align to 8 bytes)

$UsnJrnl reason flags

Flag

Description

0x01

Data in one or more named data streams for the file was overwritten.

0x02

The file or directory was added to. 0x04 The file or directory was truncated.

0x10

Data in one or more named data streams for the file was overwritten.

0x20

One or more named data streams for the file were added to.

0x40

One or more named data streams for the file was truncated.

0x100

The file or directory was created for the first time.

0x200

The file or directory was deleted.

0x400

The user made a change to the file's or directory's extended attributes. These NTFS at-tributes are not accessible to Windows-based applications.

0x800

A change was made in the access rights to the file or directory.

0x1000

The file or directory was renamed, and the file name in this structure is the previous name.

0x2000

The file or directory was renamed, and the file name in this structure is the new name.

0x4000

A user changed the FILE_ATTRIBUTE_NOT_CONTENT_INDEXED attribute. That is, the user changed the file or directory from one that can be content indexed to one that cannot, or vice versa.

0x8000

A user has either changed one or more file or directory attributes or one or more time stamps.

0x10000

An NTFS hard link was added to or removed from the file or directory.

0x20000

The compression state of the file or directory was changed from or to compressed.

0x40000

The file or directory was encrypted or decrypted.

0x80000

The object identifier of the file or directory was changed.

0x100000

The reparse point contained in the file or directory was changed, or a reparse point was added to or deleted from the file or directory.

0x200000

A named stream has been added to or removed from the file, or a named stream has been renamed.

0x80000000

The file or directory was closed.

$UsnJrnl source info flags

Flag

Description

0x01

The operation provides information about a change to the file or directory made by the operating system. A typical use is when the Remote Storage system moves data from external to local storage. Remote Storage is the hierarchical storage management software. Such a move usually at a minimum adds the USN_REASON_DATA_OVERWRITE (0x01) flag to a USN record.

0x02

The operation adds a private data stream to a file or directory. An example might be a virus detector adding checksum information. As the virus detector modifies the item, the system generates USN records. USN_SOURCE_AUXILIARY_DATA (0x02) in-dicates that the modifications did not change the application data.

0x04

The operation creates or updates the contents of a replicated file. For example, the file replication service sets this flag when it creates or updates a file in a replicated direct-ory.

$UsnJrnl:$Max

Offset

Size

Description

0x00

8

Maximum Size

0x08

8

Allocation Delta

0x10

8

USN ID (a)

0x18

8

Lowest Valid USN

NTFS卷初始化

NTFS卷初始化时系统首先检查引导扇区中的卷类型签名,如果签名不是“NTFS”则认为该卷不是NTFS卷。然后读取引导扇区中的卷BPB数据确定卷布局,然后读取$MFT文件自己的文件记录,按记录中描述读取$Bitmap、$Root文件用于分配/释放簇及目录树访问。

分区结尾与备份主引导扇区

在NTFS卷,$Boot文件中的卷尺寸(BS_TotSec64)的值至少比分区表中的分区尺寸少一个扇区。这个扇区用来存放$Boot文件第一个扇区的副本,这个扇区一定位于NTFS卷的最后一个扇区的下一个扇区的位置。如果NTFS卷的头部数据被破坏可以通过这个扇区来恢复。

目录结构

在NTFS卷中,文件在目录中以B+树的形式排列,在目录中查找文件时按B+树的搜索方法先搜索根节点(从根目录开始),然后按要找的文件名与根节点中的子节点对应的文件名相比较以确定在哪个子节点对应的存储区中搜索,然后以子节点为当前的根节点再搜索,直到找到文件为止。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多