1 概述
继续上一篇博文,格式化一个SD卡之后,现在加入一些目录和文件夹做测试,并分析该实例
2 文件目录项分析
在SD卡根目录下复制一个abc.txt的测试文件进入,文件中包含一些内容,如下图所示:
先找到根目录, 根据上一篇博文分析,知道根目录位于6336扇区,用winHex从新开发,得到数据如下:
在分析之前,先回顾一下用户目录项的基础知识
ExFAT文件系统中每个用户文件至少有三个目录项, 称为三个属性:
属性1: 目录项首字节的特征值为“85H”
描述文件的基本信息,修改日期等
属性2: 目录项首字节的特征值为“C0H”
属性2主要用来查找文件所在的簇, 大小等
属性3: 目录项首字节的特征值为“C1H”
描述文件名;
通过目录项查找,找到的红色框中的数据,即abc.txt文件的描述,分析如下(起始地址为0x3180D0):
属性1("85H"):
字节偏移 | 长度 | 字段名和定义 | 实际值(hex) |
0x00 | 1 | 表示目录类型 | 85H(表示用户文件目录项) |
0x01 | 1 | 附属目录项数 | 02 (包含两个目录项,一个目录项大小为32字节,即后续C0,C1) |
0x02 | 2 | 校验和 | 0BEB(计算方式参考) |
0x04 | 4 | 文件属性 | 20000000 (含义参考下表) |
0x08 | 4 | 文件创建时间 | 1D440151 |
0x0c | 4 | 文件最后修改时间 | 19440151 |
0x10 | 4 | 文件最后访问时间 | 1D440151 |
0x14 | 1 | 文件创建时间精确至10ms | B2 |
0x15~0x1F | 11 | 保留 |
(表7--5 属性具体含义)
二级制值 | 属性含义 | 二进制值 | 属性含义 |
00000000 | 读写 | 00001000 | 卷标 |
00000001 | 只读 | 00010000 | 子目录 |
00000010 | 隐藏 | 00100000 | 存档 |
00000100 | 系统 |
|
|
属性2("C0"):
字节偏移 | 字段长度(字节) | 内容及含义 | 实际值(Hex) |
0x00 | 1 | 目录项的类型(特征值为“C0H”) | C0 表示属性2 |
0x01 | 1 | 文件碎片标志 | 03 乜有碎片(注: 有碎片用01表示) |
0x02 | 1 | 保留 | |
0x03 | 1 | 文件名字符数N | 07文件名长度,用unicode 表示,每个字符占2字节 |
0x04 | 2 | 文件名Hash值 | 0028 |
0x06 | 2 | 保留 | |
0x08 | 8 | 文件大小1 | 0000000012 |
0x10 | 4 | 保留 | |
0x14 | 4 | 起始簇号 | 00000009 |
0x18 | 8 | 文件大小2 | 0000000012 |
属性3("C1"):
字节偏移 | 字段长度(字节) | 内容及含义 |
0x00 | 1 | 目录项的类型(特征值为“C1H”) |
0x01 | 1 | 保留 |
0x02 | 2N | 文件名 |
从第二个字段开始,全是文件名,长度请看属性2中长度字段;
这里有个问题,如果文件长度很长,会怎么样呢?
构造一个长文件名的空文件如下:
够长了吧! 刷新一下winhex
在最后一个红色区域,为了支持长文件名,可以发现,差异点在:
1 在属性1(85开头)中的附属目录项个数变成了05,
2 属性3(C1开头)的项一共有3个,用来保存文件名数据;
比较好奇的是,中间红色框,多了一共05开头的目录项??, 直接上结果:
“85H”、“”C0H、“C1H”改变为“05H”、“40H”、“41H”, 是删除的目录项标记;
可能是别的应用在这其间创建临时文件,后由删除了;
3 文件内容分析
根据上一章节,对目录项属性2的分析,可知道abc.txt文件内容所在簇为 00000009;
计算所在扇区=0x1800 + (9-2)* 64= 0x19C0 (2号簇起始扇区 + 偏移簇所占扇区)
偏移地址为: 0x19C0 * 512= 33 8000
是不是与文件写入的数据是一样的!!
然后,FAT表应该是什么样子呢?
找到FAT表,第9个簇项,
依旧是0,
但并不能说这些FAT项对应的簇就是空簇。这一点和FAT16、FAT32 是不一样的;
那簇位图文件是什么样子呢?
找到簇位图文件,
第一个字节为 FFH, 二进制为 1111 1111 , 对应数据区的8个簇,即2~9 这8个簇,说明9号簇是被应用状态的;
其他的后续再做介绍!