NTFS 结构说明

本文详细介绍了NTFS文件系统的结构,包括$MFT、$MFTMirr、$LogFile等关键系统文件的作用和信息。NTFS通过将所有信息组织成文件形式,改善了FAT/FAT32的不足,提供了更好的安全性。文章还讨论了读写操作流程、分区尺寸改变的操作以及目录项存储区格式等,并给出了MFT记录头、属性记录头的格式说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



NTFS 结构说明

NTFS 结构说明

关键字:Windows NT NTFS 文件系统 MFT

在Windows NT?中,Microsoft使用了一种新型的文件系统NTFS,它针对FAT/FAT32文件系统安全性差、容易产生碎片、难以恢复等缺点作了重大改进,使得系统总能保持较好的性能。不过使用NTFS的分区只能被Windows NT?系统识别和操作,而且它的结构是Microsoft的内部机密,没有任何官方文档。因此给各位需要在非Windows NT?环境读写NTFS分区的编程人员带来了巨大不便。不过好在还有很多人在研究分析它,现在结合网上搞到的一些资料和我自己的分析对NTFS作一个说明(可惜还是有很多东西没能搞明白)。

一、 概述

在NTFS中一改FAT/FAT32中将文件分配表等系统数据放在分区最前面,然后接着才是数据区的做法,把所有的信息都组织起来以文件的形式存放,包括扇区分配表,引导记录等数据都是作为文件存在于磁盘中。其中只有$Boot(分区引导记录)文件的位置是固定存放在分区首部,其他的文件都可以随意存在于分区中的任何一个位置。这样使得对所有数据的读写都有一个较为统一的方法,而且使得改变分区的尺寸和碎片整理变得非常容易。

在NTFS分区中,存储分区信息的文件被称为系统文件。在每个NTFS分区中都有十个这样的系统文件,它们分别是:

$MFT

$MFTMirr

$LogFile

$Volume

$AttrDef

. (分区根目录)

$Bitmap

$Boot

$BadClus

$Secure

$UpCase

$Extend

下面分别对每个系统文件的作用及所保存的信息作一个说明:

$MFT(Master File Table)文件。这个文件是NTFS分区中最重要的文件,它记录了分区中所有文件(包括$MFT自身)的基本信息。通过$MFT就可以访问分区中的所有文件和系统数据。$MFT由多个MFT记录单元组成,每一个文件的描述占用一到多个(一个不够的情况下)$MFT记录单元。其中前十二个记录单元中记录着上面的十二个系统文件的信息。每个记录单元记录着文件的建立时间、在分区中的位置、长度、属性、文件名等信息。信息在MFT单元中用各种属性来表示,不同的属性代表着不同的信息,而文件或目录中的内容则表现为属性中的外部或内部(取决于数据的长度)附加数据。其记录格式见下面的MFT格式说明。

$MFTMirr(Mirror of Master File Table) 文件。这个文件是$MFT文件的一个备份,它保存着$MFT文件前4个记录单元的信息。格式同$MFT。

$LogFile文件。记录中对分区的操作的日志信息。(日志记录具体格式不明)

$Volume文件。保存着分区建立时间,分区版本等信息。

$AttrDef文件。记录的MFT单元中的属性的基本信息,包括属性的名字,最大最小尺寸等

. (分区根目录)文件。作用同FAT/FAT32中的根目录,但记录格式有所变化。关于记录格式的描述请参考目录项存储区格式。

$Bitmap文件。记录着分区中存储单元(簇)使用状况。类似于FAT/FAT32中的FAT表,但不以索引的形式记录,而是每一个Bit表示一个簇。其值为1表示该簇已被使用,为0则表示空闲。

$Boot文件。NTFS分区的引导记录。在NTFS分区引导系统时负责将NTLDR装入内存并将控制权交给它。其中记录着分区的总扇区数,分区中每个存储单元(簇)包含的扇区数,$MFT所在的簇的簇号,$MFTMirr所在的簇的簇号和分区引导例程等重要信息。其格式见后面的$Boot文件格式说明。注意:在NTFS分区中$Boot文件的位置固定在分区开始处。

$BadClus文件。似乎是记录着分区中有效(可以正常使用)的簇的个数和分区有效容量(以字节为单位)。因为我手里没有有坏道的硬盘,所以不敢肯定。

$Secure文件。就其名而言似乎是系统安全描述,不过没有研究过。

$UpCase文件。Unicode编码下的大写字母表。

$Extend文件。用于和HPFS兼容的信息。

二、 读写操作流程

在非NT的系统中对NTFS分区中的文件进行自由的读写操作才是我们研究NTFS分区格式的最终目标。下面我就对整个读操作的流程来一个说明:

首先从硬盘的分区表中计算出分区开始的位置,再读取分区数据区中的第一个扇区($Boot文件的第一个扇区)从中取得隐藏扇区数目,$MFT开始的簇号,每簇扇区数,每个MFT记录的尺寸。通过这些数据计算出$MFT所在的位置,读取第一个MFT记录,然后按照记录中描述的$MFT文件的存放位置读出文件名为“.”的MFT记录(根目录文件)。然后在该记录中搜索要求的目录项。找到以后,获得它的描述在$MFT中的索引,再在其中寻找下级目录的索引……直到找到为止。

三、 改变分区尺寸操作流程

NTFS分区的尺寸只与四个记录有关:

1、$Boot文件的第一个扇区中的分区扇区数。

2、分区最后一个扇区中的$Boot文件第一扇区的备份。

3、系统文件$Bitmap的尺寸。

4、系统文件$BadClus中的有效簇描述。

因此修改NTFS分区的尺寸就比修改FAT/FAT32分区的尺寸要容易得多。只需要改变前两处的分区扇区数,再调整$Bitmap文件的尺寸即可。因为前两处的修改十分容易,这里就只讲解一下如何修改后两处。

首先在$MFT文件中找到分区根目录的位置,读取根目录记录,从中找到$Bitmap文件所在的项,修改其占用的存储器空间和实际尺寸并保存。然后按照该项的描述读出$MFT中描述$Bitmap文件的记录,修改其文件属性中的VCN结束段的索引号、占用空间数、数据尺寸、有效数据尺寸并适当地增/减$Bitmap文件的数据流描述,如需要的话还要调整它的$Ddata属性的尺寸。再修改$Bitmap文件的内容以标志出文件中新添/缩减的簇。

其次是修改$BadClus文件中第二个$Data属性中的VCN结束段索引、占用空间数、数据尺寸、有效数据尺寸及数据流描述。但要注意!在$BadClus文件中记录的是整个分区中没有问题的簇数及其描述,与$Bitmap文件中修改的值不同。

然后……天下太平了。

记录格式说明

一、MFT记录头

偏移地址
占用字节数
描述
0H
4
MFT 记录标志,ASCII字符串:“FILE”
4H
2
修正值的偏移地址(关于修正值请参考修正值技术)
6H
2
修正值个数+1 S
8H
2
日志文件序列号LSN
10H
2
序列号
12H
2
链接计数
14H
2
属性数据的偏移地址
16H
2
数据标志,Bit0为1表示有外部数据,Bit1为1表示当前记录是一个目录项
18H
4
本MFT记录用到的存储空间(包括记录头和数据)
1CH
4
本MFT记录占用的存储空间
20H
8
如果本MFT记录是从MFT记录,则存放主MFT记录在$MFT中的位置,否则为0
28H
2
一个自由属性的ID
2AH
S*2
修正值表

二、属性记录头

偏移地址
占用字节数
描述
0H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值