]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Optimization for Ventoy2Disk.exe
authorlongpanda <admin@ventoy.net>
Mon, 25 Oct 2021 12:38:04 +0000 (20:38 +0800)
committerlongpanda <admin@ventoy.net>
Mon, 25 Oct 2021 12:38:04 +0000 (20:38 +0800)
INSTALL/Ventoy2Disk.exe
Ventoy2Disk/Ventoy2Disk/PhyDrive.c

index 4f66a011d1287637ad03f18a3519321820d7f55a..6c068b82b4b4bea5967252a06b1141e69090521a 100644 (file)
Binary files a/INSTALL/Ventoy2Disk.exe and b/INSTALL/Ventoy2Disk.exe differ
index 343866d582d644d15f9892875919bf52c7fb08cd..02c9c93e74138151cb0ccec8ed757cb946523d1d 100644 (file)
@@ -1660,9 +1660,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId)
 \r
     if (!VDS_DeleteAllPartitions(pPhyDrive->PhyDrive))\r
     {\r
-        Log("Notice: Could not delete partitions: 0x%x", GetLastError());\r
-               rc = 1;\r
-               goto End;\r
+        Log("Notice: Could not delete partitions: 0x%x, but we continue.", GetLastError());\r
     }\r
 \r
     Log("Deleting all partitions ......................... OK");\r
@@ -1838,6 +1836,7 @@ static BOOL BackupDataBeforeCleanDisk(int PhyDrive, UINT64 DiskSize, BYTE **pBac
        BOOL ret = FALSE;\r
        BYTE *backup = NULL;\r
        UINT64 offset;\r
+       BYTE Buffer[512];\r
        HANDLE hDrive = INVALID_HANDLE_VALUE;\r
        LARGE_INTEGER liCurPosition;\r
        LARGE_INTEGER liNewPosition;\r
@@ -1845,6 +1844,54 @@ static BOOL BackupDataBeforeCleanDisk(int PhyDrive, UINT64 DiskSize, BYTE **pBac
 \r
        Log("BackupDataBeforeCleanDisk %d", PhyDrive);\r
 \r
+       // step1: check write access\r
+       hDrive = GetPhysicalHandle(PhyDrive, TRUE, TRUE, FALSE);\r
+       if (hDrive == INVALID_HANDLE_VALUE)\r
+       {\r
+               Log("Failed to GetPhysicalHandle for write.");\r
+               goto out;\r
+       }\r
+\r
+       liCurPosition.QuadPart = 2039 * 512;\r
+       liNewPosition.QuadPart = 0;\r
+       if (0 == SetFilePointerEx(hDrive, liCurPosition, &liNewPosition, FILE_BEGIN) ||\r
+               liNewPosition.QuadPart != liCurPosition.QuadPart)\r
+       {\r
+               Log("SetFilePointer1 Failed %u", LASTERR);\r
+               goto out;\r
+       }\r
+       \r
+\r
+       dwSize = 0;\r
+       ret = ReadFile(hDrive, Buffer, 512, &dwSize, NULL);\r
+       if ((!ret) || (dwSize != 512))\r
+       {\r
+               Log("Failed to read %d %u 0x%x", ret, dwSize, LASTERR);\r
+               goto out;\r
+       }\r
+\r
+\r
+       liCurPosition.QuadPart = 2039 * 512;\r
+       liNewPosition.QuadPart = 0;\r
+       if (0 == SetFilePointerEx(hDrive, liCurPosition, &liNewPosition, FILE_BEGIN) ||\r
+               liNewPosition.QuadPart != liCurPosition.QuadPart)\r
+       {\r
+               Log("SetFilePointer2 Failed %u", LASTERR);\r
+               goto out;\r
+       }\r
+\r
+       ret = WriteFile(hDrive, Buffer, 512, &dwSize, NULL);\r
+       if ((!ret) || dwSize != 512)\r
+       {\r
+               Log("Failed to write %d %u %u", ret, dwSize, LASTERR);\r
+               goto out;\r
+       }\r
+\r
+       CHECK_CLOSE_HANDLE(hDrive);\r
+       Log("Write access check success");\r
+\r
+\r
+       //step2 backup 4MB data\r
        backup = malloc(SIZE_1MB * 4);\r
        if (!backup)\r
        {\r
@@ -2334,6 +2381,13 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int TryId)
 \r
 End:\r
 \r
+       if (hVolume != INVALID_HANDLE_VALUE)\r
+       {\r
+               bRet = DeviceIoControl(hVolume, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &dwSize, NULL);\r
+               Log("FSCTL_UNLOCK_VOLUME bRet:%u code:%u", bRet, LASTERR);\r
+               CHECK_CLOSE_HANDLE(hVolume);\r
+       }\r
+\r
     if (rc == 0)\r
     {\r
         Log("OK");\r