MFT和USN
缩写
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