]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
fix a bug about injection plugin in GPT partition style.
authorlongpanda <admin@ventoy.net>
Fri, 24 Jul 2020 15:02:07 +0000 (23:02 +0800)
committerlongpanda <admin@ventoy.net>
Fri, 24 Jul 2020 15:02:24 +0000 (23:02 +0800)
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump64.exe
vtoygpt/vtoygpt.c
vtoyjump/vtoyjump/vtoyjump.c
vtoyjump/vtoyjump/vtoyjump.h

index 5cf9f3501b533b772efc923f18811e98a4f444a7..a2610ef0161e13baa0e826a62b339e8fe5a3ea3a 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ
index d03af3c2c88165145012fca2bd27da74aab4ce7b..7881e63a9a324a9e05fa02994cecd892a58c8bdd 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ
index 705f750d46b48de73a2ffe39baa3eeca188420d5..f9c953a2af968906210d75de9d73af7e95abd736 100644 (file)
@@ -244,7 +244,7 @@ int DumpGptInfo(VTOY_GPT_INFO *pGptInfo)
     return 0;
 }
 
-#define VENTOY_EFI_PART_ATTR   0xC000000000000001ULL
+#define VENTOY_EFI_PART_ATTR   0x8000000000000001ULL
 
 int main(int argc, const char **argv)
 {
index e4abc4f9095bb286a6c5b1f85ad855fc4eee0d81..ec671f59df64728bb250d78675d2826c7442a3a9 100644 (file)
@@ -513,6 +513,55 @@ static CHAR GetMountLogicalDrive(void)
        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;
@@ -543,7 +592,7 @@ int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
        }
 
        g_FatPhyDrive = hDrive;
-       g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
+       g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);
 
        Log("Parse FAT fs...");
 
@@ -778,7 +827,7 @@ static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)
     }
 
     g_FatPhyDrive = hDrive;
-    g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
+       g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);
 
     Log("Parse FAT fs...");
 
index b3699e646f2566c913af55c586f71decdc57d6f4..01b96eed1c5bea62c72fd666cc2e773c645cb530 100644 (file)
@@ -72,6 +72,72 @@ typedef struct ventoy_windows_data
     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()
 
 
@@ -84,5 +150,6 @@ typedef struct ventoy_windows_data
        }\
 }
 
+#define LASTERR     GetLastError()
 
 #endif