FAT文件系统 短文件名目录项
FAT数据区的位置
FAT数据区紧跟FAT表2之后,可以按下面的步骤计算:
1 . 从引导扇区的偏移0x0E~0x0F得到保留扇区数。
2 . 从0x10处得到FAT表的个数
3 . 从偏移0X24~0X27得到每个FAT表的大小
4 . 数据区起始扇区号 = 保留扇区数 + 每个FAT表的大小扇区数 * FAT表个数
由于0簇区和1簇区为保留,故这里得到的数据区起始扇区号也即2号簇的起始扇区号。
其它簇的的起始扇区号 = 2号簇的扇区号 + 每簇的扇区数(由引导扇区的偏移0x0D得到每簇的扇区数)* (目的簇号-2)
短文件名目录数据结构
短文件名是一个文件的文件名不起过8个字符,扩展名为3个字符。短文件名目录中存放的广播名为8.3命名方式。
字节偏移 | 字节数 | 定义 |
---|---|---|
0x0-0x7 | 8 | 文件名 |
0x8-0xA | 3 | 扩展名 |
0xB | 1 | 字节属性(二进制) 00000000(读写) 00000001(只读) 00000010(隐藏) 00000100(系统) 00001000(卷标) 00010000(子目录) 00100000(归档) |
0x0c | 1 | 系统保留 |
0x0d | 1 | 文件创建的时间-精确到十分之一秒 |
0xE-0xF | 2 | 文件创建的时间 |
0x10-0x11 | 2 | 文件创建日期 |
0x12~0x13 | 2 | 最后访问日期。 |
0x14~0x15 | 2 | 文件起始簇号的高两个字节。 |
0x16~0x17 | 2 | 文件最后修改的时间。 |
0x18~0x19 | 2 | 文件最后被修改时的日期。 |
0x1A~0x1B | 2 | 文件内容起始簇号的低两个字节 |
0x1C~0x1 | 2 | 文件内容大小字节数 |
0x0-0x7:文件名,如果该目录项正在使用中0x0位置的值为文件名或子目录名的第一个字符,如果该目录项未被使用0x0位置的值为0x00,如果该目录项曾经被使用过但是现在已经被删除则0x0位置的值为0xE5
0x8-0xA:扩展名
0xB:描述文件的属性,该字段在短文件中不可取值0x0F,如果设置为0x0F则标志是长文件
0xC:1字节,保留 (这个位默认为0,只有短文件名时才有用.当为0x00时为文件名全大写,当为0x08时为文件名全小写;0x10时扩展名全大写,0x00扩展名全小写;当为0x18时为文件名全小写,扩展名全大写)
0xD:文件创建的时间-精确到十分之一秒
0xE-0xF:文件创建的时间-时分秒,16bit 被划分为 3个部分
0~4bit 为秒,以 2秒为单位,有效值为 0~29,可以表示的时刻为 0~58
5~10bit 为分,有效值为 0~59
11~15bit 为时,有效值为 0~23
0x10-0x11:文件创建日期,16bit 也划分为三个部分
0~4bit 为日,有效值为 1~31
5~8bit 为月,有效值为 1~12
9~15bit 为年,有效值为 0~127,这是一个相对于 1980 年的年数值,也就是说该值加上 1980即为文件创建的日期值。
0x12~0x13:2 个字节,最后访问日期。
0x14~0x15:2 个字节,文件起始簇号的高两个字节。
0x16~0x17:2 个字节,文件最后修改的时间。
0x18~0x19:2 个字节,文件最后被修改时的日期。
0x1A~0x1B:文件内容起始簇号的低两个字节,与 0x14~0x15 字节处的高两个字节组成文件内容起始簇号。
0x1C~0x1F:文件内容大小字节数,只对文件有效,子目录的目录项此处全部设置为 0。
短文件名分析
我们将格式化的分区改名为FAT32TEST,
然后根据以上公式计算得出数据区簇2的扇区号为8192,数据内容为:
文件或目录名以32个字节为单位进行扩展的,即短文件名占32个字节,长文件名会占多个32字节。
使用winhex的FAT Directory Entry(Normal/short entry format)模版分析如下:
从外部复制一个小的文件,文件名为123.txt,如下:
文件的内容存在于3号簇的内容如下:
如果直接在该分区新建一下文本文件,并改名,会和实验数据不一致。这是因为在Windows中对一个文件进行重新命名时,将会为新文件名建立一个新的目录项,然后删除原文件名的目录项。