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号簇是被应用状态的;
其他的后续再做介绍!