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 + -
显示快捷键?