FAT32中文版分析+补充(2)
阅读原文时间:2023年07月16日阅读:1

从Offset 36(0x24)开始FAT12/16的内容开始区别于FAT32,现在分两个表格列出来,下表为FAT12/16的内容:

名称

Offset(Byte)

大小(Byte)

描述

BS_drvNum

36(0x24)

1

用于BIOS中断0x13得到磁盘驱动器参数,(0x00为软盘,0x80为硬盘)。
NOTE:此域的值实际上由操作系统来决定。

BS_Reserved1(壹)

37(0x25)

1

保留(供NT使用),格式化FAT卷时必须把此域设置为0。

BS_BootSig

38(0x26)

1

扩展引导标记(0x29),用于指明此后的三个域可用。

BS_VolID

39(0x27)

4

卷标序列号,此域以BS_VolLab一起,可用用来检测磁盘是否正确,FAT文件系统可用用此判断连接的可移动磁盘是否正确,此域往往是由时间和日期组成的一个32位值。

BS_VolLab

43(0x2B)

11

磁盘卷标,此域的值必须与根目录中11字节长的卷标一致。
NOTE:FAT文件系统必须保证在根目录的卷标文件更改或是创建的同时,此域的内容能得到及时的更新,当FAT卷没有卷标时,此域的内容为“NO NAME”。

BS_FileSysType

54(0x36)

8

以下的几种之一:“FAT12”、“FAT16”、“FAT32”。
NOTE:不少人错误认为FAT文件系统的类型由此域来确定,仔细点你就能发现此域并不是BPB的一部分,只是一个字符串而已,Microsoft的操作系统并不使用此域来确定FAT文件的类型,因为它常常被写错,或是根本不存在,后面将讨论如何来检测一个FAT文件系统的类型,但不管如何,建议您在此域填写正确信息,因为一些非Microsoft的操作系统会检测此域。

下标为FAT32的内容:

名称

Offset(Byte)

大小(Byte)

描述

BPB_FATSz32

36(0x24)

4

一个FAT表所占的扇区数,此域为FAT32特有,同时BPB_FATSz16必须为0。

BPB_ExtFlags

40(0x28)

2

此域FAT32特有。 Bits 0~3:不小于0的活动FAT(active FAT)数目,只有在镜像              (mirroring)禁止时才有效。 Bits 4~6:保留; Bits 7:——0  表示FAT实时镜像到所有的FAT表中;             ——1  表示只有一个活动的FAT表,这个表就是Bits 0~3                        所指定的那个。 Bits 8~15:保留。

BPB_FSVer

42(0x2A)

2

此域FAT32特有。高位为FAT32的主版本号,低位为次版本号,这个版本号是为了以后更高级的FAT版本考虑,假设当前的操作系统所能支持的FAT32版本号为0:0。那么该操作系统检测到此域不为0时,它便会忽略这个FAT卷,因为它的版本号比系统能支持的版本要高。

BPB_RootClus

44(0x2C)

4

此域FAT32特有。根目录所在第一个簇的簇号,通常该数值为2,担不是必须为2。
NOTE:磁盘工具在改变根目录位置时,必须想办法让磁盘上的第一个非坏簇作为根目录的第一个簇(比如第2簇,除非它已经被标记为坏簇),这样的话,如果此域正好为0的话,磁盘检测工具也能很轻松地找到根目录所在簇的位置。

BPB_FSInfo

48(0x30)

2

此域FAT32特有。保留区中FAT32卷FSINFO结构所占的扇区数,通常为1。
NOTE:在Backup Boot中会有一个FSINFO的备份,但该备份只是更新其中的指针,也就是说无论是主引导记录,还是备份引导记录都是指向同一个FSINFO结构。

BPB_BkBootSec

50(0x32)

2

此域FAT32特有。如果不为0,表示在保留区中引导记录的备份数据所占的扇区数,通常为6。同时不建议使用6以外的其他数值。

BPB_Reserved

52(0x34)

12

此域FAT32特有。用于以后的FAT扩展使用,对于FAT32,此域用0填充。

BS_DrvNum

64(0x40)

1

与FAT12/FAT16的定义相同,只不过两者位于启动扇区不同位置而已。

BS_Reserved1

65(0x41)

1

与FAT12/FAT16的定义相同,只不过两者位于启动扇区不同位置而已。

BS_BootSig

66(0x42)

1

与FAT12/FAT16的定义相同,只不过两者位于启动扇区不同位置而已。

BS_VolID

67(0x43)

4

与FAT12/FAT16的定义相同,只不过两者位于启动扇区不同位置而已。

BS_FileSysType

71(0x47)

11

与FAT12/FAT16的定义相同,只不过两者位于启动扇区不同位置而已。

BS_FileSysType

82(0x52)

8

通常设置为“FAT32”,请参照FAT12/FAT16部分关于此域的陈述,该域的内容和FAT类型的判定无关。

关于FAT的启动扇区还有一点重要的说明:我们假设里面的内容是按照字节排序的,那么扇区[510]的内容一定是0x55,扇区[511]的内容一定是0xAA。

**NOTE:很多FAT的资料文档会错误地把0xAA55说成是“启动扇区最后两字节的内容”,这样的陈述是正确的,如果,仅仅是如果——BPB_BytesPerSec的值为512的话。若是BPB_BytesPerSec的值大于512,该标记的位置并没有变(虽然在启动扇区的最后两个字节写上0xAA55完全没有问题)。
**     关于BPB_TotSec16/32这里再作一点补充:假设现在我们有一块磁盘或者一个分区,其扇区数为DskSz,如果BPB_aTotSec(BPB_TotSec16或是BPB_TotSec32其中不为0的那个)的值小于或等于DskSz并不会使该FAT卷在使用中出现什么错误,实际上,BPB_TotSec16/32的值不要比DskSz小得离谱就不会有什么错误。
     这样做将造成磁盘空间的浪费,程序本身并不会认为该FAT卷存在什么错误。但是,如果BPB_TotSec16/32的值比DskSz大的话将会使FAT卷遭受严重的损坏。因为它超出了存储介质或是磁盘分区的边界。当BPB_TotSec16/32的值比DskSz大时,一些数据将不幸地被丢失。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章