不论是MBR还是GPT,都可以通过startingLBA找到partition逻辑位置,每个partition会格式化为当前OS可识别的文件系统,如FAT32,NTFS;分区第一个扇区结构为BPB (BIOS Parameter Block),其数据结构大概如下,都以0xaa55为结尾符;一般找到分区就能BPB判断分区文件格式。
typedef struct
{
UINT8 jmp[3]; // 0
CHAR8 OEMName[8]; // 3
UINT16 BytsPerSec; // 11
UINT8 SecPerClus; // 13
UINT16 RsvdSecCnt; // 14
UINT8 NumFATs; // 16
UINT16 RootEntCnt; // 17
UINT16 TotSec16; // 19
UINT8 Media; // 21
UINT16 FATSz16; // 22
UINT16 SecPerTrk; // 24
UINT16 NumHeads; // 26
UINT32 HiddSec; // 28
UINT32 TotSec32; // 32
union
{
struct
{
UINT8 Padding[510 - 36];
} Fat16;
struct
{
UINT32 FATSz32; // 36
UINT8 Padding1[4]; // 40
UINT32 RootClus; // 44
UINT8 Padding2[510 - 48];
} Fat32;
struct
{
UINT32 FATSz32u; // 36
UINT64 TotSec64; // 40
UINT64 MFTClus; // 48
UINT8 Padding3[510 - 56];
} Ntfs;
} Fat;
UINT16 Signature;
} BOOT_SECTOR;
UEFI为上面每一个partition生成一个controller,如果这个分区属性bit1 为0,则为这个分区控制器安装BlockIO;ReadBlocks函数就可以用来读取块设备,只能按块(扇区)读取设备
MediaId |
设备中的介质号,BlockIo->Media->MediaId |
LBA |
读取设备或者分区起始块的LBA地址 |
BufferSize |
读取的字节数,必须是块大小的整数倍 |
*Buffer |
读取的数据存到此缓冲区,调用者需要对此区管理 |
例如读取硬盘MBR区域或者GPT硬盘的保护性MBR区域,可以用ReadBlocks函数,LBA=0