FAT32 目录项分析 (转载)
标签:
杂谈 |
分类: C与C |
http://blog.csdn.net/yangsongqbs/article/details/7796921
在FAT32文件系统中,文件名分为两种——长文件名、短文件名。这两种文件名都是存储在目录入口中的(DIR_ENTRY简写DE)中的,不过具体的DE组织结构和数据结构有所不同。
1、
短文件名存储在短文件名入口(SHORT_DIR_ENTRY简写SDE)中,而且一个短文件名只需要一个SDE即可。
一个SDE大小为32字节,他的具体定义如下表:
|
名字 |
偏移 (字节) |
大小 (字节数) |
描述 |
|
mName |
0 |
11 |
短文件名(文件名和扩展名) |
|
mAttr |
11 |
1 |
文件属性: ATTR_READ_ONLY ATTR_HIDDEN
ATTR_SYSTEM
ATTR_VOLUME_ID
ATTR_DIRECTORY ATTR_ARCHIVE ATTR_LONG_NAME
高两位属性保留,且应该设置为0,文件创建后不应该修改这两个位 |
|
mNameCase |
12 |
1 |
这个是段文件名的大小标志: FNAME_LOWER_CASE FEXT_NAME_LOWER_CASE 也就是说如果文件名是小写的话01000,而如果扩展名是小写的话则设置10000,而如果文件名和扩展名都是小写的则11000(0x18)。(这个字节的含义只是我不完全统计的结果) |
|
mCrtTimeTenth |
13 |
1 |
{文件创建时间的毫秒部分,这是一个十分之一秒的数量,其有效值是0-199,我基本没有使用} |
|
mCrtTime |
14 |
2 |
文件创建的时间 |
|
mCrtDate |
16 |
2 |
文件创建的日期 |
|
mLstAccDate |
18 |
2 |
文件最后的访问日期 |
|
mFstClusHI |
20 |
2 |
这个文件起始簇号的高两个字节 |
|
mWrtTime |
22 |
2 |
文件最后写的时间,创建也可以说成是写 |
|
mWrtDate |
24 |
2 |
文件最后写的日期,创建也可以说成是写 |
|
mFstClusLO |
26 |
2 |
这个文件的起始簇号的低两个字节 |
|
mFileSize |
28 |
4 |
文件大小(字节数) |
在SDE的前11个字节包含了8个字节的文件名和3个字节扩展名(在磁盘上不显式在文件名和扩展名中间保存一个分割符”.”),也就是说短文件需要符合8.3规则。8.3规则具体如下
a、
b、
c、
d、
e、
f、
g、
h、
i、
mName还有如下情况
A、如果mName [0] == 0xE5,表示当前入口是已经删除了的。
B、 如果mName [0] == 0x00,表示当前入口没有使用过,在这以后也没有分配目录入口了,如果是遍历的话,到这里就可以结束了。
C、 如果mName [0] == 0x05,则实际文件名在这里的字符应该是0xE5。0xE5是 KANJI 引导字符。
D、前面说了mName实际分为两各部分8-字节文件名,和3-字节扩展名。如果文件名或扩展名字符数不够的话则以空格(0x20)填充。
E、 在mName中的英文字符都是以大写的形式存储。
以下是一个例子
“foo.bar”
“FOO.BAR”
“Foo.Bar”
“foo”
“foo.”
“PICKLE.A”
“prettybg.big”
“.big”
在这里好有一个需要注意的就是时间和日期格式。
时间(mCrtTime、mWrtTime)具体由两个字节(16位)表示,其精度为2秒(0是最低有效位,15是最高有效位)
0-4位:其有效值是0-29,表示两秒数量,表示实际的秒为0-58
5-10位:有效值是0-59,表示分钟
11-15位:有效值是0-23,表示小时
日期(mCrtDate、mLstAccDate、mWrtDate)具体由两个字节表示(16位),这是一个相对于 01/01/1980的一个日期(0是最低有效位,15是最高有效位)
0-4位:有效值是1-31,表示日
5-8位:有效值是1-12,表示月
9-15位:有效值0-127,相对于1980的年号(也就是说最大的年号是2107年)
2、
长文件名存储在长文件名入口(LONG_DIR_ENTRY简写LDE)中,通常一个长文件名的完整数据需要一个SDE和一系列的LDE组成,LDE逆序存放。
一个LDE大小为32字节,他的具体定义如下表:
|
名字 |
偏移 (字节) |
大小 (字节数) |
描述 |
|
mOrder |
0 |
1 |
这表示当前DE在LDE序列中的序号 如果这个值是和0x40相或的结果,则表示这是LDE序列中最后一个LDE了 |
|
mName1 |
1 |
10 |
LDE中的前1-5个字符,Unicode。 |
|
mAttr |
11 |
1 |
文件属性,只能是ATTR_LONG_NAME(0x0F) |
|
mNameCase |
12 |
1 |
在这里一直为0 |
|
mChksum |
13 |
1 |
校验和。这个值由于此对应的SDE的前11字节计算而得,具体计算等下再讲。 |
|
mName2 |
14 |
12 |
LDE中的前6-11个字符,Unicode。 |
|
mFstClusLO |
26 |
2 |
0 |
|
mName3 |
28 |
4 |
LDE中的前12-13个字符,Unicode。 |
在LDE中存储文件名的话,不会保存文件的其他信息,所以这里重要的数据就是三部分的名字,长文件名是以NUL结束的,其后是以0xFFFF补充的。
如文件名为“The quick brown.fox”的磁盘结构
http://my.csdn.net/uploads/201207/28/1343463753_3839.jpg目录项分析
http://my.csdn.net/uploads/201207/28/1343463787_9313.jpg目录项分析
长文件名的长度最大是255个字符,不包括NULL。长文件路径最大是260,包括NUL。有效字符集可以是短文件名中任何字符组合,也可以多次出现”.”。空格在长文件名中是可以的,但是在短文件名通常是不可以的,下面的几个字符在长文件名中时可以的
+
嵌入的空格是可以的,但是在开始和末尾的空格是不允许。
文件名开始和嵌入的点”.”也是可以的,但是末尾的点是不允许的。
长文件名存储在LDE中,而且不再以多字节字符形式,而是Unicode。
校验和的计算
关于FAT32目录入口(DE)的第0C(mNameCase)字节分析了一下。发现如下规律
纯短文件名则有如下规律:
综上:
http://my.csdn.net/uploads/201207/28/1343463723_4878.jpg目录项分析
长文件名不管是LDE还是与之对应的SDE中的0C字节都是0

加载中…