]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/PhyDrive.c
Fix the format failure when install Ventoy.
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / PhyDrive.c
index e139c09aa73f891dc34bcd99cdc674a000ff5d10..256a9cf28706b63d03f4e2486f18237e0fea17af 100644 (file)
@@ -725,12 +725,13 @@ int VentoyProcSecureBoot(BOOL SecureBoot)
                        fl_fclose(file);\r
 \r
                        Log("Now delete all efi files ...");\r
-                       fl_remove("/EFI/BOOT/BOOTX64.EFI");\r
-                       fl_remove("/EFI/BOOT/grubx64.efi");\r
+            fl_remove("/EFI/BOOT/BOOTX64.EFI");            \r
+            fl_remove("/EFI/BOOT/grubx64.efi");            \r
                        fl_remove("/EFI/BOOT/grubx64_real.efi");\r
                        fl_remove("/EFI/BOOT/MokManager.efi");\r
                        fl_remove("/EFI/BOOT/mmx64.efi");\r
             fl_remove("/ENROLL_THIS_KEY_IN_MOKMANAGER.cer");\r
+            fl_remove("/EFI/BOOT/grub.efi");\r
 \r
                        file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb");\r
                        Log("Open bootx64 efi file %p ", file);\r
@@ -1698,6 +1699,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId)
     int i;\r
     int rc = 0;\r
     int state = 0;\r
+    BOOL ReformatOK;\r
     HANDLE hDrive;\r
     DWORD dwSize;\r
     BOOL bRet;\r
@@ -1824,15 +1826,15 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId)
     }\r
     else\r
     {\r
-        Log("Formatting part1 exFAT ...");\r
-        if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))\r
+        CHAR TmpBuffer[512] = { 0 };\r
+\r
+        Log("Zero part1 file system ...");\r
+        SetFilePointer(hDrive, VENTOY_PART1_START_SECTOR * 512, NULL, FILE_BEGIN);\r
+        for (i = 0; i < 32; i++)\r
         {\r
-            Log("FormatPart1exFAT failed.");\r
-            rc = 1;\r
-            goto End;\r
+            WriteFile(hDrive, TmpBuffer, 512, &dwSize, NULL);\r
         }\r
     }\r
-    \r
 \r
     PROGRESS_BAR_SET_POS(PT_FORMAT_PART2);\r
     Log("Writing part2 FAT img ...");\r
@@ -1956,6 +1958,12 @@ End:
             }\r
         }\r
 \r
+        // close handle, or it will deny reformat\r
+        Log("Close handle ...");\r
+        CHECK_CLOSE_HANDLE(hDrive);\r
+\r
+        ReformatOK = FALSE;\r
+\r
         if (state)\r
         {\r
             if (LargeFAT32)\r
@@ -1963,22 +1971,34 @@ End:
                 Log("No need to reformat for large FAT32");\r
                 pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
             }\r
-            else if (DISK_FormatVolume(MountDrive, GetVentoyFsType(), Part1SectorCount * 512))\r
+            else\r
             {\r
-                Log("Reformat %C:\\ to %s SUCCESS", MountDrive, GetVentoyFsName());\r
-                pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
+                bRet = DISK_FormatVolume(MountDrive, GetVentoyFsType(), Part1SectorCount * 512);\r
+                for (i = 0; bRet == FALSE && i < 2; i++)\r
+                {\r
+                    Log("Wait and retry reformat ...");\r
+                    Sleep(1000);\r
+                    bRet = DISK_FormatVolume(MountDrive, GetVentoyFsType(), Part1SectorCount * 512);\r
+                }\r
 \r
-                if ((GetVentoyFsType() != VTOY_FS_UDF) && (pPhyDrive->VentoyFsClusterSize < 2048))\r
+                if (bRet)\r
                 {\r
-                    for (i = 0; i < 10; i++)\r
+                    ReformatOK = TRUE;\r
+                    Log("Reformat %C:\\ to %s SUCCESS", MountDrive, GetVentoyFsName());\r
+                    pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
+\r
+                    if ((GetVentoyFsType() != VTOY_FS_UDF) && (pPhyDrive->VentoyFsClusterSize < 2048))\r
                     {\r
-                        Log("### Invalid cluster size %d ###", pPhyDrive->VentoyFsClusterSize);\r
-                    }                    \r
+                        for (i = 0; i < 10; i++)\r
+                        {\r
+                            Log("### Invalid cluster size %d ###", pPhyDrive->VentoyFsClusterSize);\r
+                        }\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    Log("Reformat %C:\\ to %s FAILED", MountDrive, GetVentoyFsName());\r
                 }\r
-            }\r
-            else\r
-            {\r
-                Log("Reformat %C:\\ to %s FAILED", MountDrive, GetVentoyFsName());\r
             }\r
         }\r
         else\r
@@ -1986,6 +2006,30 @@ End:
             Log("Can not reformat %s to %s", DriveName, GetVentoyFsName());\r
         }\r
 \r
+        if (!ReformatOK)\r
+        {\r
+            Log("Format to exfat with built-in algorithm");\r
+\r
+            hDrive = GetPhysicalHandle(pPhyDrive->PhyDrive, TRUE, TRUE, FALSE);\r
+            if (hDrive == INVALID_HANDLE_VALUE)\r
+            {\r
+                Log("Failed to GetPhysicalHandle for write.");\r
+            }\r
+            else\r
+            {\r
+                if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))\r
+                {\r
+                    Log("FormatPart1exFAT SUCCESS.");\r
+                }\r
+                else\r
+                {\r
+                    Log("FormatPart1exFAT FAILED.");\r
+                }\r
+\r
+                CHECK_CLOSE_HANDLE(hDrive);\r
+            }\r
+        }\r
+\r
         Log("OK\n");\r
     }\r
     else\r
@@ -2002,14 +2046,15 @@ End:
                        Log("###### [Error:] Virtual Disk Service (VDS) Unavailable ######");\r
                        Log("###### [Error:] Virtual Disk Service (VDS) Unavailable ######");\r
                }\r
+\r
+        CHECK_CLOSE_HANDLE(hDrive);\r
     }\r
 \r
     if (pGptInfo)\r
     {\r
         free(pGptInfo);\r
     }\r
-\r
-    CHECK_CLOSE_HANDLE(hDrive);\r
+    \r
     return rc;\r
 }\r
 \r