mirror of
https://github.com/ventoy/Ventoy.git
synced 2024-12-25 22:55:58 -05:00
fix a bug about injection plugin in GPT partition style.
This commit is contained in:
parent
89938e3c78
commit
d063dbb7f2
Binary file not shown.
Binary file not shown.
@ -244,7 +244,7 @@ int DumpGptInfo(VTOY_GPT_INFO *pGptInfo)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VENTOY_EFI_PART_ATTR 0xC000000000000001ULL
|
#define VENTOY_EFI_PART_ATTR 0x8000000000000001ULL
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
|
@ -513,6 +513,55 @@ static CHAR GetMountLogicalDrive(void)
|
|||||||
return Letter;
|
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 VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
|
||||||
{
|
{
|
||||||
int rc = 1;
|
int rc = 1;
|
||||||
@ -543,7 +592,7 @@ int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_FatPhyDrive = hDrive;
|
g_FatPhyDrive = hDrive;
|
||||||
g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
|
g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);
|
||||||
|
|
||||||
Log("Parse FAT fs...");
|
Log("Parse FAT fs...");
|
||||||
|
|
||||||
@ -778,7 +827,7 @@ static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_FatPhyDrive = hDrive;
|
g_FatPhyDrive = hDrive;
|
||||||
g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
|
g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);
|
||||||
|
|
||||||
Log("Parse FAT fs...");
|
Log("Parse FAT fs...");
|
||||||
|
|
||||||
|
@ -72,6 +72,72 @@ typedef struct ventoy_windows_data
|
|||||||
UINT8 reserved[256];
|
UINT8 reserved[256];
|
||||||
}ventoy_windows_data;
|
}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()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
@ -84,5 +150,6 @@ typedef struct ventoy_windows_data
|
|||||||
}\
|
}\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LASTERR GetLastError()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user