1 /******************************************************************************
4 * Copyright (c) 2020, longpanda <admin@ventoy.net>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 3 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #ifndef __VENTOY2DISK_H__
22 #define __VENTOY2DISK_H__
35 #define FAT32_MAX_LIMIT (32 * 1073741824ULL)
37 #define VENTOY_EFI_PART_ATTR 0x8000000000000000ULL
40 #define SIZE_1KB (1024)
41 #define SIZE_1GB (1024 * 1024 * 1024)
42 #define SIZE_1TB (1024ULL * 1024ULL * 1024ULL * 1024ULL)
43 #define SIZE_1MB (1024 * 1024)
44 #define SIZE_2MB (2048 * 1024)
45 #define VENTOY_EFI_PART_SIZE (32 * SIZE_1MB)
46 #define VENTOY_PART1_START_SECTOR 2048
48 #define VENTOY_FILE_BOOT_IMG "boot\\boot.img"
49 #define VENTOY_FILE_STG1_IMG "boot\\core.img.xz"
50 #define VENTOY_FILE_DISK_IMG "ventoy\\ventoy.disk.img.xz"
51 #define VENTOY_FILE_LOG "log.txt"
52 #define VENTOY_FILE_VERSION "ventoy\\version"
54 #define VENTOY_CLI_LOG "cli_log.txt"
55 #define VENTOY_CLI_PERCENT "cli_percent.txt"
56 #define VENTOY_CLI_DONE "cli_done.txt"
59 #define DRIVE_ACCESS_TIMEOUT 15000 // How long we should retry drive access (in ms)
60 #define DRIVE_ACCESS_RETRIES 150 // How many times we should retry
62 #define IsFileExist(Fmt, ...) IsPathExist(FALSE, Fmt, __VA_ARGS__)
63 #define IsDirExist(Fmt, ...) IsPathExist(TRUE, Fmt, __VA_ARGS__)
65 #define safe_sprintf(dst, fmt, ...) sprintf_s(dst, sizeof(dst), fmt, __VA_ARGS__)
66 #define safe_strcpy(dst, src) strcpy_s(dst, sizeof(dst), src)
68 #define CHECK_FREE(p) \
77 #define CHECK_CLOSE_HANDLE(Handle) \
79 if (Handle != INVALID_HANDLE_VALUE) \
81 CloseHandle(Handle); \
82 Handle = INVALID_HANDLE_VALUE; \
86 #define LASTERR GetLastError()
87 #define RET_LASTERR (ret ? 0 : LASTERR)
90 typedef struct PART_TABLE
92 UINT8 Active
; // 0x00 0x80
95 UINT16 StartSector
: 6;
96 UINT16 StartCylinder
: 10;
101 UINT16 EndSector
: 6;
102 UINT16 EndCylinder
: 10;
104 UINT32 StartSectorId
;
108 typedef struct MBR_HEAD
111 PART_TABLE PartTbl
[4];
116 typedef struct VTOY_GPT_HDR
118 CHAR Signature
[8]; /* EFI PART */
125 UINT64 PartAreaStartLBA
;
126 UINT64 PartAreaEndLBA
;
128 UINT64 PartTblStartLBA
;
129 UINT32 PartTblTotNum
;
130 UINT32 PartTblEntryLen
;
132 UINT8 Reserved2
[420];
135 typedef struct VTOY_GPT_PART_TBL
145 typedef struct VTOY_GPT_INFO
149 VTOY_GPT_PART_TBL PartTbl
[128];
153 typedef struct ventoy_secure_data
155 UINT8 magic1
[16]; /* VENTOY_GUID */
158 UINT8 adminSHA256
[32];
159 UINT8 reserved
[4000];
160 UINT8 magic2
[16]; /* VENTOY_GUID */
166 #define VENTOY_MAX_PHY_DRIVE 128
168 typedef struct PHY_DRIVE_INFO
172 int PartStyle
;//0:MBR 1:GPT
178 CHAR ProductRev
[128];
179 CHAR SerialNumber
[128];
180 STORAGE_BUS_TYPE BusType
;
182 DWORD BytesPerLogicalSector
;
183 DWORD BytesPerPhysicalSector
;
185 CHAR DriveLetters
[64];
187 int VentoyFsClusterSize
;
188 CHAR VentoyFsType
[16];
189 CHAR VentoyVersion
[32];
191 BOOL SecureBootSupport
;
196 UINT64 ResizeOldPart1Size
;
197 CHAR Part1DriveLetter
;
198 CHAR ResizeVolumeGuid
[64];
200 UINT64 ResizePart2StartSector
;
205 typedef enum PROGRESS_POINT
208 PT_LOCK_FOR_CLEAN
= 8,
212 PT_LOCK_VOLUME
= PT_FORMAT_PART1
,
215 PT_WRITE_VENTOY_START
,
216 PT_WRITE_VENTOY_FINISH
= PT_WRITE_VENTOY_START
+ 32,
223 PT_REFORMAT_FINISH
= PT_REFORMAT_START
+ 16,
228 #define PROGRESS_BAR_SET_POS(pos) SetProgressBarPos(pos)
230 extern PHY_DRIVE_INFO
*g_PhyDriveList
;
231 extern DWORD g_PhyDriveCount
;
232 extern int g_ForceOperation
;
233 extern int g_NoNeedInputYes
;
234 extern HWND g_ProgressBarHwnd
;
235 extern HFONT g_language_normal_font
;
236 extern HFONT g_language_bold_font
;
237 extern int g_FilterUSB
;
241 void TraceOut(const char *Fmt
, ...);
242 void Log(const char *Fmt
, ...);
243 void LogCache(BOOL cache
);
245 BOOL
IsPathExist(BOOL Dir
, const char *Fmt
, ...);
246 void DumpWindowsVersion(void);
247 const CHAR
* GetLocalVentoyVersion(void);
248 const CHAR
* ParseVentoyVersionFromString(CHAR
*Buf
);
249 CHAR
GetFirstUnusedDriveLetter(void);
250 const CHAR
* GetBusTypeString(STORAGE_BUS_TYPE Type
);
251 int VentoyGetLocalBootImg(MBR_HEAD
*pMBR
);
252 int GetHumanReadableGBSize(UINT64 SizeBytes
);
253 void TrimString(CHAR
*String
);
254 int VentoyFillMBR(UINT64 DiskSizeBytes
, MBR_HEAD
*pMBR
, int PartStyle
, UINT8 FsFlag
);
255 int VentoyFillGpt(UINT64 DiskSizeBytes
, VTOY_GPT_INFO
*pInfo
);
256 BOOL
IsVentoyLogicalDrive(CHAR DriveLetter
);
257 int GetRegDwordValue(HKEY Key
, LPCSTR SubKey
, LPCSTR ValueName
, DWORD
*pValue
);
258 int GetPhysicalDriveCount(void);
259 BOOL
VentoyPhydriveMatch(PHY_DRIVE_INFO
* pPhyDrive
);
260 int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO
*pDriveList
, DWORD
*pDriveCount
);
261 int GetPhyDriveByLogicalDrive(int DriveLetter
, UINT64
*Offset
);
262 int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO
*pDriveInfo
, UINT64 Part2StartSector
, CHAR
*VerBuf
, size_t BufLen
, BOOL
*pSecureBoot
);
263 int Ventoy2DiskInit(void);
264 int Ventoy2DiskDestroy(void);
265 PHY_DRIVE_INFO
* GetPhyDriveInfoById(int Id
);
266 PHY_DRIVE_INFO
* GetPhyDriveInfoByPhyDrive(int PhyDrive
);
267 int ParseCmdLineOption(LPSTR lpCmdLine
);
268 int InstallVentoy2PhyDrive(PHY_DRIVE_INFO
*pPhyDrive
, int PartStyle
, int TryId
);
269 int PartitionResizeForVentoy(PHY_DRIVE_INFO
*pPhyDrive
);
270 int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO
*pPhyDrive
, int TryId
);
271 int VentoyFillBackupGptHead(VTOY_GPT_INFO
*pInfo
, VTOY_GPT_HDR
*pHead
);
272 int VentoyFillWholeGpt(UINT64 DiskSizeBytes
, VTOY_GPT_INFO
*pInfo
);
273 void SetProgressBarPos(int Pos
);
274 int SaveBufToFile(const CHAR
*FileName
, const void *Buffer
, int BufLen
);
275 int ReadWholeFileToBuf(const CHAR
*FileName
, int ExtLen
, void **Bufer
, int *BufLen
);
276 int INIT
unxz(unsigned char *in
, int in_size
,
277 int(*fill
)(void *dest
, unsigned int size
),
278 int(*flush
)(void *src
, unsigned int size
),
279 unsigned char *out
, int *in_used
,
280 void(*error
)(char *x
));
281 void disk_io_set_param(HANDLE Handle
, UINT64 SectorCount
);
282 int GetVolumeClusterSize(char Drive
);
284 extern BOOL g_InputYes
;
285 INT_PTR CALLBACK
YesDialogProc(HWND hWnd
, UINT Message
, WPARAM wParam
, LPARAM lParam
);
286 INT_PTR CALLBACK
PartDialogProc(HWND hWnd
, UINT Message
, WPARAM wParam
, LPARAM lParam
);
287 int GetReservedSpaceInMB(void);
288 int IsPartNeed4KBAlign(void);
289 int GetVentoyFsType(void);
290 void SetVentoyFsType(int fs
);
291 int GetClusterSize(void);
292 void SetClusterSize(int ClusterSize
);
293 WCHAR
* GetClusterSizeTip(void);
294 void FormatClusterSizeTip(int Size
, WCHAR
* pBuf
, size_t len
);
295 const char* GetVentoyFsName(void);
296 const char* GetVentoyFsNameByType(int fs
);
297 CHAR
* GetVentoyFsFmtNameByTypeA(int fs
);
298 WCHAR
* GetVentoyFsFmtNameByTypeW(int fs
);
299 int FindProcessOccupyDisk(HANDLE hDrive
, PHY_DRIVE_INFO
*pPhyDrive
);
300 int VentoyFillMBRLocation(UINT64 DiskSizeInBytes
, UINT32 StartSectorId
, UINT32 SectorCount
, PART_TABLE
*Table
);
301 int ClearVentoyFromPhyDrive(HWND hWnd
, PHY_DRIVE_INFO
*pPhyDrive
, char *pDrvLetter
);
302 UINT32
VentoyCrc32(void *Buffer
, UINT32 Length
);
303 BOOL
PartResizePreCheck(PHY_DRIVE_INFO
** ppPhyDrive
);
305 #define SET_FILE_POS(pos) \
306 liCurrentPosition.QuadPart = pos; \
307 SetFilePointerEx(hDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN)\
309 extern int g_WriteImage;
311 #define VTSI_IMG_MAGIC 0x0000594F544E4556ULL // "VENTOY\0\0"
316 +---------------------------------
317 + sector 0 ~ sector N-1
319 +---------------------------------
326 + align data (aligned with 512)
327 +---------------------------------
329 +---------------------------------
331 * All the integers are in little endian
332 * The sector size is fixed 512 for ventoy image file.
336 #define VTSI_IMG_MAX_SEG 128
339 UINT64 disk_start_sector
;
348 UINT32 disk_signature
;
352 UINT32 segment_chksum
;
353 UINT64 segment_offset
;
355 UINT8 reserved
[512 - 44];
358 extern int __static_assert__
[sizeof(VTSI_FOOTER
) == 512 ? 1 : -1];
360 extern HWND g_DialogHwnd
;
362 extern BOOL g_CLI_Mode
;
364 #define SAFE_FREE(ptr) if (ptr) { free(ptr); (ptr) = NULL; }
365 int InstallVentoy2FileImage(PHY_DRIVE_INFO
*pPhyDrive
, int PartStyle
);
366 void disk_io_set_imghook(FILE *fp
, VTSI_SEGMENT
*segment
, int maxseg
, UINT64 data_offset
);
367 void disk_io_reset_imghook(int *psegnum
, UINT64
*pDataOffset
);
369 HANDLE
GetPhysicalHandle(int Drive
, BOOLEAN bLockDrive
, BOOLEAN bWriteAccess
, BOOLEAN bWriteShare
);
370 void InitComboxCtrl(HWND hWnd
, int PhyDrive
);
371 int disk_io_is_write_error(void);
372 void disk_io_reset_write_error(void);
373 const char* GUID2String(void* guid
, char* buf
, int len
);
374 void VentoyStringToUpper(CHAR
* str
);
375 BOOL
AlertSuppressInit(void);
376 void SetAlertPromptHookEnable(BOOL enable
);
377 int VentoyCLIMain(int argc
, char** argv
);
378 BOOL
IsVentoyPhyDrive(int PhyDrive
, UINT64 SizeBytes
, MBR_HEAD
* pMBR
, UINT64
* Part2StartSector
, UINT64
* GptPart2Attr
);
379 int GetVentoyFsNameInPhyDrive(PHY_DRIVE_INFO
* CurDrive
);
380 void CLISetReserveSpace(int MB
);
381 void CLI_UpdatePercent(int Pos
);
382 int GetLettersBelongPhyDrive(int PhyDrive
, char* DriveLetters
, size_t Length
);
383 PHY_DRIVE_INFO
* CLI_PhyDrvInfo(void);
385 #define UTF8_Log(fmt, wstr) \
387 memset(TmpPathA, 0, sizeof(TmpPathA));\
388 WideCharToMultiByte(CP_UTF8, 0, wstr, -1, TmpPathA, sizeof(TmpPathA), NULL, NULL);\
392 #define VTSI_SUPPORT 1
395 #define WM_OFFSET (WM_USER + 40)
396 #define WM_WIDTH_CHANGE (WM_OFFSET + 1)
399 int ExpandDlg(HWND hParent
, UINT uiID
, int WidthDelta
);
400 int MoveDlg(HWND hParent
, UINT uiID
, int WidthDelta
);