MFT和USN

本文档详细介绍了Windows NTFS文件系统的MFT(主文件表)和USN(更新序列号日志)。内容包括MFT的结构、属性类型定义、MFT条目属性、USN的作用及FCSTL_READ_USN_JOURNAL操作的使用,旨在帮助开发者理解MFT和USN在文件系统中的工作原理和应用。
摘要由CSDN通过智能技术生成

缩写

MFT : 主文件表(Master File Table)
USN : 更新序列号(Update Sequence Number)
NTFS : NT文件系统(NewTechnology File System)
VCN : 虚拟簇号(Virtual Cluster Number)
LCN : 逻辑簇号(Logical Cluster Number)

前言

最近在实现一个类似Everything的本地搜索引擎,用到MFT和USN那一套东西,网上搜索到的代码,基本能用,但是确不全面,丢失了很多文件,且很多数据的提取不正确,经过一旦时间的研究,写了此文档。

类型定义

下面定义的这些结构体或者宏,来源于MSDN, 和网上能搜索到ntfs.h的定义有很大的区别,但对应结构基本是一致的,因为部分定义和windows库的定义有冲突,最好是使用命名空间包含,或者重命名对应类型定义, 其它用到的结构体定义在winioctl.h中,这里不做累述。

属性类型定义

typedef enum _ATTRIBUTE_TYPE_CODE { //此定义来源于MSDN
        STANDARD_INFORMATION = 0x10,  //常驻第一个位置
        ATTRIBUTE_LIST = 0x20,      //如果有,则在第二个位置
        FILE_NAME = 0x30,          //文件名
        OBJECT_ID = 0x40,
        VOLUME_NAME = 0x60,
        VOLUME_INFORMATION = 0x70,
        DATA = 0x80,          //文件大小,目录没有该属性,文件一定有该属性
        INDEX_ROOT = 0x90,
        INDEX_ALLOCATION = 0xA0,
        BITMAP = 0xB0,
        REPARSE_POINT = 0xC0,
        ATTRIBUTE_END = 0xFFFFFFFF
}ATTRIBUTE_TYPE_CODE;

MFT条目索引

typedef struct _MFT_SEGMENT_REFERENCE {
    union
    {
        struct
        {
            ULONGLONG SegmentNumber;
        };
        struct
        {
            ULONG  SegmentNumberLowPart;        //MFT条目下标
            USHORT SegmentNumberHighPart;       //没有用,都是0.
            USHORT SequenceNumber;              //本条目复用次数,也没啥用
        };
    };
} MFT_SEGMENT_REFERENCE, * PMFT_SEGMENT_REFERENCE;
typedef MFT_SEGMENT_REFERENCE FILE_REFERENCE, * PFILE_REFERENCE;

MFT条目头

typedef struct _MULTI_SECTOR_HEADER { 
        UCHAR  Signature[4]; 
        USHORT UpdateSequenceArrayOffset;
        USHORT UpdateSequenceArraySize;
} MULTI_SECTOR_HEADER, * PMULTI_SECTOR_HEADER;

typedef struct _FILE_RECORD_SEGMENT_HEADER {
        MULTI_SECTOR_HEADER   MultiSectorHeader;
        ULONGLONG             Reserved1;
        USHORT                SequenceNumber;
        USHORT                Reserved2;
        USHORT                FirstAttributeOffset;
        USHORT                Flags;
        ULONG                 Reserved3[2];
        FILE_REFERENCE        BaseFileRecordSegment;
        USHORT                Reserved4;
        //UPDATE_SEQUENCE_ARRAY UpdateSequenceArray; 
} FILE_RECORD_SEGMENT_HEADER, * PFILE_RECORD_SEGMENT_HEADER;

typedef FILE_RECORD_SEGMENT_HEADER FILE_RECORD_HEADER, * PFILE_RECORD_HEADER;

属性头

typedef struct _ATTRIBUTE_RECORD_HEADER {
        ATTRIBUTE_TYPE_CODE TypeCode;
        ULONG               RecordLength; 
        UCHAR               FormCode;  
        UCHAR               NameLength;
        USHORT              NameOffset;
        USHORT              Flags;	//0x00 常驻 0x01 非常驻

        USHORT              Instance;
        union {
                struct {  //常驻属性, 值在偏移ValueOffset处
                        ULONG  ValueLength;	
                        USHORT ValueOffset;
                        UCHAR  Reserved[2];
                } Resident;
                struct {  //非常驻属性,值在簇外
                        VCN      LowestVcn;
                        VCN      HighestVcn;
                        USHORT   MappingPairsOffset;
                        UCHAR    Reserved[6];
                        LONGLONG AllocatedLength;
                        LONGLONG FileSize;
                        LONGLONG ValidDataLength;
                        LONGLONG TotalAllocated;
                } Nonresident;
        } Form;
} ATTRIBUTE_RECORD_HEADER, * PATTRIBUTE_RECORD_HEADER;

FILE_NAME值内容

typedef struct _FILE_NAME_ATT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值