]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h
Ventoy2Disk update:
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / Ventoy2Disk.h
index f305ea03caadeeec33cf58478d4f6640caf4260b..8ba3d49be780db89b7aad37ec70f1bee4f8ad6d5 100644 (file)
-/******************************************************************************
- * Ventoy2Disk.h
- *
- * Copyright (c) 2020, longpanda <admin@ventoy.net>
- *
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __VENTOY2DISK_H__
-#define __VENTOY2DISK_H__
-
-#include <stdio.h>
-
-#define SIZE_1MB                    (1024 * 1024)
-#define VENTOY_EFI_PART_SIZE       (32 * SIZE_1MB)
-#define VENTOY_PART1_START_SECTOR    2048
-
-#define VENTOY_FILE_BOOT_IMG    "boot\\boot.img"
-#define VENTOY_FILE_STG1_IMG    "boot\\core.img.xz"
-#define VENTOY_FILE_DISK_IMG    "ventoy\\ventoy.disk.img.xz"
-#define VENTOY_FILE_LOG         "log.txt"
-#define VENTOY_FILE_VERSION     "ventoy\\version"
-
-#define DRIVE_ACCESS_TIMEOUT        15000              // How long we should retry drive access (in ms)
-#define DRIVE_ACCESS_RETRIES        150                        // How many times we should retry
-
-#define IsFileExist(Fmt, ...) IsPathExist(FALSE, Fmt, __VA_ARGS__)
-#define IsDirExist(Fmt, ...)  IsPathExist(TRUE, Fmt, __VA_ARGS__)
-
-#define safe_sprintf(dst, fmt, ...) sprintf_s(dst, sizeof(dst), fmt, __VA_ARGS__)
-#define safe_strcpy(dst, src)  strcpy_s(dst, sizeof(dst), src)
-
-#define CHECK_CLOSE_HANDLE(Handle) \
-{\
-    if (Handle != INVALID_HANDLE_VALUE) \
-    {\
-        CloseHandle(Handle); \
-        Handle = INVALID_HANDLE_VALUE; \
-    }\
-}
-
-#define LASTERR     GetLastError()
-
-#pragma pack(1)
-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 VENTOY_MAX_PHY_DRIVE  128
-
-typedef struct PHY_DRIVE_INFO
-{
-    int Id;
-    int PhyDrive;
-    int PartStyle;//0:MBR 1:GPT
-    UINT64 SizeInBytes;
-    BYTE DeviceType;
-    BOOL RemovableMedia;
-    CHAR VendorId[128];
-    CHAR ProductId[128];
-    CHAR ProductRev[128];
-    CHAR SerialNumber[128];
-    STORAGE_BUS_TYPE BusType;
-
-    int FirstDriveLetter;
-    CHAR VentoyVersion[32];
-
-}PHY_DRIVE_INFO;
-
-typedef enum PROGRESS_POINT
-{
-    PT_START = 0,
-    PT_LOCK_FOR_CLEAN,
-    PT_DEL_ALL_PART,
-    PT_LOCK_FOR_WRITE,
-    PT_FORMAT_PART1,
-    PT_LOCK_VOLUME = PT_FORMAT_PART1,
-    PT_FORMAT_PART2,
-
-    PT_WRITE_VENTOY_START,
-    PT_WRITE_VENTOY_FINISH = PT_WRITE_VENTOY_START + 32,
-
-    PT_WRITE_STG1_IMG,
-    PT_WRITE_PART_TABLE,
-    PT_MOUNT_VOLUME,
-
-    PT_FINISH
-}PROGRESS_POINT;
-
-#define PROGRESS_BAR_SET_POS(pos)  SetProgressBarPos(pos)
-
-extern PHY_DRIVE_INFO *g_PhyDriveList;
-extern DWORD g_PhyDriveCount;
-extern int g_ForceOperation;
-extern HWND g_ProgressBarHwnd;
-extern HFONT g_language_normal_font;
-extern HFONT g_language_bold_font;
-
-void Log(const char *Fmt, ...);
-BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);
-void DumpWindowsVersion(void);
-const CHAR* GetLocalVentoyVersion(void);
-const CHAR* ParseVentoyVersionFromString(CHAR *Buf);
-CHAR GetFirstUnusedDriveLetter(void);
-const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type);
-int VentoyGetLocalBootImg(MBR_HEAD *pMBR);
-int GetHumanReadableGBSize(UINT64 SizeBytes);
-void TrimString(CHAR *String);
-int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle);
-int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo);
-BOOL IsVentoyLogicalDrive(CHAR DriveLetter);
-int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue);
-int GetPhysicalDriveCount(void);
-int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);
-int GetPhyDriveByLogicalDrive(int DriveLetter);
-int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen);
-int Ventoy2DiskInit(void);
-int Ventoy2DiskDestroy(void);
-PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id);
-int ParseCmdLineOption(LPSTR lpCmdLine);
-int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle);
-int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);
-int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead);
-void SetProgressBarPos(int Pos);
-int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen);
-int INIT unxz(unsigned char *in, int in_size,
-    int(*fill)(void *dest, unsigned int size),
-    int(*flush)(void *src, unsigned int size),
-    unsigned char *out, int *in_used,
-    void(*error)(char *x));
-void disk_io_set_param(HANDLE Handle, UINT64 SectorCount);
-INT_PTR CALLBACK PartDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
-int GetReservedSpaceInMB(void);
-int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);
-int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);
-int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);
-UINT32 VentoyCrc32(void *Buffer, UINT32 Length);
-
-#define SET_FILE_POS(pos) \
-    liCurrentPosition.QuadPart = pos; \
-    SetFilePointerEx(hDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN)\
-
-
-#endif
+/******************************************************************************\r
+ * Ventoy2Disk.h\r
+ *\r
+ * Copyright (c) 2020, longpanda <admin@ventoy.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License as\r
+ * published by the Free Software Foundation; either version 3 of the\r
+ * License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+#ifndef __VENTOY2DISK_H__\r
+#define __VENTOY2DISK_H__\r
+\r
+#include <stdio.h>\r
+\r
+typedef enum VTOY_FS\r
+{\r
+    VTOY_FS_EXFAT = 0,\r
+    VTOY_FS_NTFS,\r
+    VTOY_FS_FAT32,\r
+    VTOY_FS_UDF,\r
+    VTOY_FS_BUTT\r
+}VTOY_FS;\r
+\r
+#define FAT32_MAX_LIMIT             (32 * 1073741824ULL)\r
+\r
+#define SIZE_1KB                                       (1024)\r
+#define SIZE_1GB                                       (1024 * 1024 * 1024)\r
+#define SIZE_1TB                                       (1024ULL * 1024ULL * 1024ULL * 1024ULL)\r
+#define SIZE_1MB                    (1024 * 1024)\r
+#define SIZE_2MB                    (2048 * 1024)\r
+#define VENTOY_EFI_PART_SIZE       (32 * SIZE_1MB)\r
+#define VENTOY_PART1_START_SECTOR    2048\r
+\r
+#define VENTOY_FILE_BOOT_IMG    "boot\\boot.img"\r
+#define VENTOY_FILE_STG1_IMG    "boot\\core.img.xz"\r
+#define VENTOY_FILE_DISK_IMG    "ventoy\\ventoy.disk.img.xz"\r
+#define VENTOY_FILE_LOG         "log.txt"\r
+#define VENTOY_FILE_VERSION     "ventoy\\version"\r
+\r
+#define DRIVE_ACCESS_TIMEOUT        15000              // How long we should retry drive access (in ms)\r
+#define DRIVE_ACCESS_RETRIES        150                        // How many times we should retry\r
+\r
+#define IsFileExist(Fmt, ...) IsPathExist(FALSE, Fmt, __VA_ARGS__)\r
+#define IsDirExist(Fmt, ...)  IsPathExist(TRUE, Fmt, __VA_ARGS__)\r
+\r
+#define safe_sprintf(dst, fmt, ...) sprintf_s(dst, sizeof(dst), fmt, __VA_ARGS__)\r
+#define safe_strcpy(dst, src)  strcpy_s(dst, sizeof(dst), src)\r
+\r
+#define CHECK_FREE(p) \\r
+{\\r
+    if (p)\\r
+    {\\r
+        free(p); \\r
+        (p) = NULL; \\r
+    }\\r
+}\r
+\r
+#define CHECK_CLOSE_HANDLE(Handle) \\r
+{\\r
+    if (Handle != INVALID_HANDLE_VALUE) \\r
+    {\\r
+        CloseHandle(Handle); \\r
+        Handle = INVALID_HANDLE_VALUE; \\r
+    }\\r
+}\r
+\r
+#define LASTERR     GetLastError()\r
+#define RET_LASTERR (ret ? 0 : LASTERR)\r
+\r
+#pragma pack(1)\r
+typedef struct PART_TABLE\r
+{\r
+    UINT8  Active; // 0x00  0x80\r
+\r
+    UINT8  StartHead;\r
+    UINT16 StartSector : 6;\r
+    UINT16 StartCylinder : 10;\r
+\r
+    UINT8  FsFlag;\r
+\r
+    UINT8  EndHead;\r
+    UINT16 EndSector : 6;\r
+    UINT16 EndCylinder : 10;\r
+\r
+    UINT32 StartSectorId;\r
+    UINT32 SectorCount;\r
+}PART_TABLE;\r
+\r
+typedef struct MBR_HEAD\r
+{\r
+    UINT8 BootCode[446];\r
+    PART_TABLE PartTbl[4];\r
+    UINT8 Byte55;\r
+    UINT8 ByteAA;\r
+}MBR_HEAD;\r
+\r
+typedef struct VTOY_GPT_HDR\r
+{\r
+    CHAR   Signature[8]; /* EFI PART */\r
+    UINT8  Version[4];\r
+    UINT32 Length;\r
+    UINT32 Crc;\r
+    UINT8  Reserved1[4];\r
+    UINT64 EfiStartLBA;\r
+    UINT64 EfiBackupLBA;\r
+    UINT64 PartAreaStartLBA;\r
+    UINT64 PartAreaEndLBA;\r
+    GUID   DiskGuid;\r
+    UINT64 PartTblStartLBA;\r
+    UINT32 PartTblTotNum;\r
+    UINT32 PartTblEntryLen;\r
+    UINT32 PartTblCrc;\r
+    UINT8  Reserved2[420];\r
+}VTOY_GPT_HDR;\r
+\r
+typedef struct VTOY_GPT_PART_TBL\r
+{\r
+    GUID   PartType;\r
+    GUID   PartGuid;\r
+    UINT64 StartLBA;\r
+    UINT64 LastLBA;\r
+    UINT64 Attr;\r
+    UINT16 Name[36];\r
+}VTOY_GPT_PART_TBL;\r
+\r
+typedef struct VTOY_GPT_INFO\r
+{\r
+    MBR_HEAD MBR;\r
+    VTOY_GPT_HDR Head;\r
+    VTOY_GPT_PART_TBL PartTbl[128];\r
+}VTOY_GPT_INFO;\r
+\r
+\r
+typedef struct ventoy_secure_data\r
+{\r
+    UINT8 magic1[16];     /* VENTOY_GUID */\r
+    UINT8 diskuuid[16];\r
+    UINT8 Checksum[16];\r
+    UINT8 adminSHA256[32];\r
+    UINT8 reserved[4000];\r
+    UINT8 magic2[16];     /* VENTOY_GUID */\r
+}ventoy_secure_data;\r
+\r
+\r
+#pragma pack()\r
+\r
+#define VENTOY_MAX_PHY_DRIVE  128\r
+\r
+typedef struct PHY_DRIVE_INFO\r
+{\r
+    int Id;\r
+    int PhyDrive;\r
+    int PartStyle;//0:MBR 1:GPT\r
+    UINT64 SizeInBytes;\r
+    BYTE DeviceType;\r
+    BOOL RemovableMedia;\r
+    CHAR VendorId[128];\r
+    CHAR ProductId[128];\r
+    CHAR ProductRev[128];\r
+    CHAR SerialNumber[128];\r
+    STORAGE_BUS_TYPE BusType;\r
+\r
+    CHAR DriveLetters[64];\r
+    \r
+    int  VentoyFsClusterSize;\r
+    CHAR VentoyFsType[16];\r
+    CHAR VentoyVersion[32];\r
+\r
+    BOOL SecureBootSupport;\r
+    MBR_HEAD MBR;\r
+    UINT64 Part2GPTAttr;\r
+\r
+       BOOL ResizeNoShrink;\r
+       UINT64 ResizeOldPart1Size;\r
+       CHAR Part1DriveLetter;\r
+    CHAR ResizeVolumeGuid[64];\r
+       CHAR FsName[64];\r
+       UINT64 ResizePart2StartSector;\r
+       VTOY_GPT_INFO Gpt;\r
+\r
+}PHY_DRIVE_INFO;\r
+\r
+typedef enum PROGRESS_POINT\r
+{\r
+    PT_START = 0,\r
+    PT_LOCK_FOR_CLEAN = 8,\r
+    PT_DEL_ALL_PART,\r
+    PT_LOCK_FOR_WRITE,\r
+    PT_FORMAT_PART1,\r
+    PT_LOCK_VOLUME = PT_FORMAT_PART1,\r
+    PT_FORMAT_PART2,\r
+\r
+    PT_WRITE_VENTOY_START,\r
+    PT_WRITE_VENTOY_FINISH = PT_WRITE_VENTOY_START + 32,\r
+\r
+    PT_WRITE_STG1_IMG,\r
+    PT_WRITE_PART_TABLE,\r
+    PT_MOUNT_VOLUME,\r
+\r
+    PT_REFORMAT_START,\r
+    PT_REFORMAT_FINISH = PT_REFORMAT_START + 2,\r
+\r
+    PT_FINISH\r
+}PROGRESS_POINT;\r
+\r
+#define PROGRESS_BAR_SET_POS(pos)  SetProgressBarPos(pos)\r
+\r
+extern PHY_DRIVE_INFO *g_PhyDriveList;\r
+extern DWORD g_PhyDriveCount;\r
+extern int g_ForceOperation;\r
+extern int g_NoNeedInputYes;\r
+extern HWND g_ProgressBarHwnd;\r
+extern HFONT g_language_normal_font;\r
+extern HFONT g_language_bold_font;\r
+extern int g_FilterUSB;\r
+\r
+\r
+\r
+void TraceOut(const char *Fmt, ...);\r
+void Log(const char *Fmt, ...);\r
+BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);\r
+void DumpWindowsVersion(void);\r
+const CHAR* GetLocalVentoyVersion(void);\r
+const CHAR* ParseVentoyVersionFromString(CHAR *Buf);\r
+CHAR GetFirstUnusedDriveLetter(void);\r
+const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type);\r
+int VentoyGetLocalBootImg(MBR_HEAD *pMBR);\r
+int GetHumanReadableGBSize(UINT64 SizeBytes);\r
+void TrimString(CHAR *String);\r
+int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle);\r
+int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo);\r
+BOOL IsVentoyLogicalDrive(CHAR DriveLetter);\r
+int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue);\r
+int GetPhysicalDriveCount(void);\r
+int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);\r
+int GetPhyDriveByLogicalDrive(int DriveLetter, UINT64*Offset);\r
+int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen, BOOL *pSecureBoot);\r
+int Ventoy2DiskInit(void);\r
+int Ventoy2DiskDestroy(void);\r
+PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id);\r
+PHY_DRIVE_INFO * GetPhyDriveInfoByPhyDrive(int PhyDrive);\r
+int ParseCmdLineOption(LPSTR lpCmdLine);\r
+int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle, int TryId);\r
+int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive);\r
+int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int TryId);\r
+int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead);\r
+int VentoyFillWholeGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo);\r
+void SetProgressBarPos(int Pos);\r
+int SaveBufToFile(const CHAR *FileName, const void *Buffer, int BufLen);\r
+int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen);\r
+int INIT unxz(unsigned char *in, int in_size,\r
+    int(*fill)(void *dest, unsigned int size),\r
+    int(*flush)(void *src, unsigned int size),\r
+    unsigned char *out, int *in_used,\r
+    void(*error)(char *x));\r
+void disk_io_set_param(HANDLE Handle, UINT64 SectorCount);\r
+int GetVolumeClusterSize(char Drive);\r
+\r
+extern BOOL g_InputYes;\r
+INT_PTR CALLBACK YesDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);\r
+INT_PTR CALLBACK PartDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);\r
+int GetReservedSpaceInMB(void);\r
+int IsPartNeed4KBAlign(void);\r
+int GetVentoyFsType(void);\r
+void SetVentoyFsType(int fs);\r
+int GetClusterSize(void);\r
+void SetClusterSize(int ClusterSize);\r
+WCHAR* GetClusterSizeTip(void);\r
+void FormatClusterSizeTip(int Size, WCHAR* pBuf, size_t len);\r
+const char* GetVentoyFsName(void);\r
+const char* GetVentoyFsNameByType(int fs);\r
+CHAR* GetVentoyFsFmtNameByTypeA(int fs);\r
+WCHAR* GetVentoyFsFmtNameByTypeW(int fs);\r
+int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);\r
+int VentoyFillMBRLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);\r
+int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);\r
+UINT32 VentoyCrc32(void *Buffer, UINT32 Length);\r
+BOOL PartResizePreCheck(PHY_DRIVE_INFO** ppPhyDrive);\r
+\r
+#define SET_FILE_POS(pos) \\r
+    liCurrentPosition.QuadPart = pos; \\r
+    SetFilePointerEx(hDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN)\\r
+\r
+extern int g_WriteImage;\r
+\r
+#define VTSI_IMG_MAGIC 0x0000594F544E4556ULL  // "VENTOY\0\0"\r
+\r
+#pragma pack(1)\r
+\r
+/*\r
+ +---------------------------------\r
+ + sector 0 ~ sector N-1\r
+ +     data area\r
+ +---------------------------------\r
+ + sector N ~ \r
+ +     segment[0]\r
+ +     segment[1]\r
+ +     segment[2]\r
+ +      ......\r
+ +     segment[M-1]\r
+ +     align data (aligned with 512)\r
+ +---------------------------------\r
+ +     footer\r
+ +---------------------------------\r
+ *\r
+ * All the integers are in little endian\r
+ * The sector size is fixed 512 for ventoy image file.\r
+ *\r
+ */\r
+\r
+#define VTSI_IMG_MAX_SEG   128\r
+\r
+typedef struct {\r
+    UINT64 disk_start_sector;\r
+    UINT64 sector_num;\r
+    UINT64 data_offset;\r
+}VTSI_SEGMENT;\r
+\r
+typedef struct {\r
+    UINT64 magic;\r
+    UINT32 version;\r
+    UINT64 disk_size;\r
+    UINT32 disk_signature;\r
+    UINT32 foot_chksum;\r
+\r
+    UINT32 segment_num;\r
+    UINT32 segment_chksum;\r
+    UINT64 segment_offset;\r
+\r
+    UINT8  reserved[512 - 44];\r
+}VTSI_FOOTER;\r
+#pragma pack()\r
+extern int __static_assert__[sizeof(VTSI_FOOTER) == 512 ? 1 : -1];\r
+\r
+extern HWND g_DialogHwnd;\r
+\r
+#define SAFE_FREE(ptr) if (ptr) { free(ptr); (ptr) = NULL; }\r
+int InstallVentoy2FileImage(PHY_DRIVE_INFO *pPhyDrive, int PartStyle);\r
+void disk_io_set_imghook(FILE *fp, VTSI_SEGMENT *segment, int maxseg, UINT64 data_offset);\r
+void disk_io_reset_imghook(int *psegnum, UINT64 *pDataOffset);\r
+\r
+HANDLE GetPhysicalHandle(int Drive, BOOLEAN bLockDrive, BOOLEAN bWriteAccess, BOOLEAN bWriteShare);\r
+void InitComboxCtrl(HWND hWnd, int PhyDrive);\r
+int disk_io_is_write_error(void);\r
+void disk_io_reset_write_error(void);\r
+const char* GUID2String(void* guid, char* buf, int len);\r
+\r
+#define VTSI_SUPPORT 1\r
+\r
+\r
+#endif\r