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表示存储的数据
posted @ 2021-03-03 14:30  某某的昵称  阅读(586)  评论(0编辑  收藏  举报