本人40G的数据丢失,文件系统为NTFS,在Windows2000下快速格式化。
经分析,以前的$MFT的前几个File Record被新的$MFT改写,以前的文件基本上都在。
请教:
1:如何手动修改$MFT,改变$MFT的大小和包含的File Record的数量以及把以前的大量File Record有机的连接起来?2:File Record 的详细结构. NTFS是如何用File Record组织目录树的?如果第一中方案行不通(就我的水平而言),我可以自己写个程序,从$MFT 中遍历所有File Record读出其$DATA数据保存到其它盘.(多属性的文件在我的盘中基本上没有)
若有详细的NTFS的中文资料愿再加贴赠300分我五年的心血已付诸东流.
注:欢迎大家共同探讨NTFS,请不要提及数据恢复软件,谢谢.

解决方案 »

  1.   

    楼主,不是我打击你,我一个同事研究NTFS两年,就是遇上与你相似的问题无法进展。后来我们跟微软和Intel联系了,他们的答复是:商业机密,NTFS的详细格式不允许对外发布。所以……说实话遗憾的不止我同事和你两个人。
      

  2.   

    PS,我们还是微软的认证合作伙伴,Intel的战略合作伙伴。
      

  3.   

    linux-ntfs有详细资料,只怪我e文太差。
      

  4.   

    找到一个FILE Record的结构,大家给分析分析:
    Offset Size  Description 
    0x00 4   Magic number 'FILE' 
    0x04 2   Offset to the update sequence 
    0x06 2   Size in words of Update Sequence Number & Array (S) 
    0x08 8   $LogFile Sequence Number (LSN) 
    0x10 2   Sequence number 
    0x12 2   Hard link count 
    0x14 2   Offset to Update Sequence Array 
    0x16 2   Flags 
    0x18 4   Real size of the FILE record 
    0x1C 4   Allocated size of the FILE record 
    0x20 8   File reference to the base FILE record 
    0x28 2   Next Attribute Id 
    0x2A 2   Align to 4 byte boundary 
    0x2C 4   Number of this MFT Record 
         2   Update Sequence Number (a) 
        2S-2   Update Sequence Array (a)
    谁知道最后俩行是什么意思?以下是个Index Header,组成NTFS的目录结构,据说是个B+树
    Offset Size Description 
    0x00 8 MFT Reference of the file 
    0x08 2 Size of this index entry 
    0x0A 2 Offset to the filename 
    0x0C 2 Index Flags 
    0x0E 2 Padding (align to 8 bytes) 
    0x10 8 MFT File Reference of the parent 
    0x18 8 File creation time 
    0x20 8 Last modification time 
    0x28 8 Last modification time for FILE record 
    0x30 8 Last access time 
    0x38 8 Allocated size of file 
    0x40 8 Real size of file 
    0x48 8 File Flags 
    0x50 1 Length of filename (F) 
    0x51 1 Filename namespace 
    0x52 2F Filename 
    2F+0x52 P Padding (align to 8 bytes) 
    P+2F+0x52 8 VCN of index buffer with sub-nodes  
      

  5.   

    linux-ntfs提供的资料,有兴趣的同志可以研究研究。 不过是英文。
    http://unc.dl.sourceforge.net/sourceforge/linux-ntfs/ntfsdoc-0.5.zip
      

  6.   

    找到一个FILE Record的结构,大家给分析分析:
    Offset Size  Description 
    0x00 4   Magic number 'FILE' 
    0x04 2   Offset to the update sequence 
    0x06 2   Size in words of Update Sequence Number & Array (S) 
    0x08 8   $LogFile Sequence Number (LSN) 
    0x10 2   Sequence number 
    0x12 2   Hard link count 
    0x14 2   Offset to Update Sequence Array 
    0x16 2   Flags 
    0x18 4   Real size of the FILE record 
    0x1C 4   Allocated size of the FILE record 
    0x20 8   File reference to the base FILE record 
    0x28 2   Next Attribute Id 
    0x2A 2   Align to 4 byte boundary 
    0x2C 4   Number of this MFT Record 
         2   Update Sequence Number (a) 
        2S-2   Update Sequence Array (a)
    谁知道最后俩行是什么意思?以下是个Index Header,组成NTFS的目录结构,据说是个B+树
    Offset Size Description 
    0x00 8 MFT Reference of the file 
    0x08 2 Size of this index entry 
    0x0A 2 Offset to the filename 
    0x0C 2 Index Flags 
    0x0E 2 Padding (align to 8 bytes) 
    0x10 8 MFT File Reference of the parent 
    0x18 8 File creation time 
    0x20 8 Last modification time 
    0x28 8 Last modification time for FILE record 
    0x30 8 Last access time 
    0x38 8 Allocated size of file 
    0x40 8 Real size of file 
    0x48 8 File Flags 
    0x50 1 Length of filename (F) 
    0x51 1 Filename namespace 
    0x52 2F Filename 
    2F+0x52 P Padding (align to 8 bytes) 
    P+2F+0x52 8 VCN of index buffer with sub-nodes ====================================================================最后两行的意思是:Update Sequence Number:
    更新序列号,大小为2B,是为了保证该扇区是否正确,以扇区的最后两个字节与该值比较,如果一样,则说明该扇区是正确的,否则就是有问题。
    Update Sequence Array:
    更新序列数组,大小一般为2*2B=4B,如果该扇区正确,在解析的时候,则将该数组中的两个2B大小的数字依次复制到该File Record所在的两个扇区的最后两个字节。
      

  7.   

    另外0x28 2   Next Attribute Id 
    0x2A 2   Align to 4 byte boundary这只是在XP下有用,如在NT,或2000中,将会被
         2   Update Sequence Number (a) 
        2S-2   Update Sequence Array (a)
    所代替。本来可以多写点,但日期过了这么久,估计没什么人能看到。
      

  8.   

    可以用 DiskExplorer for NTFS 这个软件来恢复你的数据,可以直接操作硬盘扇区,同时可以解析磁盘分区表和 NTFS 文件系统,支持利用虚拟卷来恢复数据。
      

  9.   

    ufool多说点====================你想知道什么问题?对这感兴趣的,好像不多。前段时间倒是写了一个正常情况下NTFS解析的东东。现在没空暂时又放下了。如哪位有兴趣,我提供一点思路:
    1、程序必须可以正常读卷,可用CreateFile();
    2、遍历整个大概范围内的File Record,不要只遍历被格式化后的$MFT所指的大小,一般来说,File Record都是连续分布的。
    3、每个File Record是1024B,将其解析出来,感兴趣的内容为是否删除,是否为目录,文件名,父目录,Data Runs,其中Data Runs就是文件的内容。楼主所提供的文档里,都有详细的描述。
    4、这样,将每个属于文件的File Record生成一个文件,就可以了,由于只是对一些文件感兴趣,也就没有必要再去组建树了,那样挺麻烦的。有关讲述NTFS的书:WINDOWS 2000 SERVER技术内幕    (北京8小时送货) 
       Inside WINDOWS 2000 SERVER作者: [美]William Boswell     译者:杨洪涛 李博 
    市场价: ¥98.00 
    总站会员价:
         ¥73.50(4-5星会员)   ¥76.44(1-3星会员)   ¥78.40(普通会员) 
    出版社: 清华大学出版社     ISBN:7-302-04913-0
    出版日期:2001-09-01  丛书: 北京科海培训中心图书http://www.china-pub.com/computers/common/info.asp?id=4188 
    NTFS搞懂要比FAT,EXT2复杂多了,不过也是我见过最好,最有效率,最先进的文件系统。前段时间,看到有报道说reiserfs 4是最先进的,我没有研究过,不知哪位有这方面资料?
      

  10.   

    http://community.csdn.net/Expert/topic/3685/3685342.xml?temp=.5937158
      

  11.   

    谢谢 ufool
    可以再详细些吗
      

  12.   

    你的目的是恢复文件,所以$MFT倒不是必须恢复可以用ufool的方法,即在整个硬盘内查找“FILE”的记录,由于FILE记录内有该文件大小,每个存储块的起始簇号,以及每个存储块的长度,那么就可以恢复该文件
      

  13.   

    这里有关于NTFS的讨论,大家可以去看看。不过基本上还是基于那个文档层面上的。
      

  14.   

    不知道楼主真正的意图是什么,只想恢复数据用FinalData