]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/PhyDrive.c
Fix the order issue in TreeView mode. (#3218)
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / PhyDrive.c
index 256a9cf28706b63d03f4e2486f18237e0fea17af..c9ac5b1442a98491713030039dc8ef26897c29e6 100644 (file)
@@ -139,7 +139,7 @@ static DWORD GetVentoyVolumeName(int PhyDrive, UINT64 StartSectorId, CHAR *NameB
     return Status;\r
 }\r
 \r
-static int GetLettersBelongPhyDrive(int PhyDrive, char *DriveLetters, size_t Length)\r
+int GetLettersBelongPhyDrive(int PhyDrive, char *DriveLetters, size_t Length)\r
 {\r
     int n = 0;\r
     DWORD DataSize = 0;\r
@@ -355,6 +355,7 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
     STORAGE_PROPERTY_QUERY Query;\r
     STORAGE_DESCRIPTOR_HEADER DevDescHeader;\r
     STORAGE_DEVICE_DESCRIPTOR *pDevDesc;\r
+    STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR diskAlignment;\r
     int PhyDriveId[VENTOY_MAX_PHY_DRIVE];\r
 \r
     Count = GetPhysicalDriveCount();\r
@@ -468,12 +469,35 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
             continue;\r
         }\r
 \r
+\r
+\r
+        memset(&Query, 0, sizeof(STORAGE_PROPERTY_QUERY));\r
+        Query.PropertyId = StorageAccessAlignmentProperty;\r
+        Query.QueryType = PropertyStandardQuery;\r
+        memset(&diskAlignment, 0, sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR));\r
+\r
+        bRet = DeviceIoControl(Handle,\r
+                               IOCTL_STORAGE_QUERY_PROPERTY,\r
+                               &Query,\r
+                               sizeof(STORAGE_PROPERTY_QUERY),\r
+                               &diskAlignment,\r
+                               sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR),\r
+                               &dwBytes,\r
+                               NULL);\r
+        if (!bRet)\r
+        {\r
+            Log("DeviceIoControl3 error:%u dwBytes:%u", LASTERR, dwBytes);            \r
+        }\r
+\r
         CurDrive->PhyDrive = i;\r
         CurDrive->SizeInBytes = LengthInfo.Length.QuadPart;\r
         CurDrive->DeviceType = pDevDesc->DeviceType;\r
         CurDrive->RemovableMedia = pDevDesc->RemovableMedia;\r
         CurDrive->BusType = pDevDesc->BusType;\r
 \r
+        CurDrive->BytesPerLogicalSector = diskAlignment.BytesPerLogicalSector;\r
+        CurDrive->BytesPerPhysicalSector = diskAlignment.BytesPerPhysicalSector;\r
+\r
         if (pDevDesc->VendorIdOffset)\r
         {\r
             safe_strcpy(CurDrive->VendorId, (char *)pDevDesc + pDevDesc->VendorIdOffset);\r
@@ -508,9 +532,10 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
 \r
     for (i = 0, CurDrive = pDriveList; i < (int)DriveCount; i++, CurDrive++)\r
     {\r
-        Log("PhyDrv:%d BusType:%-4s Removable:%u Size:%dGB(%llu) Name:%s %s",\r
+        Log("PhyDrv:%d BusType:%-4s Removable:%u Size:%dGB(%llu) Sector:%u/%u Name:%s %s",\r
             CurDrive->PhyDrive, GetBusTypeString(CurDrive->BusType), CurDrive->RemovableMedia,\r
             GetHumanReadableGBSize(CurDrive->SizeInBytes), CurDrive->SizeInBytes,\r
+            CurDrive->BytesPerLogicalSector, CurDrive->BytesPerPhysicalSector,\r
             CurDrive->VendorId, CurDrive->ProductId);\r
     }\r
 \r
@@ -519,6 +544,199 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
     return 0;\r
 }\r
 \r
+BOOL VentoyPhydriveMatch(PHY_DRIVE_INFO* pPhyDrive)\r
+{\r
+    BOOL  bRet = FALSE;\r
+    DWORD dwBytes;\r
+    HANDLE Handle = INVALID_HANDLE_VALUE;\r
+    CHAR PhyDrive[128];\r
+    GET_LENGTH_INFORMATION LengthInfo;\r
+    STORAGE_PROPERTY_QUERY Query;\r
+    STORAGE_DESCRIPTOR_HEADER DevDescHeader;\r
+    STORAGE_DEVICE_DESCRIPTOR* pDevDesc = NULL;\r
+    STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR diskAlignment;\r
+    CHAR VendorId[128] = { 0 };\r
+    CHAR ProductId[128] = { 0 };\r
+    CHAR ProductRev[128] = { 0 };\r
+    CHAR SerialNumber[128] = { 0 };\r
+\r
+\r
+    safe_sprintf(PhyDrive, "\\\\.\\PhysicalDrive%d", pPhyDrive->PhyDrive);\r
+    Handle = CreateFileA(PhyDrive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);\r
+    if (Handle == INVALID_HANDLE_VALUE)\r
+    {\r
+        Log("Create file Handle:%p %s status:%u", Handle, PhyDrive, LASTERR);\r
+        return FALSE;\r
+    }\r
+\r
+    bRet = DeviceIoControl(Handle,\r
+        IOCTL_DISK_GET_LENGTH_INFO, NULL,\r
+        0,\r
+        &LengthInfo,\r
+        sizeof(LengthInfo),\r
+        &dwBytes,\r
+        NULL);\r
+    if (!bRet)\r
+    {\r
+        Log("DeviceIoControl IOCTL_DISK_GET_LENGTH_INFO failed error:%u", LASTERR);\r
+        return FALSE;\r
+    }\r
+\r
+    if (pPhyDrive->SizeInBytes != (ULONGLONG)LengthInfo.Length.QuadPart)\r
+    {\r
+        Log("PHYSICALDRIVE%d size not match %llu %llu", pPhyDrive->PhyDrive, (ULONGLONG)LengthInfo.Length.QuadPart,\r
+            (ULONGLONG)pPhyDrive->SizeInBytes);\r
+        CHECK_CLOSE_HANDLE(Handle);\r
+        return FALSE;\r
+    }\r
+\r
+    Query.PropertyId = StorageDeviceProperty;\r
+    Query.QueryType = PropertyStandardQuery;\r
+\r
+    bRet = DeviceIoControl(Handle,\r
+        IOCTL_STORAGE_QUERY_PROPERTY,\r
+        &Query,\r
+        sizeof(Query),\r
+        &DevDescHeader,\r
+        sizeof(STORAGE_DESCRIPTOR_HEADER),\r
+        &dwBytes,\r
+        NULL);\r
+    if (!bRet)\r
+    {\r
+        Log("DeviceIoControl1 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+        CHECK_CLOSE_HANDLE(Handle);\r
+        return FALSE;\r
+    }\r
+\r
+    if (DevDescHeader.Size < sizeof(STORAGE_DEVICE_DESCRIPTOR))\r
+    {\r
+        Log("Invalid DevDescHeader.Size:%u", DevDescHeader.Size);\r
+        CHECK_CLOSE_HANDLE(Handle);\r
+        return FALSE;\r
+    }\r
+\r
+    pDevDesc = (STORAGE_DEVICE_DESCRIPTOR*)malloc(DevDescHeader.Size);\r
+    if (!pDevDesc)\r
+    {\r
+        Log("failed to malloc error:%u len:%u", LASTERR, DevDescHeader.Size);\r
+        CHECK_CLOSE_HANDLE(Handle);\r
+        return FALSE;\r
+    }\r
+\r
+    bRet = DeviceIoControl(Handle,\r
+        IOCTL_STORAGE_QUERY_PROPERTY,\r
+        &Query,\r
+        sizeof(Query),\r
+        pDevDesc,\r
+        DevDescHeader.Size,\r
+        &dwBytes,\r
+        NULL);\r
+    if (!bRet)\r
+    {\r
+        Log("DeviceIoControl2 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+        free(pDevDesc);\r
+        goto out;\r
+    }\r
+\r
+\r
+\r
+    memset(&Query, 0, sizeof(STORAGE_PROPERTY_QUERY));\r
+    Query.PropertyId = StorageAccessAlignmentProperty;\r
+    Query.QueryType = PropertyStandardQuery;\r
+    memset(&diskAlignment, 0, sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR));\r
+\r
+    bRet = DeviceIoControl(Handle,\r
+        IOCTL_STORAGE_QUERY_PROPERTY,\r
+        &Query,\r
+        sizeof(STORAGE_PROPERTY_QUERY),\r
+        &diskAlignment,\r
+        sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR),\r
+        &dwBytes,\r
+        NULL);\r
+    if (!bRet)\r
+    {\r
+        Log("DeviceIoControl3 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+    }\r
+\r
+    if (pPhyDrive->DeviceType != pDevDesc->DeviceType ||\r
+        pPhyDrive->RemovableMedia != pDevDesc->RemovableMedia ||\r
+        pPhyDrive->BusType != pDevDesc->BusType ||\r
+        pPhyDrive->BytesPerLogicalSector != diskAlignment.BytesPerLogicalSector ||\r
+        pPhyDrive->BytesPerPhysicalSector != diskAlignment.BytesPerPhysicalSector\r
+        )\r
+    {\r
+        Log("Some properties not match DeviceType[%u %u] Removable[%u %u] BusType[%u %u] LogSec[%u %u] PhySec[%u %u]", \r
+            pPhyDrive->DeviceType, pDevDesc->DeviceType,\r
+            pPhyDrive->RemovableMedia, pDevDesc->RemovableMedia,\r
+            pPhyDrive->BusType, pDevDesc->BusType,\r
+            pPhyDrive->BytesPerLogicalSector, diskAlignment.BytesPerLogicalSector,\r
+            pPhyDrive->BytesPerPhysicalSector, diskAlignment.BytesPerPhysicalSector\r
+            );\r
+        goto out;\r
+    }\r
+\r
+    if (pDevDesc->VendorIdOffset)\r
+    {\r
+        safe_strcpy(VendorId, (char*)pDevDesc + pDevDesc->VendorIdOffset);\r
+        TrimString(VendorId);\r
+\r
+        if (strcmp(pPhyDrive->VendorId, VendorId))\r
+        {\r
+            Log("VendorId not match <%s %s>", pPhyDrive->VendorId, VendorId);\r
+            goto out;\r
+        }\r
+    }\r
+\r
+    if (pDevDesc->ProductIdOffset)\r
+    {\r
+        safe_strcpy(ProductId, (char*)pDevDesc + pDevDesc->ProductIdOffset);\r
+        TrimString(ProductId);\r
+\r
+        if (strcmp(pPhyDrive->ProductId, ProductId))\r
+        {\r
+            Log("ProductId not match <%s %s>", pPhyDrive->ProductId, ProductId);\r
+            goto out;\r
+        }\r
+    }\r
+\r
+    if (pDevDesc->ProductRevisionOffset)\r
+    {\r
+        safe_strcpy(ProductRev, (char*)pDevDesc + pDevDesc->ProductRevisionOffset);\r
+        TrimString(ProductRev);\r
+\r
+        if (strcmp(pPhyDrive->ProductRev, ProductRev))\r
+        {\r
+            Log("ProductRev not match <%s %s>", pPhyDrive->ProductRev, ProductRev);\r
+            goto out;\r
+        }\r
+    }\r
+\r
+    if (pDevDesc->SerialNumberOffset)\r
+    {\r
+        safe_strcpy(SerialNumber, (char*)pDevDesc + pDevDesc->SerialNumberOffset);\r
+        TrimString(SerialNumber);\r
+\r
+        if (strcmp(pPhyDrive->SerialNumber, SerialNumber))\r
+        {\r
+            Log("ProductRev not match <%s %s>", pPhyDrive->SerialNumber, SerialNumber);\r
+            goto out;\r
+        }\r
+    }\r
+\r
+    Log("PhyDrive%d ALL match, now continue", pPhyDrive->PhyDrive);\r
+\r
+    bRet = TRUE;\r
+\r
+out:\r
+    if (pDevDesc)\r
+    {\r
+        free(pDevDesc);\r
+    }\r
+\r
+    CHECK_CLOSE_HANDLE(Handle);\r
+\r
+    return bRet;\r
+}\r
 \r
 static HANDLE g_FatPhyDrive;\r
 static UINT64 g_Part2StartSec;\r
@@ -1225,7 +1443,45 @@ static int FormatPart1exFAT(UINT64 DiskSizeBytes)
     }\r
 }\r
 \r
+static int ZeroPart1FileSystem(HANDLE hDrive, UINT64 Part2StartSector)\r
+{\r
+    int i;\r
+    DWORD dwSize = 0;\r
+    LARGE_INTEGER liCurPos;\r
+    LARGE_INTEGER liNewPos;\r
+    CHAR TmpBuffer[1024] = { 0 };\r
+\r
+    liCurPos.QuadPart = VENTOY_PART1_START_SECTOR * 512;\r
+    liNewPos.QuadPart = 0;\r
+    if (0 == SetFilePointerEx(hDrive, liCurPos, &liNewPos, FILE_BEGIN) ||\r
+        liNewPos.QuadPart != liCurPos.QuadPart)\r
+    {\r
+        Log("SetFilePointerEx Failed %u %llu %llu", LASTERR, (ULONGLONG)liCurPos.QuadPart, (ULONGLONG)liNewPos.QuadPart);\r
+        return 1;\r
+    }\r
 \r
+    for (i = 0; i < 1024; i++)\r
+    {\r
+        WriteFile(hDrive, TmpBuffer, 1024, &dwSize, NULL);\r
+    }\r
+\r
+    liCurPos.QuadPart = (Part2StartSector * 512) - (1024 * 1024);\r
+    liNewPos.QuadPart = 0;\r
+    if (0 == SetFilePointerEx(hDrive, liCurPos, &liNewPos, FILE_BEGIN) ||\r
+        liNewPos.QuadPart != liCurPos.QuadPart)\r
+    {\r
+        Log("SetFilePointerEx Failed %u %llu %llu", LASTERR, (ULONGLONG)liCurPos.QuadPart, (ULONGLONG)liNewPos.QuadPart);\r
+        return 1;\r
+    }\r
+\r
+    for (i = 0; i < 1024; i++)\r
+    {\r
+        WriteFile(hDrive, TmpBuffer, 1024, &dwSize, NULL);\r
+    }\r
+\r
+    Log("Zero Part1 SUCCESS");\r
+    return 0;\r
+}\r
 \r
 int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter)\r
 {\r
@@ -1549,7 +1805,7 @@ int InstallVentoy2FileImage(PHY_DRIVE_INFO *pPhyDrive, int PartStyle)
         memset(pData, 0, 512);\r
 \r
         pMBR = (MBR_HEAD *)pData;\r
-        VentoyFillMBR(pPhyDrive->SizeInBytes, pMBR, PartStyle);\r
+        VentoyFillMBR(pPhyDrive->SizeInBytes, pMBR, PartStyle, 0x07);\r
         Part1StartSector = pMBR->PartTbl[0].StartSectorId;\r
         Part1SectorCount = pMBR->PartTbl[0].SectorCount;\r
         Part2StartSector = pMBR->PartTbl[1].StartSectorId;\r
@@ -1712,6 +1968,8 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId)
     UINT64 Part1SectorCount = 0;\r
     UINT64 Part2StartSector = 0;\r
     BOOL LargeFAT32 = FALSE;\r
+    BOOL DefaultExFAT = FALSE;\r
+    UINT8 FsFlag = 0x07;\r
 \r
        Log("#####################################################");\r
     Log("InstallVentoy2PhyDrive try%d %s PhyDrive%d <<%s %s %dGB>>", TryId,\r
@@ -1736,7 +1994,12 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId)
     }\r
     else\r
     {\r
-        VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle);\r
+        if (GetVentoyFsType() == VTOY_FS_FAT32)\r
+        {\r
+            FsFlag = 0x0C;\r
+        }\r
+\r
+        VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle, FsFlag);\r
         Part1StartSector = MBR.PartTbl[0].StartSectorId;\r
         Part1SectorCount = MBR.PartTbl[0].SectorCount;\r
         Part2StartSector = MBR.PartTbl[1].StartSectorId;\r
@@ -1824,15 +2087,25 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId)
             goto End;\r
         }\r
     }\r
+    else if (GetVentoyFsType() == VTOY_FS_EXFAT && GetClusterSize() == 0)\r
+    {\r
+        Log("Formatting part1 exFAT ...");\r
+        DefaultExFAT = TRUE;\r
+        if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))\r
+        {\r
+            Log("FormatPart1exFAT failed.");\r
+            rc = 1;\r
+            goto End;\r
+        }\r
+    }\r
     else\r
     {\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
+        if (0 != ZeroPart1FileSystem(hDrive, Part2StartSector))\r
         {\r
-            WriteFile(hDrive, TmpBuffer, 512, &dwSize, NULL);\r
+            Log("ZeroPart1FileSystem failed.");\r
+            rc = 1;\r
+            goto End;\r
         }\r
     }\r
 \r
@@ -1962,7 +2235,7 @@ End:
         Log("Close handle ...");\r
         CHECK_CLOSE_HANDLE(hDrive);\r
 \r
-        ReformatOK = FALSE;\r
+        ReformatOK = TRUE;\r
 \r
         if (state)\r
         {\r
@@ -1971,6 +2244,11 @@ End:
                 Log("No need to reformat for large FAT32");\r
                 pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
             }\r
+            else if (DefaultExFAT)\r
+            {\r
+                Log("No need to reformat for default exfat");\r
+                pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
+            }\r
             else\r
             {\r
                 bRet = DISK_FormatVolume(MountDrive, GetVentoyFsType(), Part1SectorCount * 512);\r
@@ -1983,7 +2261,6 @@ End:
 \r
                 if (bRet)\r
                 {\r
-                    ReformatOK = TRUE;\r
                     Log("Reformat %C:\\ to %s SUCCESS", MountDrive, GetVentoyFsName());\r
                     pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
 \r
@@ -1997,6 +2274,7 @@ End:
                 }\r
                 else\r
                 {\r
+                    ReformatOK = FALSE;\r
                     Log("Reformat %C:\\ to %s FAILED", MountDrive, GetVentoyFsName());\r
                 }\r
             }\r
@@ -2065,7 +2343,6 @@ int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)
        int rc = 1;\r
        int PhyDrive;\r
        int PartStyle;\r
-       INT64 ReservedValue;\r
        UINT64 RecudeBytes;\r
        GUID Guid;\r
        MBR_HEAD MBR;\r
@@ -2101,13 +2378,6 @@ int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)
        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
@@ -2250,7 +2520,7 @@ int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)
 \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
+               pGPT->PartTbl[1].Attr = VENTOY_EFI_PART_ATTR;\r
                memcpy(pGPT->PartTbl[1].Name, L"VTOYEFI", 7 * 2);\r
 \r
                //Update CRC\r
@@ -2291,30 +2561,37 @@ int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)
 \r
        Sleep(2000);\r
 \r
-       //Refresh disk list\r
-       PhyDrive = pPhyDrive->PhyDrive;\r
+    if (g_CLI_Mode)\r
+    {\r
+        Log("### Ventoy non-destructive CLI installation successfully finished.");\r
+    }\r
+    else\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
+        Log("#### Now Refresh PhyDrive ####");\r
+        Ventoy2DiskDestroy();\r
+        Ventoy2DiskInit();\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
+        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
-       InitComboxCtrl(g_DialogHwnd, PhyDrive);\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
 \r
        rc = 0;\r
 \r
@@ -2520,6 +2797,7 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int TryId)
        BOOL CleanDisk = FALSE;\r
        BOOL DelEFI = FALSE;\r
        BOOL bWriteBack = TRUE;\r
+       BOOL bUpdateEFIAttr = FALSE;\r
        HANDLE hVolume;\r
        HANDLE hDrive;\r
        DWORD Status;\r
@@ -2627,7 +2905,13 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int TryId)
        if (pPhyDrive->PartStyle == 1)\r
        {\r
                Log("TryId=%d EFI GPT partition type is 0x%llx", TryId, pPhyDrive->Part2GPTAttr);\r
-               PROGRESS_BAR_SET_POS(PT_DEL_ALL_PART);\r
+               PROGRESS_BAR_SET_POS(PT_DEL_ALL_PART);        \r
+\r
+        if (pGptInfo->PartTbl[1].Attr != VENTOY_EFI_PART_ATTR)\r
+        {\r
+            bUpdateEFIAttr = TRUE;            \r
+        }        \r
+\r
 \r
                if (TryId == 1)\r
                {\r
@@ -2640,8 +2924,8 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int TryId)
                }\r
                else if (TryId == 2)\r
                {\r
-                       Log("Change GPT partition attribute");\r
-                       if (DISK_ChangeVtoyEFIAttr(pPhyDrive->PhyDrive, StartSector * 512ULL, 0x8000000000000001))\r
+                       Log("Try2 Change GPT partition attribute to 0x%016llx", VENTOY_EFI_PART_ATTR & 0xFFFFFFFFFFFFFFFEULL);\r
+                       if (DISK_ChangeVtoyEFIAttr(pPhyDrive->PhyDrive, StartSector * 512ULL, VENTOY_EFI_PART_ATTR & 0xFFFFFFFFFFFFFFFEULL))\r
                        {\r
                                ChangeAttr = TRUE;\r
                                Sleep(2000);\r
@@ -2976,15 +3260,16 @@ End:
                DISK_ChangeVtoyEFI2Basic(pPhyDrive->PhyDrive, StartSector * 512);\r
     }\r
 \r
+\r
        if (pPhyDrive->PartStyle == 1)\r
        {\r
-               if (ChangeAttr || ((pPhyDrive->Part2GPTAttr >> 56) != 0xC0))\r
+               if (ChangeAttr || bUpdateEFIAttr)\r
                {\r
-                       Log("Change EFI partition attr %u <0x%llx> to <0x%llx>", ChangeAttr, pPhyDrive->Part2GPTAttr, 0xC000000000000001ULL);\r
-                       if (DISK_ChangeVtoyEFIAttr(pPhyDrive->PhyDrive, StartSector * 512ULL, 0xC000000000000001ULL))\r
+                       Log("Change EFI partition attr %u <0x%llx> to <0x%llx>", ChangeAttr, pGptInfo->PartTbl[1].Attr, VENTOY_EFI_PART_ATTR);\r
+                       if (DISK_ChangeVtoyEFIAttr(pPhyDrive->PhyDrive, StartSector * 512ULL, VENTOY_EFI_PART_ATTR))\r
                        {\r
                                Log("Change EFI partition attr success");\r
-                               pPhyDrive->Part2GPTAttr = 0xC000000000000001ULL;\r
+                               pPhyDrive->Part2GPTAttr = VENTOY_EFI_PART_ATTR;\r
                        }\r
                        else\r
                        {\r