资料很多,但是想要真正搞清楚,还是得东拼西凑。。(毕竟没有官方公开的文档,NT4的那个结构都不全,害得我走了好多弯路,最后还是耐着性子看linux的码)
最近太迷糊,花在计算机的时间上不多。。
真正开始看ntfs的时候才发现它比想象中复杂得多(比起来fat设计的就有点太简单了。。)
网络上的资料已经描述的不少了,不想再废话,什么时候忘了就翻出来看看,自己描述起来估计没有个千八的字搞不定。
目前只搞成了解析,别的还要再看,不太像在这块花太多时间(比如创建文件什么的),网络上有不少以实现完全脱离ntfs.sys操作文件为目的开源项目:
http://code.google.com/p/ntfs-cmd/ programmeboy制造。。国产。。勤劳啊。。
http://code.google.com/p/phlcker/ FileSeek 源码 小日本的。。没用过。。貌似挺成熟。。
ROS 0.3.11 实现的还太少,主要就是看看对Run的处理,连目录都没实现
ntfs for linux 这个可以看看对目录的处理
ntfs-3g 书写风格就把我弄晕了。。。
简单概述下:MFT是磁盘中的“文件记录块”的大数组,保存了所有文件的信息,文件记录块是文件一组属性的集合(包括 文件名 文件数据 索引目录等),文件属性分为常驻(在记录块里),和非常驻(在另外的簇里)两种。目录是特殊的文件,以b+ tree组织,文件名是key,查询快。
ntfs里有几点乍一看没明白,记录下。
VCN----LCN
数据分块,以虚拟簇号来记录每段文件的顺序,通过非常驻属性的Form.Nonresident.MappingPairsOffset 来得到一个Run,通过转换得到vcn到lcn的映射,从而可以将不同块连接起来。
INDEX
b+ tree
举例File4和File8是存储于INDEX_ROOT的目录索引项(INDEX_ENTRY),并且被设置INDEX_ENTRY_NODE标志,证明是两个节点,文件名介于4和8的文件名被放置于一个非常驻的INDEX_ALLOCATION中,从文件属性中可以定位INDEX_ALLOCATION,节点INDEX_ENTRY的最后8字节表示其VCN,这样搜索起来才会快。。
NT4中定义了一个宏来得到VCN
#define NtfsIndexEntryBlock(IE) ( \
*(PLONGLONG)((PCHAR)(IE) + (ULONG)(IE)->Length - sizeof(LONGLONG)) \
)
如图解析根目录,code挺简单挺丢人就不放了。。或者等把想搞的都搞明白了放个全的。。
预计明天写点人话。。先睡了。。
最近太迷糊,花在计算机的时间上不多。。
真正开始看ntfs的时候才发现它比想象中复杂得多(比起来fat设计的就有点太简单了。。)
网络上的资料已经描述的不少了,不想再废话,什么时候忘了就翻出来看看,自己描述起来估计没有个千八的字搞不定。
目前只搞成了解析,别的还要再看,不太像在这块花太多时间(比如创建文件什么的),网络上有不少以实现完全脱离ntfs.sys操作文件为目的开源项目:
http://code.google.com/p/ntfs-cmd/ programmeboy制造。。国产。。勤劳啊。。
http://code.google.com/p/phlcker/ FileSeek 源码 小日本的。。没用过。。貌似挺成熟。。
ROS 0.3.11 实现的还太少,主要就是看看对Run的处理,连目录都没实现
ntfs for linux 这个可以看看对目录的处理
ntfs-3g 书写风格就把我弄晕了。。。
简单概述下:MFT是磁盘中的“文件记录块”的大数组,保存了所有文件的信息,文件记录块是文件一组属性的集合(包括 文件名 文件数据 索引目录等),文件属性分为常驻(在记录块里),和非常驻(在另外的簇里)两种。目录是特殊的文件,以b+ tree组织,文件名是key,查询快。
ntfs里有几点乍一看没明白,记录下。
VCN----LCN
数据分块,以虚拟簇号来记录每段文件的顺序,通过非常驻属性的Form.Nonresident.MappingPairsOffset 来得到一个Run,通过转换得到vcn到lcn的映射,从而可以将不同块连接起来。
INDEX
b+ tree
举例File4和File8是存储于INDEX_ROOT的目录索引项(INDEX_ENTRY),并且被设置INDEX_ENTRY_NODE标志,证明是两个节点,文件名介于4和8的文件名被放置于一个非常驻的INDEX_ALLOCATION中,从文件属性中可以定位INDEX_ALLOCATION,节点INDEX_ENTRY的最后8字节表示其VCN,这样搜索起来才会快。。
NT4中定义了一个宏来得到VCN
#define NtfsIndexEntryBlock(IE) ( \
*(PLONGLONG)((PCHAR)(IE) + (ULONG)(IE)->Length - sizeof(LONGLONG)) \
)
如图解析根目录,code挺简单挺丢人就不放了。。或者等把想搞的都搞明白了放个全的。。
预计明天写点人话。。先睡了。。