bootsectimage.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 803 行 · 第 1/3 页
C
803 行
if ((FatType == FatTypeFat32) &&
(FatBpb->Fat32.BPB_FSVer != 0)) {
printf ("WARNING: FAT32: BPB_FSVer - %08x, expected - %04x\n",
FatBpb->Fat32.BPB_FSVer, 0);
}
if ((FatType == FatTypeFat32) &&
(FatBpb->Fat32.BPB_RootClus != 2)) {
printf ("WARNING: FAT32: BPB_RootClus - %08x, expected - %04x\n",
FatBpb->Fat32.BPB_RootClus, 2);
}
if ((FatType == FatTypeFat32) &&
(FatBpb->Fat32.BPB_FSInfo != 1)) {
printf ("WARNING: FAT32: BPB_FSInfo - %08x, expected - %04x\n",
FatBpb->Fat32.BPB_FSInfo, 1);
}
if ((FatType == FatTypeFat32) &&
(FatBpb->Fat32.BPB_BkBootSec != 6)) {
printf ("WARNING: FAT32: BPB_BkBootSec - %08x, expected - %04x\n",
FatBpb->Fat32.BPB_BkBootSec, 6);
}
if ((FatType == FatTypeFat32) &&
((*(UINT32 *)FatBpb->Fat32.BPB_Reserved != 0) ||
(*((UINT32 *)FatBpb->Fat32.BPB_Reserved + 1) != 0) ||
(*((UINT32 *)FatBpb->Fat32.BPB_Reserved + 2) != 0))) {
printf ("ERROR: FAT32: BPB_Reserved - %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x, expected - 0\n",
FatBpb->Fat32.BPB_Reserved[0],
FatBpb->Fat32.BPB_Reserved[1],
FatBpb->Fat32.BPB_Reserved[2],
FatBpb->Fat32.BPB_Reserved[3],
FatBpb->Fat32.BPB_Reserved[4],
FatBpb->Fat32.BPB_Reserved[5],
FatBpb->Fat32.BPB_Reserved[6],
FatBpb->Fat32.BPB_Reserved[7],
FatBpb->Fat32.BPB_Reserved[8],
FatBpb->Fat32.BPB_Reserved[9],
FatBpb->Fat32.BPB_Reserved[10],
FatBpb->Fat32.BPB_Reserved[11]);
return FatTypeUnknown;
}
if (((FatType == FatTypeFat12) || (FatType == FatTypeFat16)) &&
(FatBpb->Fat12_16.BS_Reserved1 != 0)) {
printf ("ERROR: FAT12_16: BS_Reserved1 - %02x, expected - 0\n",
FatBpb->Fat12_16.BS_Reserved1);
return FatTypeUnknown;
}
if ((FatType == FatTypeFat32) &&
(FatBpb->Fat32.BS_Reserved1 != 0)) {
printf ("ERROR: FAT32: BS_Reserved1 - %02x, expected - 0\n",
FatBpb->Fat32.BS_Reserved1);
return FatTypeUnknown;
}
if (((FatType == FatTypeFat12) || (FatType == FatTypeFat16)) &&
(FatBpb->Fat12_16.BS_BootSig != FAT_BS_BOOTSIG)) {
printf ("ERROR: FAT12_16: BS_BootSig - %02x, expected - %02x\n",
FatBpb->Fat12_16.BS_BootSig, FAT_BS_BOOTSIG);
return FatTypeUnknown;
}
if ((FatType == FatTypeFat32) &&
(FatBpb->Fat32.BS_BootSig != FAT_BS_BOOTSIG)) {
printf ("ERROR: FAT32: BS_BootSig - %02x, expected - %02x\n",
FatBpb->Fat32.BS_BootSig, FAT_BS_BOOTSIG);
return FatTypeUnknown;
}
if ((FatType == FatTypeFat12) || (FatType == FatTypeFat16)) {
memcpy (FilSysType, FatBpb->Fat12_16.BS_FilSysType, 8);
FilSysType[8] = 0;
if ((FatType == FatTypeFat12) &&
(strcmp (FilSysType, FAT12_FILSYSTYPE) != 0) &&
(strcmp (FilSysType, FAT_FILSYSTYPE) != 0)) {
printf ("WARNING: FAT12: BS_FilSysType - %s, expected - %s, or %s\n",
FilSysType, FAT12_FILSYSTYPE, FAT_FILSYSTYPE);
}
if ((FatType == FatTypeFat16) &&
(strcmp (FilSysType, FAT16_FILSYSTYPE) != 0) &&
(strcmp (FilSysType, FAT_FILSYSTYPE) != 0)) {
printf ("WARNING: FAT16: BS_FilSysType - %s, expected - %s, or %s\n",
FilSysType, FAT16_FILSYSTYPE, FAT_FILSYSTYPE);
}
}
if (FatType == FatTypeFat32) {
memcpy (FilSysType, FatBpb->Fat32.BS_FilSysType, 8);
FilSysType[8] = 0;
if (strcmp (FilSysType, FAT32_FILSYSTYPE) != 0) {
printf ("WARNING: FAT32: BS_FilSysType - %s, expected - %s\n",
FilSysType, FAT32_FILSYSTYPE);
}
}
//
// pass all check, get FAT type
//
return FatType;
}
void
PatchFatBpbInfo (
IN FAT_BPB_STRUCT *DestFatBpb,
IN FAT_BPB_STRUCT *SourceFatBpb,
IN FAT_TYPE OrigFatType,
IN FAT_TYPE FatType
)
{
FAT_BPB_STRUCT BackupFatBpb;
CHAR8 VolLab[11];
CHAR8 FilSysType[8];
if (FatType <= FatTypeUnknown || FatType >= FatTypeMax) {
printf ("ERROR: Unknown Fat Type!\n");
return;
}
memcpy (&BackupFatBpb, DestFatBpb, sizeof(BackupFatBpb));
printf ("Patching %s BPB:\n", FatTypeToString (FatType));
if (FatType != FatTypeFat32) {
memcpy (
&DestFatBpb->Fat12_16.BPB_BytsPerSec,
&SourceFatBpb->Fat12_16.BPB_BytsPerSec,
((UINTN)&DestFatBpb->Fat12_16.Reserved - (UINTN)&DestFatBpb->Fat12_16.BPB_BytsPerSec)
);
} else {
memcpy (
&DestFatBpb->Fat32.BPB_BytsPerSec,
&SourceFatBpb->Fat32.BPB_BytsPerSec,
((UINTN)&DestFatBpb->Fat32.Reserved - (UINTN)&DestFatBpb->Fat32.BPB_BytsPerSec)
);
}
// if ((OrigFatType == FatTypeFat12) || (OrigFatType == FatTypeFat16)) {
// memcpy (VolLab, BackupFatBpb.Fat12_16.BS_VolLab, sizeof(VolLab));
// memcpy (FilSysType, BackupFatBpb.Fat12_16.BS_FilSysType, sizeof(FilSysType));
// } else if (OrigFatType == FatTypeFat32) {
// memcpy (VolLab, BackupFatBpb.Fat32.BS_VolLab, sizeof(VolLab));
// memcpy (FilSysType, BackupFatBpb.Fat32.BS_FilSysType, sizeof(FilSysType));
// } else {
if (FatType == FatTypeFat32) {
memcpy (VolLab, "EFI FAT32 ", sizeof(VolLab));
memcpy (FilSysType, FAT32_FILSYSTYPE, sizeof(FilSysType));
} else if (FatType == FatTypeFat16) {
memcpy (VolLab, "EFI FAT16 ", sizeof(VolLab));
memcpy (FilSysType, FAT16_FILSYSTYPE, sizeof(FilSysType));
} else {
memcpy (VolLab, "EFI FAT12 ", sizeof(VolLab));
memcpy (FilSysType, FAT12_FILSYSTYPE, sizeof(FilSysType));
}
// }
if (FatType != FatTypeFat32) {
memcpy (DestFatBpb->Fat12_16.BS_VolLab, VolLab, sizeof(VolLab));
memcpy (DestFatBpb->Fat12_16.BS_FilSysType, FilSysType, sizeof(FilSysType));
} else {
memcpy (DestFatBpb->Fat32.BS_VolLab, VolLab, sizeof(VolLab));
memcpy (DestFatBpb->Fat32.BS_FilSysType, FilSysType, sizeof(FilSysType));
}
DestFatBpb->Fat12_16.Signature = FAT_BS_SIGNATURE;
//
// Patch LBAOffsetForBootSector
//
// if ((FatType == FatTypeFat16) || (FatType == FatTypeFat32)) {
// memcpy ((BYTE *)DestFatBpb + BOOT_SECTOR_LBA_OFFSET, (BYTE *)SourceFatBpb + BOOT_SECTOR_LBA_OFFSET, sizeof(DWORD));
// }
return ;
}
void
PrintFatBpbInfo (
IN FAT_BPB_STRUCT *FatBpb,
IN FAT_TYPE FatType
)
{
if (FatType <= FatTypeUnknown || FatType >= FatTypeMax) {
printf ("ERROR: Unknown Fat Type!\n");
return;
}
printf ("\nBoot Sector %s:\n", FatTypeToString (FatType));
printf ("\n");
printf (" Offset Title Data\n");
printf ("==================================================================\n");
printf (" 0 JMP instruction %02x %02x %02x\n",
FatBpb->Fat12_16.BS_jmpBoot[0],
FatBpb->Fat12_16.BS_jmpBoot[1],
FatBpb->Fat12_16.BS_jmpBoot[2]);
printf (" 3 OEM %c%c%c%c%c%c%c%c\n",
FatBpb->Fat12_16.BS_OEMName[0],
FatBpb->Fat12_16.BS_OEMName[1],
FatBpb->Fat12_16.BS_OEMName[2],
FatBpb->Fat12_16.BS_OEMName[3],
FatBpb->Fat12_16.BS_OEMName[4],
FatBpb->Fat12_16.BS_OEMName[5],
FatBpb->Fat12_16.BS_OEMName[6],
FatBpb->Fat12_16.BS_OEMName[7]);
printf ("\n");
printf ("BIOS Parameter Block\n");
printf (" B Bytes per sector %04x\n", FatBpb->Fat12_16.BPB_BytsPerSec);
printf (" D Sectors per cluster %02x\n", FatBpb->Fat12_16.BPB_SecPerClus);
printf (" E Reserved sectors %04x\n", FatBpb->Fat12_16.BPB_RsvdSecCnt);
printf (" 10 Number of FATs %02x\n", FatBpb->Fat12_16.BPB_NumFATs);
printf (" 11 Root entries %04x\n", FatBpb->Fat12_16.BPB_RootEntCnt);
printf (" 13 Sectors (under 32MB) %04x\n", FatBpb->Fat12_16.BPB_TotSec16);
printf (" 15 Media descriptor %02x\n", FatBpb->Fat12_16.BPB_Media);
printf (" 16 Sectors per FAT (small vol.) %04x\n", FatBpb->Fat12_16.BPB_FATSz16);
printf (" 18 Sectors per track %04x\n", FatBpb->Fat12_16.BPB_SecPerTrk);
printf (" 1A Heads %04x\n", FatBpb->Fat12_16.BPB_NumHeads);
printf (" 1C Hidden sectors %08x\n", FatBpb->Fat12_16.BPB_HiddSec);
printf (" 20 Sectors (over 32MB) %08x\n", FatBpb->Fat12_16.BPB_TotSec32);
printf ("\n");
if (FatType != FatTypeFat32) {
printf (" 24 BIOS drive %02x\n", FatBpb->Fat12_16.BS_DrvNum);
printf (" 25 (Unused) %02x\n", FatBpb->Fat12_16.BS_Reserved1);
printf (" 26 Ext. boot signature %02x\n", FatBpb->Fat12_16.BS_BootSig);
printf (" 27 Volume serial number %08x\n", FatBpb->Fat12_16.BS_VolID);
printf (" 2B Volume lable %c%c%c%c%c%c%c%c%c%c%c\n",
FatBpb->Fat12_16.BS_VolLab[0],
FatBpb->Fat12_16.BS_VolLab[1],
FatBpb->Fat12_16.BS_VolLab[2],
FatBpb->Fat12_16.BS_VolLab[3],
FatBpb->Fat12_16.BS_VolLab[4],
FatBpb->Fat12_16.BS_VolLab[5],
FatBpb->Fat12_16.BS_VolLab[6],
FatBpb->Fat12_16.BS_VolLab[7],
FatBpb->Fat12_16.BS_VolLab[8],
FatBpb->Fat12_16.BS_VolLab[9],
FatBpb->Fat12_16.BS_VolLab[10]);
printf (" 36 File system %c%c%c%c%c%c%c%c\n",
FatBpb->Fat12_16.BS_FilSysType[0],
FatBpb->Fat12_16.BS_FilSysType[1],
FatBpb->Fat12_16.BS_FilSysType[2],
FatBpb->Fat12_16.BS_FilSysType[3],
FatBpb->Fat12_16.BS_FilSysType[4],
FatBpb->Fat12_16.BS_FilSysType[5],
FatBpb->Fat12_16.BS_FilSysType[6],
FatBpb->Fat12_16.BS_FilSysType[7]);
printf ("\n");
} else {
printf ("FAT32 Section\n");
printf (" 24 Sectors per FAT (large vol.) %08x\n", FatBpb->Fat32.BPB_FATSz32);
printf (" 28 Flags %04x\n", FatBpb->Fat32.BPB_ExtFlags);
printf (" 2A Version %04x\n", FatBpb->Fat32.BPB_FSVer);
printf (" 2C Root dir 1st cluster %08x\n", FatBpb->Fat32.BPB_RootClus);
printf (" 30 FSInfo sector %04x\n", FatBpb->Fat32.BPB_FSInfo);
printf (" 32 Backup boot sector %04x\n", FatBpb->Fat32.BPB_BkBootSec);
printf (" 34 (Reserved) %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
FatBpb->Fat32.BPB_Reserved[0],
FatBpb->Fat32.BPB_Reserved[1],
FatBpb->Fat32.BPB_Reserved[2],
FatBpb->Fat32.BPB_Reserved[3],
FatBpb->Fat32.BPB_Reserved[4],
FatBpb->Fat32.BPB_Reserved[5],
FatBpb->Fat32.BPB_Reserved[6],
FatBpb->Fat32.BPB_Reserved[7],
FatBpb->Fat32.BPB_Reserved[8],
FatBpb->Fat32.BPB_Reserved[9],
FatBpb->Fat32.BPB_Reserved[10],
FatBpb->Fat32.BPB_Reserved[11]);
printf ("\n");
printf (" 40 BIOS drive %02x\n", FatBpb->Fat32.BS_DrvNum);
printf (" 41 (Unused) %02x\n", FatBpb->Fat32.BS_Reserved1);
printf (" 42 Ext. boot signature %02x\n", FatBpb->Fat32.BS_BootSig);
printf (" 43 Volume serial number %08x\n", FatBpb->Fat32.BS_VolID);
printf (" 47 Volume lable %c%c%c%c%c%c%c%c%c%c%c\n",
FatBpb->Fat32.BS_VolLab[0],
FatBpb->Fat32.BS_VolLab[1],
FatBpb->Fat32.BS_VolLab[2],
FatBpb->Fat32.BS_VolLab[3],
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?