U盘文件系统

 

优盘文件系统(FOR C)

优盘上的数据按照其不同的特点和作用大致可分为 5 部分:MBR 区、DBR 区、FAT 区、FDT
区和 DATA 区。
主引导记录(MBR)
 
绝对扇区号为:MBR_LBA=0x00000000 处是主引导记录,等同位于硬盘的 0 磁道 0 柱面 1 扇区。
在总共 512 字节的主引导扇区中,MBR 只占用了其中的 446 个字节(ofs:0 - ofs:1BDH),
另外的 64 个字节(ofs:1BEH - ofs:1FDH)交给了 DPT(Disk Partition Table 盘分区表),
最后两个字节"55 AA"(ofs:1FEH - ofs:1FFH)是分区的结束标志。
MBR 定义如下:
typedef struct {
uchar bootcode[446];
PartitionTable PT[4];
uint EndingFlag;
}MBR_tag;
//ofs:0.启动代码。"FA 33 C0 8E D0 BC¼".
//ofs:446.分区表 length=4*16.
//ofs:510.结束标识:0xAA55.
Bootcode[446]启动代码一般是固定的,用于引导 x86,不用管。
分区表项的定义如下:
typedef struct {
uchar BootFlag; //启动标志
CHS StartCHS; //分区开始的柱面、磁头、扇区
uchar SystemID; //分区类型
CHS EndCHS; //分区结束的柱面、磁头、扇区
ulong RelativeSectors; //分区起始扇区数,指分区相对于记录该分区的分区表的扇
区位置之差 (该分区表:LBA=0x0)。
ulong TotalSectors;//分区总扇区数
}PartitionTable;
其中 CHS 为一个柱面、磁头、扇区的结构,定义如下:
struct CHS {
uchar Head; //磁头。
unsigned Sector : 6; //扇区。
unsigned CyH2 : 2; //柱面(高两位)。
uchar CyL8; //柱面(低八位)。 
ulong Cylinder() {return (uint(CyH2)*256+CyL8);} //返回柱面值
void SetCylinder(uint Cylinder) //设置柱面值 {
CyH2=(Cylinder>>8)&0x3; CyL8=(Cylinder&0xff);
}
};
例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00
在这里我们可以看到:
z "80"是一个分区的激活标志,表示系统可引导;
z "01 01 00"表示分区开始的磁头号为 01,开始的扇区号为 01,开始的柱面号为 00;
z "0B"表示分区的系统类型是 FAT32,其他比较常用的有 04(FAT16)、06(bigFAT16)、
01(FAT12)、07(NTFS);
z "FE BF FC"表示分区结束的磁头号为 254,分区结束的扇区号为 63、分区结束的柱面
号为 764;
z "3F 00 00 00"表示首扇区的相对扇区号为 63;
z "7E 86 BB 00"表示总扇区数为 12289622。
系统引导记录(DBR)
 
绝对扇区号为:DBR_LBA=MBR.PT[0].RelativeSectors 处是 DBR,等同位于硬盘的 0 磁道 1
柱面 1 扇区(512 字节),是操作系统可以直接访问的第一个扇区,它包括一个引导程序和一
个被称为 BPB(Bios Parameter Block)的本分区参数记录表。引导程序的主要任务是当 MBR
将系统控制权交给它时,判断本分区跟目录前两个文件是不是操作系统的引导文件(以 DOS
为例,即是 Io.sys 和 Msdos.sys)。如果确定存在,就把其读入内存,并把控制权交给该文
件。BPB 参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根
目录大小、FAT 个数,分配单元的大小等重要参数。
 DBR 定义如下:
typedef struct {
uchar bJmpBoot[3];
char bOEMName[8];
uint BPB_wBytesPerSec;
uchar BPB_bSecPerClus;
uint BPB_wReservedSec;
uchar BPB_bNumFATs;
uint BPB_wRootEntry;
uint BPB_wTotalSec;
uchar BPB_bMedia;
uint BPB_wSecPerFAT;
uint BPB_wSecPerTrk;
uint BPB_wHeads;
ulong BPB_dHiddSec;
ulong BPB_dBigTotalSec;
uchar bDrvNum;
uchar bReserved1;
uchar bBootSig;
uchar bVolID[4];
char bVolLab[11];
char FileSysType[8];
//ofs:0.典型的如:0xEB,0x3E,0x90。
//ofs:3.典型的如:"MSWIN4.1"。
//ofs:11.每扇区字节数。
//ofs:13.每簇扇区数。
//ofs:14.保留扇区数,从 DBR 到 FAT 的扇区数。
//ofs:16.FAT 的个数。
//ofs:17.根目录项数。
//ofs:19.分区总扇区数(<32M 时用)。
//ofs:21.分区介质标识,优盘一般用 0xF8。
//ofs:22.每个 FAT 占的扇区数。
//ofs:24.每道扇区数。
//ofs:26.磁头数。
//ofs:28.隐藏扇区数,从 MBR 到 DBR 的扇区数。
//ofs:32.分区总扇区数(>=32M 时用)。
//ofs:36.软盘使用 0x00,硬盘使用 0x80。
//ofs:37.保留。
//ofs:38.扩展引导标记:0x29。
//ofs:39.盘序列号。
//ofs:43."Msdos
//ofs:54."FAT16
 
uchar ExecutableCode[448]; //ofs:62.引导代码。
uint EndingFlag;
}DBR_tag;
//ofs:510.结束标识:0xAA55。

 

 

 
本站域名:www.mrtlab.com | QQ交流群:250649022 | 使用条款 | 备案:鄂ICP备2020023514号
MRT数据恢复网,专业的硬盘固件维修与数据恢复技术资料提供站!
Copyright 2003-2020 Powered By MrtLab