return Letter;
}
+UINT64 GetVentoyEfiPartStartSector(HANDLE hDrive)
+{
+ BOOL bRet;
+ DWORD dwSize;
+ MBR_HEAD MBR;
+ VTOY_GPT_INFO *pGpt = NULL;
+ UINT64 StartSector = 0;
+
+ SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
+
+ bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);
+ Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);
+
+ if ((!bRet) || (dwSize != sizeof(MBR)))
+ {
+ 0;
+ }
+
+ if (MBR.PartTbl[0].FsFlag == 0xEE)
+ {
+ Log("GPT partition style");
+
+ pGpt = malloc(sizeof(VTOY_GPT_INFO));
+ if (!pGpt)
+ {
+ return 0;
+ }
+
+ SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
+ bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL);
+ if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO)))
+ {
+ Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR);
+ return 0;
+ }
+
+ StartSector = pGpt->PartTbl[1].StartLBA;
+ free(pGpt);
+ }
+ else
+ {
+ Log("MBR partition style");
+ StartSector = MBR.PartTbl[1].StartSectorId;
+ }
+
+ Log("GetVentoyEfiPart StartSector: %llu", StartSector);
+ return StartSector;
+}
+
int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
{
int rc = 1;
}
g_FatPhyDrive = hDrive;
- g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
+ g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);
Log("Parse FAT fs...");
}
g_FatPhyDrive = hDrive;
- g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
+ g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);
Log("Parse FAT fs...");
UINT8 reserved[256];
}ventoy_windows_data;
+
+
+typedef struct PART_TABLE
+{
+ UINT8 Active; // 0x00 0x80
+
+ UINT8 StartHead;
+ UINT16 StartSector : 6;
+ UINT16 StartCylinder : 10;
+
+ UINT8 FsFlag;
+
+ UINT8 EndHead;
+ UINT16 EndSector : 6;
+ UINT16 EndCylinder : 10;
+
+ UINT32 StartSectorId;
+ UINT32 SectorCount;
+}PART_TABLE;
+
+typedef struct MBR_HEAD
+{
+ UINT8 BootCode[446];
+ PART_TABLE PartTbl[4];
+ UINT8 Byte55;
+ UINT8 ByteAA;
+}MBR_HEAD;
+
+typedef struct VTOY_GPT_HDR
+{
+ CHAR Signature[8]; /* EFI PART */
+ UINT8 Version[4];
+ UINT32 Length;
+ UINT32 Crc;
+ UINT8 Reserved1[4];
+ UINT64 EfiStartLBA;
+ UINT64 EfiBackupLBA;
+ UINT64 PartAreaStartLBA;
+ UINT64 PartAreaEndLBA;
+ GUID DiskGuid;
+ UINT64 PartTblStartLBA;
+ UINT32 PartTblTotNum;
+ UINT32 PartTblEntryLen;
+ UINT32 PartTblCrc;
+ UINT8 Reserved2[420];
+}VTOY_GPT_HDR;
+
+typedef struct VTOY_GPT_PART_TBL
+{
+ GUID PartType;
+ GUID PartGuid;
+ UINT64 StartLBA;
+ UINT64 LastLBA;
+ UINT64 Attr;
+ UINT16 Name[36];
+}VTOY_GPT_PART_TBL;
+
+typedef struct VTOY_GPT_INFO
+{
+ MBR_HEAD MBR;
+ VTOY_GPT_HDR Head;
+ VTOY_GPT_PART_TBL PartTbl[128];
+}VTOY_GPT_INFO;
+
+
+
#pragma pack()
}\
}
+#define LASTERR GetLastError()
#endif