+\r
+int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)\r
+{\r
+ int i, j;\r
+ int rc = 1;\r
+ int PhyDrive;\r
+ int PartStyle;\r
+ INT64 ReservedValue;\r
+ UINT64 RecudeBytes;\r
+ GUID Guid;\r
+ MBR_HEAD MBR;\r
+ VTOY_GPT_INFO *pGPT;\r
+ MBR_HEAD *pMBR;\r
+ DWORD dwSize = 0;\r
+ VTOY_GPT_HDR BackupHead;\r
+ HANDLE hDrive = INVALID_HANDLE_VALUE;\r
+ GUID ZeroGuid = { 0 };\r
+ static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } };\r
+ static GUID EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } };\r
+ static GUID BiosGrubPartType = { 0x21686148, 0x6449, 0x6e6f, { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } };\r
+\r
+ Log("#####################################################");\r
+ Log("PartitionResizeForVentoy PhyDrive%d <<%s %s %dGB>>",\r
+ pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,\r
+ GetHumanReadableGBSize(pPhyDrive->SizeInBytes));\r
+ Log("#####################################################");\r
+\r
+ pGPT = &(pPhyDrive->Gpt);\r
+ pMBR = &(pPhyDrive->Gpt.MBR);\r
+ Log("Disksize:%llu Part2Start:%llu", pPhyDrive->SizeInBytes, pPhyDrive->ResizePart2StartSector * 512);\r
+\r
+ if (pMBR->PartTbl[0].FsFlag == 0xEE && memcmp(pGPT->Head.Signature, "EFI PART", 8) == 0)\r
+ {\r
+ PartStyle = 1;\r
+ }\r
+ else\r
+ {\r
+ PartStyle = 0;\r
+ }\r
+\r
+ PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);\r
+\r
+ RecudeBytes = VENTOY_EFI_PART_SIZE;\r
+ ReservedValue = GetReservedSpaceInMB();\r
+ if (ReservedValue > 0)\r
+ {\r
+ Log("Reduce add reserved space %lldMB", (LONGLONG)ReservedValue);\r
+ RecudeBytes += (UINT64)(ReservedValue * SIZE_1MB);\r
+ }\r
+\r
+\r
+ if (pPhyDrive->ResizeNoShrink == FALSE)\r
+ {\r
+ Log("Need to shrink the volume");\r
+ if (VDS_ShrinkVolume(pPhyDrive->ResizeVolumeGuid, RecudeBytes))\r
+ {\r
+ Log("Shrink volume success, now check again");\r
+\r
+ hDrive = GetPhysicalHandle(pPhyDrive->PhyDrive, TRUE, TRUE, FALSE);\r
+ if (hDrive == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Failed to GetPhysicalHandle for update.");\r
+ goto End;\r
+ }\r
+\r
+ //Refresh Drive Layout\r
+ DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);\r
+\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+\r
+\r
+ if (PartResizePreCheck(NULL) && pPhyDrive->ResizeNoShrink)\r
+ {\r
+ Log("Recheck after Shrink volume success");\r
+ Log("After shrink Disksize:%llu Part2Start:%llu", pPhyDrive->SizeInBytes, pPhyDrive->ResizePart2StartSector * 512);\r
+ }\r
+ else\r
+ {\r
+ Log("Recheck after Shrink volume failed %u", pPhyDrive->ResizeNoShrink);\r
+ goto End;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Log("Shrink volume failed");\r
+ goto End;\r
+ }\r
+ }\r
+\r
+\r
+ //Now try write data\r
+ hDrive = GetPhysicalHandle(pPhyDrive->PhyDrive, TRUE, TRUE, FALSE);\r
+ if (hDrive == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Failed to GetPhysicalHandle for update.");\r
+ goto End;\r
+ }\r
+\r
+\r
+ //Write partition 2 data\r
+ PROGRESS_BAR_SET_POS(PT_FORMAT_PART2);\r
+ if (0 != FormatPart2Fat(hDrive, pPhyDrive->ResizePart2StartSector))\r
+ {\r
+ Log("FormatPart2Fat failed.");\r
+ goto End;\r
+ }\r
+\r
+ //Write grub stage2 gap\r
+ PROGRESS_BAR_SET_POS(PT_WRITE_STG1_IMG);\r
+ Log("Writing Boot Image ............................. ");\r
+ if (WriteGrubStage1ToPhyDrive(hDrive, PartStyle) != 0)\r
+ {\r
+ Log("WriteGrubStage1ToPhyDrive failed.");\r
+ goto End;\r
+ }\r
+\r
+\r
+ //Write partition table\r
+ PROGRESS_BAR_SET_POS(PT_WRITE_PART_TABLE);\r
+ Log("Writing partition table ............................. ");\r
+\r
+ VentoyGetLocalBootImg(&MBR);\r
+ CoCreateGuid(&Guid);\r
+ memcpy(MBR.BootCode + 0x180, &Guid, 16);\r
+ memcpy(pMBR->BootCode, MBR.BootCode, 440);\r
+\r
+ if (PartStyle == 0)\r
+ {\r
+ for (i = 1; i < 4; i++)\r
+ {\r
+ if (pMBR->PartTbl[i].SectorCount == 0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (i >= 4)\r
+ {\r
+ Log("Can not find MBR free partition table");\r
+ goto End;\r
+ }\r
+\r
+ for (j = i - 1; j > 0; j--)\r
+ {\r
+ Log("Move MBR partition table %d --> %d", j + 1, j + 2);\r
+ memcpy(pMBR->PartTbl + (j + 1), pMBR->PartTbl + j, sizeof(PART_TABLE));\r
+ }\r
+\r
+ VentoyFillMBRLocation(pPhyDrive->SizeInBytes, (UINT32)pPhyDrive->ResizePart2StartSector, VENTOY_EFI_PART_SIZE / 512, pMBR->PartTbl + 1);\r
+ pMBR->PartTbl[0].Active = 0x80; // bootable\r
+ pMBR->PartTbl[1].Active = 0x00;\r
+ pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition\r
+\r
+ if (!WriteDataToPhyDisk(hDrive, 0, pMBR, 512))\r
+ {\r
+ Log("Legacy BIOS write MBR failed");\r
+ goto End;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i = 1; i < 128; i++)\r
+ {\r
+ if (memcmp(&(pGPT->PartTbl[i].PartGuid), &ZeroGuid, sizeof(GUID)) == 0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (i >= 128)\r
+ {\r
+ Log("Can not find GPT free partition table");\r
+ goto End;\r
+ }\r
+\r
+ for (j = i - 1; j > 0; j--)\r
+ {\r
+ Log("Move GPT partition table %d --> %d", j + 1, j + 2);\r
+ memcpy(pGPT->PartTbl + (j + 1), pGPT->PartTbl + j, sizeof(VTOY_GPT_PART_TBL));\r
+ }\r
+\r
+\r
+ pMBR->BootCode[92] = 0x22;\r
+\r
+ // to fix windows issue\r
+ memcpy(&(pGPT->PartTbl[1].PartType), &WindowsDataPartType, sizeof(GUID));\r
+ CoCreateGuid(&(pGPT->PartTbl[1].PartGuid));\r
+\r
+ pGPT->PartTbl[1].StartLBA = pGPT->PartTbl[0].LastLBA + 1;\r
+ pGPT->PartTbl[1].LastLBA = pGPT->PartTbl[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1;\r
+ pGPT->PartTbl[1].Attr = 0xC000000000000001ULL;\r
+ memcpy(pGPT->PartTbl[1].Name, L"VTOYEFI", 7 * 2);\r
+\r
+ //Update CRC\r
+ pGPT->Head.PartTblCrc = VentoyCrc32(pGPT->PartTbl, sizeof(pGPT->PartTbl));\r
+ pGPT->Head.Crc = VentoyCrc32(&(pGPT->Head), pGPT->Head.Length);\r
+\r
+ Log("pGPT->Head.EfiStartLBA=%llu", (ULONGLONG)pGPT->Head.EfiStartLBA);\r
+ Log("pGPT->Head.EfiBackupLBA=%llu", (ULONGLONG)pGPT->Head.EfiBackupLBA);\r
+\r
+ VentoyFillBackupGptHead(pGPT, &BackupHead);\r
+ if (!WriteDataToPhyDisk(hDrive, pGPT->Head.EfiBackupLBA * 512, &BackupHead, 512))\r
+ {\r
+ Log("UEFI write backup head failed");\r
+ goto End;\r
+ }\r
+\r
+ if (!WriteDataToPhyDisk(hDrive, (pGPT->Head.EfiBackupLBA - 32) * 512, pGPT->PartTbl, 512 * 32))\r
+ {\r
+ Log("UEFI write backup partition table failed");\r
+ goto End;\r
+ }\r
+\r
+ if (!WriteDataToPhyDisk(hDrive, 0, pGPT, 512 * 34))\r
+ {\r
+ Log("UEFI write MBR & Main partition table failed");\r
+ goto End;\r
+ }\r
+ }\r
+\r
+\r
+\r
+ //Refresh Drive Layout\r
+ DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);\r
+ \r
+ //We must close handle here, because it will block the refresh bellow\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+\r
+ Sleep(2000);\r
+\r
+ //Refresh disk list\r
+ PhyDrive = pPhyDrive->PhyDrive;\r
+\r
+ Log("#### Now Refresh PhyDrive ####");\r
+ Ventoy2DiskDestroy();\r
+ Ventoy2DiskInit();\r
+ \r
+ pPhyDrive = GetPhyDriveInfoByPhyDrive(PhyDrive);\r
+ if (pPhyDrive)\r
+ {\r
+ if (pPhyDrive->VentoyVersion[0] == 0)\r
+ {\r
+ Log("After process the Ventoy version is still invalid");\r
+ goto End;\r
+ }\r
+\r
+ Log("### Ventoy non-destructive installation successfully finished <%s>", pPhyDrive->VentoyVersion);\r
+ }\r
+ else\r
+ {\r
+ Log("### Ventoy non-destructive installation successfully finished <not found>");\r
+ }\r
+\r
+ InitComboxCtrl(g_DialogHwnd, PhyDrive);\r
+\r
+ rc = 0;\r
+\r
+End:\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+ return rc;\r
+}\r
+\r
+\r