FAT32有效数据识别--FATTable解析
总览
在FAT32中,扇区是否使用信息存储在 FATTable 中,通过解析FATTable即可知道哪些扇区已经被使用。
具体解析的步骤如下:
1. 解析FAT32文件系统头
2. 获取FATTable的位置及大小
3. 根据FATTable计算有效数据位置
1. 解析FAT32文件系统头
1. FAT文件系统所在分区的第一个扇区存储文件系统的基本信息,也就是文件系统的头
2. 大小为一个扇区,也就是512个字节,以 0x55AA 结束
以下为FAT32文件系统头部数据结构体
typedef struct {
UINT8 jmpBoot[3]; // EB 58 90
UINT8 OemName[8]; // MSWIN4.1
UINT16 BytesPerSec; // 每扇区字节数
UINT8 SecPerClus; // 每簇扇区数
UINT16 ReservedSecCnt; // 保留的扇区数,典型值 32
UINT8 FatsCnt; // fat 表数量,通常为 2
UINT16 rootEntCnt; // 根目录项数,fat32文件系统必须设置为 0
UINT16 totSet16; // fat32 必须为 0
UINT8 media; // 存储类型,0xF8表示可移动存储介质
UINT16 fatSecCnt16; // fat32 必须为 0
UINT16 secPerTrk; // 每磁道扇区数,参考值 0
UINT16 numHeads; // 磁头数,参考值 9
UINT32 hiddSec; // 隐藏扇区数,没有的话设置为 0
UINT32 totSec32; // 总扇区数
UINT32 FatSecCnt32; // 一个 fat 表所占的扇区数
UINT16 extFlags; // 0
UINT16 fsver; // 0
UINT32 rootClus; // 根目录所在的簇号,通常为 2
UINT16 FsInfo; // 1 FS Info所在扇区号
UINT16 bkBootSec; // 6
UINT8 reserved[12];
UINT8 drvType; // 0x00:软盘 0x80:硬盘
UINT8 reserved1; // 0
UINT8 bootSig; // 0x29
UINT32 volID;
UINT8 fileSysName[11]; // "NO NAME "
UINT8 FileSysType[8]; // "FAT32 "
UINT8 BootCode[420]; // 引导代码
UINT16 EndFlag; // 55 AA
} FAT32_DBR;
通过WinHex模板可以查看具体的数据
2. 获取FATTable的位置及大小
FATTable数据存储的起始位置位于保留扇区后。
需要获取FATTable的位置,首先来看下分区数据的存储结构:
通过解析头部数据可以得到如下信息:
1. 保留扇区大小 : ReservedSecCnt = 6206
2. FATTable大小 : FatSecCnt32 = 993
3. FATTable数量 : FatsCnt = 2
4. 扇区大小 : BytesPerSec = 512
通过计算可得:
FATTable起始地址 = 保留扇区数 * 扇区大小 = 6206 * 512 = 3177472字节
FATTable大小 = FATTable大小 * 扇区大小 = 993 * 512 = 508416字节
跳转至偏移地址查看数据:
0号表项值总是“F8FFFF0F”
1号表项可能被用于记录脏标志
3. 根据FATTable计算有效数据位置
1. 磁盘数据读取的基本单位为1个扇区,通常为512字节
2. FAT32文件系统通过簇来管理,一个簇中包含多个扇区
3. FATTable中的表项表示对应簇是否存在数据
4. FAT32文件系统中FATTable表项大小为32个字节,FAT16文件系统表项大小为16个字节
结论
1. FAT32文件系统的保留扇区数据为有效数据
2. 从FATTable的2号表项开始记录簇的数据有效性,0表示没有存储数据,非0表示存储的数据