]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h
The gpt pointer is not initialized, and when offset < 0, it may result in freeing...
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / Ventoy2Disk.h
index 153141847372f659ba2c01daa857377ac09093ae..6106520d52cf3f9d37cfffc1088863cc295e3d0b 100644 (file)
 \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_FILE_LOG         "log.txt"\r
 #define VENTOY_FILE_VERSION     "ventoy\\version"\r
 \r
+#define VENTOY_CLI_LOG          "cli_log.txt"\r
+#define VENTOY_CLI_PERCENT      "cli_percent.txt"\r
+#define VENTOY_CLI_DONE         "cli_done.txt"\r
+\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 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
@@ -53,6 +81,7 @@
 }\r
 \r
 #define LASTERR     GetLastError()\r
+#define RET_LASTERR (ret ? 0 : LASTERR)\r
 \r
 #pragma pack(1)\r
 typedef struct PART_TABLE\r
@@ -147,18 +176,33 @@ typedef struct PHY_DRIVE_INFO
     CHAR SerialNumber[128];\r
     STORAGE_BUS_TYPE BusType;\r
 \r
-    CHAR DriveLetters[64];\r
+    DWORD BytesPerLogicalSector;\r
+    DWORD BytesPerPhysicalSector;\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,\r
+    PT_LOCK_FOR_CLEAN = 8,\r
     PT_DEL_ALL_PART,\r
     PT_LOCK_FOR_WRITE,\r
     PT_FORMAT_PART1,\r
@@ -172,6 +216,9 @@ typedef enum PROGRESS_POINT
     PT_WRITE_PART_TABLE,\r
     PT_MOUNT_VOLUME,\r
 \r
+    PT_REFORMAT_START,\r
+    PT_REFORMAT_FINISH = PT_REFORMAT_START + 16,\r
+\r
     PT_FINISH\r
 }PROGRESS_POINT;\r
 \r
@@ -180,12 +227,18 @@ typedef enum PROGRESS_POINT
 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
+void LogCache(BOOL cache);\r
+void LogFlush(void);\r
 BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);\r
 void DumpWindowsVersion(void);\r
 const CHAR* GetLocalVentoyVersion(void);\r
@@ -195,23 +248,27 @@ const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type);
 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 VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle, UINT8 FsFlag);\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
+BOOL VentoyPhydriveMatch(PHY_DRIVE_INFO* pPhyDrive);\r
 int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);\r
-int GetPhyDriveByLogicalDrive(int DriveLetter);\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);\r
-int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);\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
@@ -219,17 +276,124 @@ int INIT unxz(unsigned char *in, int in_size,
     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
+extern BOOL g_CLI_Mode;\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
+void VentoyStringToUpper(CHAR* str);\r
+BOOL AlertSuppressInit(void);\r
+void SetAlertPromptHookEnable(BOOL enable);\r
+int VentoyCLIMain(int argc, char** argv);\r
+BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD* pMBR, UINT64* Part2StartSector, UINT64* GptPart2Attr);\r
+int GetVentoyFsNameInPhyDrive(PHY_DRIVE_INFO* CurDrive);\r
+void CLISetReserveSpace(int MB);\r
+void CLI_UpdatePercent(int Pos);\r
+int GetLettersBelongPhyDrive(int PhyDrive, char* DriveLetters, size_t Length);\r
+PHY_DRIVE_INFO* CLI_PhyDrvInfo(void);\r
+\r
+#define UTF8_Log(fmt, wstr) \\r
+{\\r
+    memset(TmpPathA, 0, sizeof(TmpPathA));\\r
+    WideCharToMultiByte(CP_UTF8, 0, wstr, -1, TmpPathA, sizeof(TmpPathA), NULL, NULL);\\r
+    Log(fmt, TmpPathA);\\r
+}\r
+\r
+#define VTSI_SUPPORT 1\r
+\r
+\r
+#define WM_OFFSET        (WM_USER + 40)\r
+#define WM_WIDTH_CHANGE  (WM_OFFSET + 1)\r
+\r
+\r
+int ExpandDlg(HWND hParent, UINT uiID, int WidthDelta);\r
+int MoveDlg(HWND hParent, UINT uiID, int WidthDelta);\r
 \r
 #endif\r