根目录区的开始扇区号是19,它是由若干个目录条目(Directory Entry)组成,条目最多有BPB_RootEntCnt个,由于根目录区的大小是依赖于BPB_RootEntCnt的,所以长度不固定。
在本FAT12中,因为BPB_RootEntCnt=0xE0=14*16+0=244,即条目最多为244个,又因为每个条目占用32个字节,故244*32/512=14,即该根目录区占14个扇区,即19—32。
根目录区中的每个条目占用32字节,它的格式如下图:
这里主要定义了文件的名字,属性,最后写入的时间和日期,文件的开始簇数以及文件大小。
下面我们通过实例来认识这些内容,
1、 首先创建一个虚拟软盘,在这里我们使用WinImage,具体下载地址在我的下载资源中。
打开WinImage:
选择文件—》新建
新建一个虚拟软盘之后,需要向里面添加文件,我们需要提前写好下面几个文件
RIVER.TXT,内容为riverriverriver
FLOWER.TXT,内容为flowerflower………flower,至少要100个flower,使得数据空间大于512个字节,这样该文件将占用两个连续的扇区。
TREE.TXT,内容为treetreetree
再添加一个HOUSE目录,然后在目录\HOUSE下添加两个文本文件:
CAT.TXT,内容为catcatcat
DOG.TXT,内容为dogdogdog
选择映像—》加入,依次加入RIVER.TXT,FLOWER.TXT,TREE.TXT三个文件
映像—》创建文件夹 HOUSE
添加HOUSE目录
双击house,进入house的文件夹内,然后添加CAT.TXT,DOG.TXT两个文件
添加文件完成,然后保存,其中注意事项,保存类型为:虚拟软盘映像(*.vfd),我不知道这个类型与IMG有什么区别,但是我知道这个类型得到的结果是对的。呵呵!文件名为FLOOPY,这样我们就创建了一个虚拟软盘FLOOPY.vfd
然后使用UltraEdit打开FLOOPY.vfd,由于根目录区是从第19扇区开始的,每个扇区512个字节,所以其第一个字节位于偏移19*512=9278=0x2600处,好的,现在就让我们去定位到0x2600处看看到底Directory Entry为何物?
RIVER.TXT的各项值:
在这里,我们只需要关心RIVER.TXT的DIR_FstClus,即文件的开始簇号,由于本FAT12中的BPB_SecPerClus=1,故一个簇为一个扇区,DIR_FstClus=2,意味着该文件的在数据区的起始扇区号为2。在这里需要注意的是,数据区的第一个簇的簇号是2,而不是0或者1,故该文件的数据开始于数据区的第一个簇,也就是第一个扇区。
那么数据区的第一个扇区在哪里呢?
首先计算根目录区所占有的扇区数:
RootDirSectors =((BPB_RootEntCnt*32)+(BPB_BytsPerSec-1))/BPB_BytsPerSec。
之所以分子要加上(BPB_BytsPerSec-1),是为了保证此公式在根目录区无法填满整数扇区时仍然成立。
在本例中,因为BPB_RootEntCnt=224,计算得到根目录区所占有的扇区为14个。所以
数据区开始的扇区号=根目录区开始的扇区号+14=19+14=33。
现在就让我们跳入到第33扇区的偏移量是512*33=16896=0x00004200,让我们看看这里的内容:
果然是riverriverriver。
4、FAT表