exFAT文件系统实例(二)

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号簇是被应用状态的;

其他的后续再做介绍!

猜你喜欢

转载自blog.csdn.net/wangzhiqin365/article/details/107725455