文档介绍:探索NTFS
NTFS是Windows NT引入的新型文件系统,它具有许多新特性。本文旨在探索NTFS的底 层结构,所叙述的也仅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的数据均在一个 □q$MFT的文件中,叫主文件表(Master File Table) o ]ffi$MFT则由文件记录(F订e Record) 数组构成。File Record的大小一般是固定的,通常情况下均为1KB,这个概念相当于Linu x中的inodeo File Record在$肝丁文件中物理上是连续的,且从0开始编号。$MFT仅供F ile System本身组织、架构文件系统使用,这在NTFS中称为元数据(Metadata) o以下列出 Windows 2000 Release出的NTFS的元数据文件(我将要给出的示例代码的部分输出结果)。
File Record(inode) FileName
0 $MFT
$MFTMirr
$LogFile
$Volume
$AttrDef
5
$Bitmap
$Boot
$BadClus
$Secure
$UpCase
$Extend
Windows 2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据 文件。实际上 File System Driver (ntfs. sys)维护了一个系统变量 NtfsProtectSystemF订 es用于隐藏这些元数据。默认情况下,这个变量被设为TRUE,所以使用dir /ah将得不到 任何文件。矢口道这个行为后使用i386kd修改NtfsProtectSystemFiles后即可以列出元数据 文件:
kd> x ntfs!NtfsProtect*
fe213498 Ntfs!NtfsProtectSystemF订es
fe21349c NtfsINtfsProtectSystemAttributes kd> dd ntfs!NtfsProtectSystemF订es 1 2 fe213498 00000001 00000001
kd> ed ntfs!NtfsProtectSystemF订es 0
kd> dd ntfs!Ntf sPr otect Sys terries 1 2 fe213498 00000000 00000001
kd>
D:\>ver
Microsoft Windows 2000 [Version 5. ]
D:\>dir /ah $*
驱动器D中的卷是W2KNTFS
卷的序列号是E831-9D04
D:\的目录
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
2000-04-27
19
31
36,000 $AttrDef
0 $BadClus
& 192 $Boot
<DIR> $Extend
13, 139,968 $LogFile
27,575,296 $MFT4,096 $MFTMirr
131,072 $UpCase0 $Volume
9个文件 40, 961, 960字节
1个目录 51, 863, 552可用字节
需要指出的是ntfs. sys将元数据文件以一种特殊的方式打开,所以在打开NtfsProtec tSystemF订es后,如果使用ReadFile等产生IRP_MJ_READ等IRP包时将会导致Page Faul t (详见 Gary Nebbett 的《Windows NT/2000 Native API Reference》)o
以上的讨论均是基于$MFT文件而讨论的,即基于$1\^丁中的F订e Record (inode)讨论的。 为更好的继续以下的讨论,这儿我列出F订e Record Header的结构:
typedef struet {
UL0NG Type;
USHORT UsaOffset;
USHORT UsaCount;
USN Usn;
} NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;
typedef struet {
NTFS_RECORD_HEADER Ntfs;
USHORT SequenceNumber;
USHORT LinkCount;
USHORT AttributesOffset