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
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
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
\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
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
}\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
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
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
}\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
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
Log("Close handle ...");\r
CHECK_CLOSE_HANDLE(hDrive);\r
\r
- ReformatOK = FALSE;\r
+ ReformatOK = TRUE;\r
\r
if (state)\r
{\r
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
\r
if (bRet)\r
{\r
- ReformatOK = TRUE;\r
Log("Reformat %C:\\ to %s SUCCESS", MountDrive, GetVentoyFsName());\r
pPhyDrive->VentoyFsClusterSize = GetVolumeClusterSize(MountDrive);\r
\r
}\r
else\r
{\r
+ ReformatOK = FALSE;\r
Log("Reformat %C:\\ to %s FAILED", MountDrive, GetVentoyFsName());\r
}\r
}\r
int rc = 1;\r
int PhyDrive;\r
int PartStyle;\r
- INT64 ReservedValue;\r
UINT64 RecudeBytes;\r
GUID Guid;\r
MBR_HEAD MBR;\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
\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
\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
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
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
}\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
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