用心爱心专心1探索NTFSNTFS是WindowsNT引入的新型文件系统,它具有许多新特性。本文旨在探索NTFS的底层结构,所叙述的也仅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的数据均在一个叫$MFT的文件中,叫主文件表(MasterFileTable)。而$MFT则由文件记录(FileRecord)数组构成。FileRecord的大小一般是固定的,通常情况下均为1KB,这个概念相当于Linux中的inode。FileRecord在$MFT文件中物理上是连续的,且从0开始编号。$MFT仅供FileSystem本身组织、架构文件系统使用,这在NTFS中称为元数据(Metadata)。以下列出Windows2000Release出的NTFS的元数据文件(我将要给出的示例代码的部分输出结果)。FileRecord(inode)FileName--------------------------0$MFT1$MFTMirr2$LogFile3$Volume4$$Bitmap7$Boot8$BadClus9$Secure10$UpCase11$ExtendWindows2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据文件。实际上FileSystemDriver()维护了一个系统变量NtfsProtectSystemFiles用于隐藏这些元数据。默认情况下,这个变量被设为TRUE,所以使用dir/ah将得不到任何文件。知道这个行为后使用i386kd修改NtfsProtectSystemFiles后即可以列出元数据文件:kd>xntfs!NtfsProtect*fe213498Ntfs!tfs!NtfsProtectSystemAttributeskd>ddntfs!NtfsProtectSystemFilesl2fe2134980000000100000001kd>edntfs!NtfsProtectSystemFiles0kd>ddntfs!NtfsProtectSystemFilesl2fe2134980000000000000001kd>D:\>ver用心爱心专心2MicrosoftWindows2000[]D:\>dir/ah$*驱动器D中的卷是W2KNTFS卷的序列号是E831-9D04D:\的目录2000-04-2719:3136,000$AttrDef2000-04-2719:310$BadClus2000-04-2719:3167,336$Bitmap2000-04-2719:318,192$Boot2000-04-2719:31<DIR>$Extend2000-04-2719:3113,139,968$LogFile2000-04-2719:3127,575,296$MFT2000-04-2719:314,096$MFTMirr2000-04-2719:31131,072$UpCase2000-04-2719:310$Volume9个文件40,961,960字节1个目录51,863,,所以在打开NtfsProtectSystemFiles后,如果使用ReadFile等产生IRP_MJ_READ等IRP包时将会导致PageFault(详见GaryNebbett的《WindowsNT/2000NativeAPIReference》)。以上的讨论均是基于$MFT文件而讨论的,即基于$MFT中的FileRecord(inode)讨论的。为更好的继续以下的讨论,这儿我列出FileRecordHeader的结构:typedefstruct{ULONGType;USHORTUsaOffset;USHORTUsaCount;USNUsn;}NTFS_RECORD_HEADER,*PNTFS_RECORD_HEADER;typedefstruct{NTFS_RECORD_HEADERNtfs;USHORTSequenceNumber;USHORTLinkCount;USHORTAttributesOffset;USHORTFlags;//0x0001=InUs用心爱心专心3e,0x0002=DirectoryULONGBytesInUse;ULONGBytesAllocated;ULONGLONGBaseFileRecord;USHORTNextAttributeNumber;}FILE_RECORD_HEADER,*PFILE_RECORD_HEADER;下面我将讨论如何定位$MFT。稍微有点操作系统知识的人都会知道引导扇区(BootSector),其物理
高中信息技术教学论文 探索ntfs 来自淘豆网www.taodocs.com转载请标明出处.