diff --git a/VtoyTool/BabyISO/biso_9660.h b/VtoyTool/BabyISO/biso_9660.h
index 9bf33f65..2aaff28b 100644
--- a/VtoyTool/BabyISO/biso_9660.h
+++ b/VtoyTool/BabyISO/biso_9660.h
@@ -7,12 +7,12 @@
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
@@ -29,7 +29,7 @@
/* Volume Descriptor */
#define BISO_VD_TYPE_BOOT 0
-#define BISO_VD_TYPE_PVD 1
+#define BISO_VD_TYPE_PVD 1
#define BISO_VD_TYPE_SVD 2
#define BISO_VD_TYPE_PART 3
#define BISO_VD_TYPE_END 255
@@ -82,6 +82,15 @@
UINT32 uiData;\
UINT32 uiData##Swap;
+#define BISO_FILL_723(usData, usVal) \
+ usData = (UINT16)usVal; \
+ usData##Swap = __builtin_bswap16(usData)
+
+#define BISO_FILL_733(uiData, uiVal) \
+ uiData = (UINT32)uiVal; \
+ uiData##Swap = __builtin_bswap32(uiData)
+
+
#define BISO_PATHTBL_LOCATION(pstPVD) (pstPVD->uiTypeLPathTblLoc)
#elif (__BYTE_ORDER == __BIG_ENDIAN)
@@ -105,12 +114,12 @@
typedef struct tagBISO_DATE_915
{
UCHAR ucYear; /* 1900+ */
- UCHAR ucMonth;
- UCHAR ucDay;
- UCHAR ucHour;
- UCHAR ucMin;
- UCHAR ucSec;
- CHAR cTimeZone;
+ UCHAR ucMonth;
+ UCHAR ucDay;
+ UCHAR ucHour;
+ UCHAR ucMin;
+ UCHAR ucSec;
+ CHAR cTimeZone;
}BISO_DATE_915_S;
typedef struct tagBISO_PATH_TABLE
@@ -124,7 +133,7 @@ typedef struct tagBISO_PATH_TABLE
UINT16 usParentDirNum;
CHAR szDirName[1];
-
+
/* UCHAR ucPadding; */
}BISO_PATH_TABLE_S;
@@ -140,7 +149,7 @@ typedef struct tagBISO_DIR_RECORD
BISO_DEF_733(uiSize)
- BISO_DATE_915_S stDate;
+ BISO_DATE_915_S stDate;
UCHAR ucFlags;
@@ -160,7 +169,7 @@ typedef struct tagBISO_DIR_RECORD
#define BISO_DIR_RECORD_IS_PATH(pstDirRecord) \
((1 == ((pstDirRecord->ucFlags >> 1) & 0x01)) ? BOOL_TRUE : BOOL_FALSE)
-typedef struct tagBISO_VOLUME_DESC
+typedef struct tagBISO_VOLUME_DESC
{
UCHAR ucType;
@@ -183,8 +192,8 @@ typedef struct tagBISO_PRIMARY_VOLUME_DESC
/* ucResv1: unused1 [ISODCL ( 8, 8)] */
UCHAR ucResv1;
- /*
- * szSystemId[32]: system_id [ISODCL ( 9, 40)]
+ /*
+ * szSystemId[32]: system_id [ISODCL ( 9, 40)]
*/
CHAR szSystemId[32];
@@ -201,18 +210,18 @@ typedef struct tagBISO_PRIMARY_VOLUME_DESC
BISO_DEF_723(usVolumeSet)
- /*
- * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
+ /*
+ * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
*/
BISO_DEF_723(usVolumeSeq)
-
- /*
+
+ /*
* usBlockSize: logical_block_size [ISODCL (129, 132)]
*/
BISO_DEF_723(usBlockSize)
/*
- * uiPathTblSize: path_table_size [ISODCL (133, 140)]
+ * uiPathTblSize: path_table_size [ISODCL (133, 140)]
*/
BISO_DEF_733(uiPathTblSize)
@@ -221,50 +230,50 @@ typedef struct tagBISO_PRIMARY_VOLUME_DESC
UINT32 uiOptTypeLPathTblLoc;
UINT32 uiTypeMPathTblLoc;
-
+
UINT32 uiOptTypeMPathTblLoc;
BISO_DIR_RECORD_S stRootDirRecord;
/* szVolumeSetId: volume_set_id [ISODCL (191, 318)] */
CHAR szVolumeSetId[128];
-
+
/* szPublisherId: publisher_id [ISODCL (319, 446)] */
CHAR szPublisherId[128];
-
+
/* szPreparerId: preparer_id [ISODCL (447, 574)] */
CHAR szPreparerId[128];
-
+
/* szApplicationId: application_id [ISODCL (575, 702)] */
CHAR szApplicationId[128];
-
+
/* szCopyrightFileId: copyright_file_id [ISODCL (703, 739)] [1] */
CHAR szCopyrightFileId[37];
-
+
/* szAbstractFileId: abstract_file_id [ISODCL (740, 776)] */
CHAR szAbstractFileId[37];
-
+
/* szBibliographicFileId: bibliographic_file_id [ISODCL (777, 813)] */
CHAR szBibliographicFileId[37];
/* szCreationDate: creation_date [ISODCL (814, 830)] */
CHAR szCreationDate[17];
-
+
/* szModifyDate: modification_date [ISODCL (831, 847)] */
CHAR szModifyDate[17];
-
+
/* szExpirationDate: expiration_date [ISODCL (848, 864)] */
CHAR szExpirationDate[17];
-
+
/* szEffectiveDate: effective_date [ISODCL (865, 881)] */
CHAR szEffectiveDate[17];
-
+
/* ucFileStructVer: file_structure_version [ISODCL (882, 882)] */
UCHAR ucFileStructVer;
-
+
/* ucResv4: unused4 [ISODCL (883, 883)] */
UCHAR ucResv4;
-
+
/* aucApplicationData: application_data [ISODCL (884, 1395)] */
UCHAR aucApplicationData[512];
@@ -276,21 +285,21 @@ typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
{
UCHAR ucType;
- /*
- * szId[5]: id [ISODCL ( 2, 6)]
+ /*
+ * szId[5]: id [ISODCL ( 2, 6)]
*/
CHAR szId[5];
/* ucVersion: version [ISODCL ( 7, 7)] */
UCHAR ucVersion;
- /*
- * ucFlags: flags [ISODCL ( 8, 8)]
+ /*
+ * ucFlags: flags [ISODCL ( 8, 8)]
*/
UCHAR ucFlags;
- /*
- * szSystemId[32]: system_id [ISODCL ( 9, 40)]
+ /*
+ * szSystemId[32]: system_id [ISODCL ( 9, 40)]
*/
CHAR szSystemId[32];
@@ -300,8 +309,8 @@ typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
/* aucResv2[8]: unused2 [ISODCL ( 73, 80)] */
UCHAR aucResv2[8];
- /*
- * uiVolumeSpace: volume_space_size [ISODCL ( 81, 88)]
+ /*
+ * uiVolumeSpace: volume_space_size [ISODCL ( 81, 88)]
*/
BISO_DEF_733(uiVolumeSpace)
@@ -309,16 +318,16 @@ typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
UCHAR aucEscape[32];
/*
- * usVolumeSet: volume_set_size [ISODCL (121, 124)]
+ * usVolumeSet: volume_set_size [ISODCL (121, 124)]
*/
BISO_DEF_723(usVolumeSet)
- /*
- * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
+ /*
+ * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
*/
BISO_DEF_723(usVolumeSeq)
-
- /*
+
+ /*
* usBlockSize: logical_block_size [ISODCL (129, 132)]
*/
BISO_DEF_723(usBlockSize)
@@ -330,50 +339,50 @@ typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
UINT32 uiOptTypeLPathTblLoc;
UINT32 uiTypeMPathTblLoc;
-
+
UINT32 uiOptTypeMPathTblLoc;
BISO_DIR_RECORD_S stRootDirRecord;
/* szVolumeSetId: volume_set_id [ISODCL (191, 318)] */
CHAR szVolumeSetId[128];
-
+
/* szPublisherId: publisher_id [ISODCL (319, 446)] */
CHAR szPublisherId[128];
-
+
/* szPreparerId: preparer_id [ISODCL (447, 574)] */
CHAR szPreparerId[128];
-
+
/* szApplicationId: application_id [ISODCL (575, 702)] */
CHAR szApplicationId[128];
-
+
/* szCopyrightFileId: copyright_file_id [ISODCL (703, 739)] */
CHAR szCopyrightFileId[37];
-
+
/* szAbstractFileId: abstract_file_id [ISODCL (740, 776)]*/
CHAR szAbstractFileId[37];
-
+
/* szBibliographicFileId: bibliographic_file_id [ISODCL (777, 813)] */
CHAR szBibliographicFileId[37];
/* szCreationDate: creation_date [ISODCL (814, 830)]*/
CHAR szCreationDate[17];
-
+
/* szModifyDate: modification_date [ISODCL (831, 847)] */
CHAR szModifyDate[17];
-
+
/* szExpirationDate: expiration_date [ISODCL (848, 864)] */
CHAR szExpirationDate[17];
-
+
/* szEffectiveDate: effective_date [ISODCL (865, 881)] */
CHAR szEffectiveDate[17];
-
+
/* ucFileStructVer: file_structure_version [ISODCL (882, 882)] */
UCHAR ucFileStructVer;
-
+
/* ucResv4: unused4 [ISODCL (883, 883)] */
UCHAR ucResv4;
-
+
/* aucApplicationData: application_data [ISODCL (884, 1395)] */
UCHAR aucApplicationData[512];
@@ -384,8 +393,8 @@ typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
typedef struct tagBISO_BOOT_DESC
{
UCHAR ucType;
- /*
- * szId[5]: id [ISODCL ( 2, 6)]
+ /*
+ * szId[5]: id [ISODCL ( 2, 6)]
*/
CHAR szId[5];
@@ -430,7 +439,7 @@ typedef struct tagBISO_EXTATTR_RECORD
UCHAR aucResv[64];
BISO_DEF_723(usAppDataLen)
-
+
/* UCHAR aucAppData[xxx]; */
/* UCHAR aucEscape[xxx]; */
}BISO_EXTATTR_RECORD_S;
@@ -520,14 +529,14 @@ typedef struct tagBISO_PARSER
UCHAR ucRRIPSkipLen;
BISO_DIR_TREE_S stDirTree;
-
+
BISO_SVD_DIR_TREE_S stSVDDirTree;
}BISO_PARSER_S;
ULONG BISO_9660_OpenImage
(
IN BOOL_T bParseSVDDirTree,
- IN CONST CHAR *pcFileName,
+ IN CONST CHAR *pcFileName,
OUT BISO_PARSER_S *pstParser
);
BISO_PARSER_S * BISO_9660_CreateParser(VOID);
@@ -540,12 +549,12 @@ ULONG BISO_9660_ParseDate84261
VOID BISO_9660_FmtDate84261(IN time_t ulTime, IN UINT uiBufSize, OUT CHAR *pcDate);
VOID BISO_9660_FillDfsStack
(
- IN BISO_DIR_TREE_S *pstTop,
+ IN BISO_DIR_TREE_S *pstTop,
INOUT BISO_QUEUE_S *pstQueue
);
ULONG BISO_9660_ExtractFile
(
- IN BISO_FILE_S *pstFile,
+ IN BISO_FILE_S *pstFile,
IN CONST CHAR *pcDstFullPath,
IN CONST BISO_DIR_TREE_S *pstFileNode,
IN CONST BISO_EXTRACT_CTRL_S *pstCtrl
diff --git a/VtoyTool/vtoygpt.c b/VtoyTool/vtoygpt.c
new file mode 100644
index 00000000..f8a4f9cf
--- /dev/null
+++ b/VtoyTool/vtoygpt.c
@@ -0,0 +1,211 @@
+/******************************************************************************
+ * vtoygpt.c ---- ventoy gpt
+ *
+ * Copyright (c) 2026, longpanda
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static int verbose = 0;
+#define debug(fmt, ...) if(verbose) printf(fmt, ##__VA_ARGS__)
+
+
+#define VOID void
+#define CHAR char
+#define UINT64 unsigned long long
+#define UINT32 unsigned int
+#define UINT16 unsigned short
+#define CHAR16 unsigned short
+#define UINT8 unsigned char
+
+UINT32 VtoyCrc32(VOID *Buffer, UINT32 Length);
+
+#define COMPILE_ASSERT(expr) extern char __compile_assert[(expr) ? 1 : -1]
+
+#pragma pack(1)
+
+typedef struct PART_TABLE
+{
+ UINT8 Active;
+
+ 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 GUID
+{
+ UINT32 data1;
+ UINT16 data2;
+ UINT16 data3;
+ UINT8 data4[8];
+}GUID;
+
+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;
+
+COMPILE_ASSERT(sizeof(VTOY_GPT_HDR) == 512);
+
+typedef struct VTOY_GPT_PART_TBL
+{
+ GUID PartType;
+ GUID PartGuid;
+ UINT64 StartLBA;
+ UINT64 LastLBA;
+ UINT64 Attr;
+ CHAR16 Name[36];
+}VTOY_GPT_PART_TBL;
+COMPILE_ASSERT(sizeof(VTOY_GPT_PART_TBL) == 128);
+
+typedef struct VTOY_GPT_INFO
+{
+ MBR_HEAD MBR;
+ VTOY_GPT_HDR Head;
+ VTOY_GPT_PART_TBL PartTbl[128];
+}VTOY_GPT_INFO;
+
+typedef struct VTOY_BK_GPT_INFO
+{
+ VTOY_GPT_PART_TBL PartTbl[128];
+ VTOY_GPT_HDR Head;
+}VTOY_BK_GPT_INFO;
+
+COMPILE_ASSERT(sizeof(VTOY_GPT_INFO) == 512 * 34);
+COMPILE_ASSERT(sizeof(VTOY_BK_GPT_INFO) == 512 * 33);
+
+#pragma pack()
+
+static void dump_gpt_partuuid(int fd, int part)
+{
+ int i;
+ int start, end;
+ GUID *guid = NULL;
+ VTOY_GPT_INFO *pInfo = NULL;
+
+ pInfo = (VTOY_GPT_INFO *)malloc(sizeof(VTOY_GPT_INFO));
+
+ lseek(fd, 0, SEEK_SET);
+ read(fd, pInfo, sizeof(VTOY_GPT_INFO));
+
+ if (part >= 1 && part <= 128)
+ {
+ start = end = part;
+ }
+ else
+ {
+ start = 1;
+ end = 128;
+ }
+
+ for (i = start; i <= end; i++)
+ {
+ if (pInfo->PartTbl[i - 1].StartLBA == 0)
+ {
+ break;
+ }
+
+ guid = &(pInfo->PartTbl[i - 1].PartGuid);
+
+ printf("%d %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", i,
+ guid->data1, guid->data2, guid->data3,
+ guid->data4[0], guid->data4[1], guid->data4[2], guid->data4[3],
+ guid->data4[4], guid->data4[5], guid->data4[6], guid->data4[7]);
+ }
+}
+
+int vtoygpt_main(int argc, char **argv)
+{
+ int i;
+ int part;
+ int fd;
+
+ for (i = 0; i < argc; i++)
+ {
+ if (argv[i][0] == '-' && argv[i][1] == 'v')
+ {
+ verbose = 1;
+ break;
+ }
+ }
+
+ part = (int)strtol(argv[2], NULL, 10);
+
+ fd = open(argv[1], O_RDONLY);
+ if (fd < 0)
+ {
+ debug("Failed to open %s\n", argv[1]);
+ return 1;
+ }
+
+ dump_gpt_partuuid(fd, part);
+
+ close(fd);
+
+ return 0;
+}
+
+// wrapper main
+#ifndef BUILD_VTOY_TOOL
+int main(int argc, char **argv)
+{
+ return vtoygpt_main(argc, argv);
+}
+#endif
+
diff --git a/VtoyTool/vtoytool.c b/VtoyTool/vtoytool.c
index 48cd9ff3..db78a0bf 100644
--- a/VtoyTool/vtoytool.c
+++ b/VtoyTool/vtoytool.c
@@ -7,12 +7,12 @@
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
@@ -38,10 +38,11 @@ int vtoyloader_main(int argc, char **argv);
int vtoyvine_main(int argc, char **argv);
int vtoyksym_main(int argc, char **argv);
int vtoykmod_main(int argc, char **argv);
+int vtoygpt_main(int argc, char **argv);
int vtoyexpand_main(int argc, char **argv);
static char *g_vtoytool_name = NULL;
-static cmd_def g_cmd_list[] =
+static cmd_def g_cmd_list[] =
{
{ "vine_patch_loader", vtoyvine_main },
{ "vtoydump", vtoydump_main },
@@ -51,6 +52,7 @@ static cmd_def g_cmd_list[] =
{ "vtoyksym", vtoyksym_main },
{ "vtoykmod", vtoykmod_main },
{ "vtoyexpand", vtoyexpand_main },
+ { "vtoygpt", vtoygpt_main },
{ "--install", vtoytool_install },
};
@@ -60,7 +62,7 @@ int vtoytool_install(int argc, char **argv)
int i;
char toolpath[128];
char filepath[128];
-
+
for (i = 0; i < sizeof(g_cmd_list) / sizeof(g_cmd_list[0]); i++)
{
if (g_cmd_list[i].cmd[0] != '-')
@@ -70,14 +72,14 @@ int vtoytool_install(int argc, char **argv)
link(toolpath, filepath);
}
}
-
+
return 0;
}
int main(int argc, char **argv)
{
int i;
-
+
if ((g_vtoytool_name = strstr(argv[0], "vtoytool")) != NULL)
{
argc--;