数据恢复

首页 数据恢复 数据修复 硬盘维修 数据 硬盘 恢复软件 硬盘数据恢复 恢复 文件 中心
 

探索NTFS

  NTFS是Windows NT引入的新型文件系统,它具有许多新特性。本文旨在探索NTFS的底层结构,所叙述的也仅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的数据均在一个叫$MFT的文件中,叫主文件表(Master File Table)。而$MFT则由文件记录(File Record)数组构成。File Record的大小一般是固定的,通常情况下均为1KB,这个概念相当于Linux中的inode。File Record在$MFT文件中物理上是连续的,且从0开始编号。$MFT仅供File System本身组织、架构文件系统使用,这在NTFS中称为元数据(Metadata)。以下列出Windows 2000 Release出的NTFS的元数据文件(我将要给出的示例代码的部分输出结果)。

  File Record(inode) FileName

  ------------------ --------

  0 $MFT

  1 $MFTMirr

  2 $LogFile

  3 $Volume

  4 $AttrDef

  5 .

  6 $Bitmap

  7 $Boot

  8 $BadClus

  9 $Secure

  10 $UpCase

  11 $Extend

 

  Windows 2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据文件。实际上File System Driver(ntfs.sys)维护了一个系统变量NtfsProtectSystemFiles用于隐藏这些元数据。默认情况下,这个变量被设为TRUE,所以使用dir /ah将得不到任何文件。知道这个行为后使用i386kd修改NtfsProtectSystemFiles后即可以列出元数据文件:

  kd> x ntfs!NtfsProtect*

  fe213498 Ntfs!NtfsProtectSystemFiles

  fe21349c Ntfs!NtfsProtectSystemAttributes

  kd> dd ntfs!NtfsProtectSystemFiles l 2

  fe213498 00000001 00000001

  kd> ed ntfs!NtfsProtectSystemFiles 0

  kd> dd ntfs!NtfsProtectSystemFiles l 2

  fe213498 00000000 00000001

  kd>

 

  D:\>ver

  Microsoft Windows 2000 [Version 5.00.2195]

 

  D:\>dir /ah $*

  驱动器 D 中的卷是 W2KNTFS

  卷的序列号是 E831-9D04

 

  D:\ 的目录

  2000-04-27 19:31 36,000 $AttrDef

  2000-04-27 19:31 0 $BadClus

  2000-04-27 19:31 67,336 $Bitmap

  2000-04-27 19:31 8,192 $Boot

  2000-04-27 19:31 <DIR> $Extend

  2000-04-27 19:31 13,139,968 $LogFile

  2000-04-27 19:31 27,575,296 $MFT

  2000-04-27 19:31 4,096 $MFTMirr

  2000-04-27 19:31 131,072 $UpCase

  2000-04-27 19:31 0 $Volume

  9 个文件 40,961,960 字节

  1 个目录 51,863,552 可用字节

 

  需要指出的是ntfs.sys将元数据文件以一种特殊的方式打开,所以在打开NtfsProtectSystemFiles后,如果使用ReadFile等产生IRP_MJ_READ等IRP包时将会导致Page Fault(详见Gary Nebbett的《Windows NT/2000 Native API Reference》)。

 

  以上的讨论均是基于$MFT文件而讨论的,即基于$MFT中的File Record(inode)讨论的。为更好的继续以下的讨论,这儿我列出File Record Header的结构:

  typedef struct {

  ULONG Type;

  USHORT UsaOffset;

  USHORT UsaCount;

  USN Usn;

  } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;

  typedef struct {

  NTFS_RECORD_HEADER Ntfs;

  USHORT SequenceNumber;

  USHORT LinkCount;

  USHORT AttributesOffset;

  USHORT Flags; // 0x0001 = InUse, 0x0002 = Directory

  ULONG BytesInUse;

  ULONG BytesAllocated;

  ULONGLONG BaseFileRecord;

  USHORT NextAttributeNumb

相关连接:

相关评论:

 

商务服务

中控系统

中控系统论坛

数据修复

中控

硬盘数据恢复

特别推荐

 

推荐广告

 

Copyright ©2003 - 2005 目录大全