+
+static int VentoyFillProtectMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR)
+{
+ GUID Guid;
+ UINT32 DiskSignature;
+ UINT64 DiskSectorCount;
+
+ VentoyGetLocalBootImg(pMBR);
+
+ CoCreateGuid(&Guid);
+
+ memcpy(&DiskSignature, &Guid, sizeof(UINT32));
+
+ Log("Disk signature: 0x%08x", DiskSignature);
+
+ *((UINT32 *)(pMBR->BootCode + 0x1B8)) = DiskSignature;
+
+ DiskSectorCount = DiskSizeBytes / 512 - 1;
+ if (DiskSectorCount > 0xFFFFFFFF)
+ {
+ DiskSectorCount = 0xFFFFFFFF;
+ }
+
+ memset(pMBR->PartTbl, 0, sizeof(pMBR->PartTbl));
+
+ pMBR->PartTbl[0].Active = 0x00;
+ pMBR->PartTbl[0].FsFlag = 0xee; // EE
+
+ pMBR->PartTbl[0].StartHead = 0;
+ pMBR->PartTbl[0].StartSector = 1;
+ pMBR->PartTbl[0].StartCylinder = 0;
+ pMBR->PartTbl[0].EndHead = 254;
+ pMBR->PartTbl[0].EndSector = 63;
+ pMBR->PartTbl[0].EndCylinder = 1023;
+
+ pMBR->PartTbl[0].StartSectorId = 1;
+ pMBR->PartTbl[0].SectorCount = (UINT32)DiskSectorCount;
+
+ pMBR->Byte55 = 0x55;
+ pMBR->ByteAA = 0xAA;
+
+ pMBR->BootCode[92] = 0x22;
+
+ return 0;
+}
+
+
+int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo)
+{
+ INT64 ReservedValue = 0;
+ UINT64 ReservedSector = 33;
+ UINT64 Part1SectorCount = 0;
+ UINT64 DiskSectorCount = DiskSizeBytes / 512;
+ VTOY_GPT_HDR *Head = &pInfo->Head;
+ VTOY_GPT_PART_TBL *Table = pInfo->PartTbl;
+ static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } };
+ static GUID EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } };
+
+ VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR);
+
+ ReservedValue = GetReservedSpaceInMB();
+ if (ReservedValue > 0)
+ {
+ ReservedSector += ReservedValue * 2048;
+ }
+
+ Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048;
+
+ memcpy(Head->Signature, "EFI PART", 8);
+ Head->Version[2] = 0x01;
+ Head->Length = 92;
+ Head->Crc = 0;
+ Head->EfiStartLBA = 1;
+ Head->EfiBackupLBA = DiskSectorCount - 1;
+ Head->PartAreaStartLBA = 34;
+ Head->PartAreaEndLBA = DiskSectorCount - 34;
+ CoCreateGuid(&Head->DiskGuid);
+ Head->PartTblStartLBA = 2;
+ Head->PartTblTotNum = 128;
+ Head->PartTblEntryLen = 128;
+
+
+ memcpy(&(Table[0].PartType), &WindowsDataPartType, sizeof(GUID));
+ CoCreateGuid(&(Table[0].PartGuid));
+ Table[0].StartLBA = 2048;
+ Table[0].LastLBA = 2048 + Part1SectorCount - 1;
+ Table[0].Attr = 0;
+ memcpy(Table[0].Name, L"Ventoy", 6 * 2);
+
+ memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID));
+ CoCreateGuid(&(Table[1].PartGuid));
+ Table[1].StartLBA = Table[0].LastLBA + 1;
+ Table[1].LastLBA = Table[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1;
+ Table[1].Attr = 1;
+ memcpy(Table[1].Name, L"VTOYEFI", 7 * 2);
+
+ //Update CRC
+ Head->PartTblCrc = VentoyCrc32(Table, sizeof(pInfo->PartTbl));
+ Head->Crc = VentoyCrc32(Head, Head->Length);
+
+ return 0;
+}
+
+int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead)
+{
+ UINT64 LBA;
+ UINT64 BackupLBA;
+
+ memcpy(pHead, &pInfo->Head, sizeof(VTOY_GPT_HDR));
+
+ LBA = pHead->EfiStartLBA;
+ BackupLBA = pHead->EfiBackupLBA;
+
+ pHead->EfiStartLBA = BackupLBA;
+ pHead->EfiBackupLBA = LBA;
+ pHead->PartTblStartLBA = BackupLBA + 1 - 33;
+
+ pHead->Crc = 0;
+ pHead->Crc = VentoyCrc32(pHead, pHead->Length);
+
+ return 0;
+}
+