}\r
\r
\r
-static DWORD GetVentoyVolumeName(int PhyDrive, UINT32 StartSectorId, CHAR *NameBuf, UINT32 BufLen, BOOL DelSlash)\r
+static DWORD GetVentoyVolumeName(int PhyDrive, UINT64 StartSectorId, CHAR *NameBuf, UINT32 BufLen, BOOL DelSlash)\r
{\r
size_t len;\r
BOOL bRet;\r
\r
PartOffset = 512ULL * StartSectorId;\r
\r
- Log("GetVentoyVolumeName PhyDrive %d SectorStart:%u PartOffset:%llu", PhyDrive, StartSectorId, (ULONGLONG)PartOffset);\r
+ Log("GetVentoyVolumeName PhyDrive %d SectorStart:%llu PartOffset:%llu", PhyDrive, (ULONGLONG)StartSectorId, (ULONGLONG)PartOffset);\r
\r
hVolume = FindFirstVolumeA(VolumeName, sizeof(VolumeName));\r
if (hVolume == INVALID_HANDLE_VALUE)\r
goto End;\r
}\r
\r
- // clear first and last 1MB space\r
- pTmpBuf = malloc(SIZE_1MB);\r
+ // clear first and last 2MB space\r
+ pTmpBuf = malloc(SIZE_2MB);\r
if (!pTmpBuf)\r
{\r
Log("Failed to alloc memory.");\r
rc = 1;\r
goto End;\r
}\r
- memset(pTmpBuf, 0, SIZE_1MB); \r
+ memset(pTmpBuf, 0, SIZE_2MB);\r
\r
SET_FILE_POS(512);\r
- bRet = WriteFile(hDrive, pTmpBuf, SIZE_1MB - 512, &dwSize, NULL);\r
+ bRet = WriteFile(hDrive, pTmpBuf, SIZE_2MB - 512, &dwSize, NULL);\r
Log("Write fisrt 1MB ret:%d size:%u err:%d", bRet, dwSize, LASTERR);\r
if (!bRet)\r
{\r
goto End;\r
}\r
\r
- SET_FILE_POS(SIZE_1MB);\r
- bRet = WriteFile(hDrive, pTmpBuf, SIZE_1MB, &dwSize, NULL);\r
+ SET_FILE_POS(pPhyDrive->SizeInBytes - SIZE_2MB);\r
+ bRet = WriteFile(hDrive, pTmpBuf, SIZE_2MB, &dwSize, NULL);\r
Log("Write 2nd 1MB ret:%d size:%u err:%d", bRet, dwSize, LASTERR);\r
if (!bRet)\r
{\r
}\r
\r
SET_FILE_POS(0);\r
- bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);\r
- Log("Read MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR);\r
- if (!bRet)\r
+\r
+ if (pPhyDrive->SizeInBytes > 2199023255552ULL)\r
{\r
- rc = 1;\r
- goto End;\r
- }\r
+ VTOY_GPT_INFO *pGptInfo;\r
+ VTOY_GPT_HDR BackupHead;\r
+ LARGE_INTEGER liCurrentPosition;\r
\r
- //clear boot code and partition table (reserved disk signature)\r
- memset(MBR.BootCode, 0, 440);\r
- memset(MBR.PartTbl, 0, sizeof(MBR.PartTbl));\r
+ pGptInfo = (VTOY_GPT_INFO *)pTmpBuf;\r
\r
- VentoyFillLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl);\r
+ VentoyFillWholeGpt(pPhyDrive->SizeInBytes, pGptInfo);\r
\r
- MBR.PartTbl[0].Active = 0x00; // bootable\r
- MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS\r
+ SET_FILE_POS(pPhyDrive->SizeInBytes - 512);\r
+ VentoyFillBackupGptHead(pGptInfo, &BackupHead);\r
+ if (!WriteFile(hDrive, &BackupHead, sizeof(VTOY_GPT_HDR), &dwSize, NULL))\r
+ {\r
+ rc = 1;\r
+ Log("Write GPT Backup Head Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError());\r
+ goto End;\r
+ }\r
\r
- SET_FILE_POS(0);\r
- bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL);\r
- Log("Write MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR);\r
- if (!bRet)\r
+ SET_FILE_POS(pPhyDrive->SizeInBytes - 512 * 33);\r
+ if (!WriteFile(hDrive, pGptInfo->PartTbl, sizeof(pGptInfo->PartTbl), &dwSize, NULL))\r
+ {\r
+ rc = 1;\r
+ Log("Write GPT Backup Part Table Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError());\r
+ goto End;\r
+ }\r
+\r
+ SET_FILE_POS(0);\r
+ if (!WriteFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL))\r
+ {\r
+ rc = 1;\r
+ Log("Write GPT Info Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError());\r
+ goto End;\r
+ }\r
+\r
+ Log("Write GPT Info OK ...");\r
+ }\r
+ else\r
{\r
- rc = 1;\r
- goto End;\r
+ bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);\r
+ Log("Read MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR);\r
+ if (!bRet)\r
+ {\r
+ rc = 1;\r
+ goto End;\r
+ }\r
+\r
+ //clear boot code and partition table (reserved disk signature)\r
+ memset(MBR.BootCode, 0, 440);\r
+ memset(MBR.PartTbl, 0, sizeof(MBR.PartTbl));\r
+\r
+ VentoyFillMBRLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl);\r
+\r
+ MBR.PartTbl[0].Active = 0x00; // bootable\r
+ MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS\r
+\r
+ SET_FILE_POS(0);\r
+ bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL);\r
+ Log("Write MBR ret:%d size:%u err:%d", bRet, dwSize, LASTERR);\r
+ if (!bRet)\r
+ {\r
+ rc = 1;\r
+ goto End;\r
+ }\r
}\r
\r
Log("Clear Ventoy successfully finished");\r
if (state != 1)\r
{\r
Log("need to mount ventoy part1...");\r
- if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, MBR.PartTbl[0].StartSectorId, DriveLetters, sizeof(DriveLetters), FALSE))\r
+ if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, 2048, DriveLetters, sizeof(DriveLetters), FALSE))\r
{\r
DriveName[0] = MountDrive;\r
bRet = SetVolumeMountPointA(DriveName, DriveLetters);\r
CHAR DriveLetters[MAX_PATH] = { 0 };\r
MBR_HEAD MBR;\r
VTOY_GPT_INFO *pGptInfo = NULL;\r
+ UINT64 Part1StartSector = 0;\r
+ UINT64 Part1SectorCount = 0;\r
+ UINT64 Part2StartSector = 0;\r
+\r
\r
Log("InstallVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>",\r
PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,\r
\r
PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);\r
\r
- VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle);//also used to format 1st partition in GPT mode\r
if (PartStyle)\r
{\r
VentoyFillGpt(pPhyDrive->SizeInBytes, pGptInfo);\r
+ Part1StartSector = pGptInfo->PartTbl[0].StartLBA;\r
+ Part1SectorCount = pGptInfo->PartTbl[0].LastLBA - Part1StartSector + 1;\r
+ Part2StartSector = pGptInfo->PartTbl[1].StartLBA;\r
+ }\r
+ else\r
+ {\r
+ VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle);\r
+ Part1StartSector = MBR.PartTbl[0].StartSectorId;\r
+ Part1SectorCount = MBR.PartTbl[0].SectorCount;\r
+ Part2StartSector = MBR.PartTbl[1].StartSectorId;\r
}\r
\r
Log("Lock disk for clean ............................. ");\r
//Refresh Drive Layout\r
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);\r
\r
- disk_io_set_param(hDrive, MBR.PartTbl[0].StartSectorId + MBR.PartTbl[0].SectorCount);\r
+ disk_io_set_param(hDrive, Part1StartSector + Part1SectorCount);// include the 2048 sector gap\r
\r
PROGRESS_BAR_SET_POS(PT_FORMAT_PART1);\r
\r
goto End;\r
}\r
\r
+ \r
+\r
PROGRESS_BAR_SET_POS(PT_FORMAT_PART2);\r
Log("Writing part2 FAT img ...");\r
- if (0 != FormatPart2Fat(hDrive, MBR.PartTbl[1].StartSectorId))\r
+ \r
+ if (0 != FormatPart2Fat(hDrive, Part2StartSector))\r
{\r
Log("FormatPart2Fat failed.");\r
rc = 1;\r
}\r
\r
Log("Write GPT Info OK ...");\r
- memcpy(&(pPhyDrive->MBR), &MBR, 512);\r
+ memcpy(&(pPhyDrive->MBR), &(pGptInfo->MBR), 512);\r
}\r
else\r
{\r
if (state != 1)\r
{\r
Log("need to mount ventoy part1...");\r
- if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, MBR.PartTbl[0].StartSectorId, DriveLetters, sizeof(DriveLetters), FALSE))\r
+ \r
+ if (0 == GetVentoyVolumeName(pPhyDrive->PhyDrive, Part1StartSector, DriveLetters, sizeof(DriveLetters), FALSE))\r
{\r
DriveName[0] = MountDrive;\r
bRet = SetVolumeMountPointA(DriveName, DriveLetters);\r
\r
Log("Lock volume for update .......................... ");\r
hVolume = INVALID_HANDLE_VALUE;\r
- Status = GetVentoyVolumeName(pPhyDrive->PhyDrive, (UINT32)StartSector, DriveLetters, sizeof(DriveLetters), TRUE);\r
+ Status = GetVentoyVolumeName(pPhyDrive->PhyDrive, StartSector, DriveLetters, sizeof(DriveLetters), TRUE);\r
if (ERROR_SUCCESS == Status)\r
{\r
Log("Now lock and dismount volume <%s>", DriveLetters);\r
}\r
\r
\r
-int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table)\r
+int VentoyFillMBRLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table)\r
{\r
BYTE Head;\r
BYTE Sector;\r
//Part1\r
PartStartSector = VENTOY_PART1_START_SECTOR;\r
PartSectorCount = DiskSectorCount - ReservedSector - VENTOY_EFI_PART_SIZE / 512 - PartStartSector;\r
- VentoyFillLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl);\r
+ VentoyFillMBRLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl);\r
\r
pMBR->PartTbl[0].Active = 0x80; // bootable\r
pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS\r
//Part2\r
PartStartSector += PartSectorCount;\r
PartSectorCount = VENTOY_EFI_PART_SIZE / 512;\r
- VentoyFillLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl + 1);\r
+ VentoyFillMBRLocation(DiskSizeBytes, PartStartSector, PartSectorCount, pMBR->PartTbl + 1);\r
\r
pMBR->PartTbl[1].Active = 0x00; \r
pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition\r
return 0;\r
}\r
\r
+int VentoyFillWholeGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo)\r
+{\r
+ UINT64 Part1SectorCount = 0;\r
+ UINT64 DiskSectorCount = DiskSizeBytes / 512;\r
+ VTOY_GPT_HDR *Head = &pInfo->Head;\r
+ VTOY_GPT_PART_TBL *Table = pInfo->PartTbl;\r
+ static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } };\r
+\r
+ VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR);\r
+\r
+ Part1SectorCount = DiskSectorCount - 33 - 2048;\r
+\r
+ memcpy(Head->Signature, "EFI PART", 8);\r
+ Head->Version[2] = 0x01;\r
+ Head->Length = 92;\r
+ Head->Crc = 0;\r
+ Head->EfiStartLBA = 1;\r
+ Head->EfiBackupLBA = DiskSectorCount - 1;\r
+ Head->PartAreaStartLBA = 34;\r
+ Head->PartAreaEndLBA = DiskSectorCount - 34;\r
+ CoCreateGuid(&Head->DiskGuid);\r
+ Head->PartTblStartLBA = 2;\r
+ Head->PartTblTotNum = 128;\r
+ Head->PartTblEntryLen = 128;\r
+\r
+\r
+ memcpy(&(Table[0].PartType), &WindowsDataPartType, sizeof(GUID));\r
+ CoCreateGuid(&(Table[0].PartGuid));\r
+ Table[0].StartLBA = 2048;\r
+ Table[0].LastLBA = 2048 + Part1SectorCount - 1;\r
+ Table[0].Attr = 0;\r
+ memcpy(Table[0].Name, L"Data", 4 * 2);\r
+\r
+ //Update CRC\r
+ Head->PartTblCrc = VentoyCrc32(Table, sizeof(pInfo->PartTbl));\r
+ Head->Crc = VentoyCrc32(Head, Head->Length);\r
+\r
+ return 0;\r
+}\r
\r
int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo)\r
{\r