STR_MENU_PART_STYLE, //29
STR_DISK_2TB_MBR_ERROR,//30
+ STR_SHOW_ALL_DEV, //31
+ STR_PART_ALIGN_4KB, //32
+ STR_WEB_COMMUNICATION_ERR, //33
+ STR_WEB_REMOTE_ABNORMAL, //34
+ STR_WEB_REQUEST_TIMEOUT, //35
+ STR_WEB_SERVICE_UNAVAILABLE, //36
+ STR_WEB_TOKEN_MISMATCH, //37
STR_ID_MAX
}STR_ID;
#define VTOY_MENU_PART_STYLE 0xA003
#define VTOY_MENU_PART_MBR 0xA004
#define VTOY_MENU_PART_GPT 0xA005
+#define VTOY_MENU_ALL_DEV 0xA006
typedef enum OPT_SUBMENU
OPT_SUBMENU_PART_STYLE,
OPT_SUBMENU_PART_CFG,
OPT_SUBMENU_CLEAR,
+ OPT_SUBMENU_ALL_DEV,
OPT_SUBMENU_MAX
}OPT_SUBMENU;
ReservedSector += 33; // backup GPT part table\r
}\r
\r
+ // check aligned with 4KB\r
+ if (IsPartNeed4KBAlign())\r
+ {\r
+ UINT64 sectors = DiskSizeBytes / 512;\r
+ if (sectors % 8)\r
+ {\r
+ Log("Disk need to align with 4KB %u", (UINT32)(sectors % 8));\r
+ ReservedSector += (UINT32)(sectors % 8);\r
+ }\r
+ }\r
+\r
Log("ReservedSector: %u", ReservedSector);\r
\r
//Part1\r
ReservedSector += ReservedValue * 2048;\r
}\r
\r
+ // check aligned with 4KB\r
+ if (IsPartNeed4KBAlign())\r
+ {\r
+ if (DiskSectorCount % 8)\r
+ {\r
+ Log("Disk need to align with 4KB %u", (UINT32)(DiskSectorCount % 8));\r
+ ReservedSector += (DiskSectorCount % 8);\r
+ }\r
+ }\r
+\r
Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048;\r
\r
memcpy(Head->Signature, "EFI PART", 8);\r
double Delta;\r
double GB = SizeBytes * 1.0 / 1000 / 1000 / 1000;\r
\r
+ if ((SizeBytes % 1073741824) == 0)\r
+ {\r
+ return (int)(SizeBytes / 1073741824);\r
+ }\r
+\r
for (i = 0; i < 12; i++)\r
{\r
if (Pow2 > GB)\r
PHY_DRIVE_INFO *g_PhyDriveList = NULL;\r
DWORD g_PhyDriveCount = 0;\r
static int g_FilterRemovable = 0;\r
-static int g_FilterUSB = 1;\r
+int g_FilterUSB = 1;\r
int g_ForceOperation = 1;\r
\r
int ParseCmdLineOption(LPSTR lpCmdLine)\r
return FALSE;\r
}\r
\r
+ if (pGpt->PartTbl[0].StartLBA != 2048)\r
+ {\r
+ Log("Part1 not match %llu", pGpt->PartTbl[0].StartLBA);\r
+ return FALSE;\r
+ }\r
+\r
+ PartSectorCount = VENTOY_EFI_PART_SIZE / 512;\r
+\r
+ if (pGpt->PartTbl[1].StartLBA != pGpt->PartTbl[0].LastLBA + 1 ||\r
+ (UINT32)(pGpt->PartTbl[1].LastLBA + 1 - pGpt->PartTbl[1].StartLBA) != PartSectorCount)\r
+ {\r
+ Log("Part2 not match [%llu %llu] [%llu %llu]",\r
+ pGpt->PartTbl[0].StartLBA, pGpt->PartTbl[0].LastLBA,\r
+ pGpt->PartTbl[1].StartLBA, pGpt->PartTbl[1].LastLBA);\r
+ return FALSE;\r
+ }\r
+\r
*Part2StartSector = pGpt->PartTbl[1].StartLBA;\r
\r
memcpy(pMBR, &(pGpt->MBR), sizeof(MBR_HEAD));\r
if (MBR.PartTbl[2].Active != 0x80 && MBR.PartTbl[3].Active != 0x80)\r
{\r
Log("Part3 and Part4 are both NOT active 0x%x 0x%x", MBR.PartTbl[2].Active, MBR.PartTbl[3].Active);\r
- return FALSE;\r
+ //return FALSE;\r
}\r
}\r
\r
extern HWND g_ProgressBarHwnd;\r
extern HFONT g_language_normal_font;\r
extern HFONT g_language_bold_font;\r
+extern int g_FilterUSB;\r
\r
void Log(const char *Fmt, ...);\r
BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);\r
void disk_io_set_param(HANDLE Handle, UINT64 SectorCount);\r
INT_PTR CALLBACK PartDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);\r
int GetReservedSpaceInMB(void);\r
+int IsPartNeed4KBAlign(void);\r
int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);\r
int VentoyFillMBRLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);\r
int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);\r