Compare commits

...

18 Commits

Author SHA1 Message Date
longpanda
e46e24dde7 1.0.78 release 2022-07-01 19:10:12 +08:00
longpanda
0b81845e42 .ventoyignore also works in F2 browser mode. 2022-06-30 23:28:14 +08:00
longpanda
3c621e4aca Update Super-UEFIinSecureBoot-Disk to v3.4 (#1695) 2022-06-27 22:33:20 +08:00
longpanda
aecc579fcc Fix the bug when booting latest KaOS. (#1696) 2022-06-27 22:19:11 +08:00
longpanda
598af7f45c Auto remove the redundant trailing slash when set directory path on VentoyPlugson page. 2022-06-27 19:42:18 +08:00
longpanda
24b05c0345 Fix the bug when booting latest KaOS. (#1696) 2022-06-27 09:23:34 +08:00
Balázs Meskó
6d72617ef6 Update Hungarian translation (#1693)
* Update Hungarian translation

* Fixed a typo in languages.json
2022-06-24 18:52:25 +08:00
gidano
351f15ff18 Add files via upload (#1681)
Update Hungarian translaton
2022-06-20 16:26:31 +08:00
longpanda
1ee65a60c2 Fix a bug when booting TrueNAS Core 13.0. (#1684) 2022-06-20 15:29:27 +08:00
longpanda
ecbf45defe Fix an issue when booting StorageCraft StorageProtect SPX. (#1683) 2022-06-19 21:31:27 +08:00
longpanda
b976923f00 1.0.77 release 2022-06-19 13:56:49 +08:00
StoyanDimitrov
8db8e07b61 Update Bulgarian translation (#1677) 2022-06-18 16:35:04 +08:00
longpanda
f200c14730 fix build error 2022-06-17 12:25:21 +08:00
longpanda
c090197717 Fix build error 2022-06-17 09:36:01 +08:00
longpanda
3ac17aa825 Fix the issue that install media not recognized when install Clear Linux. (#1674) 2022-06-16 22:49:04 +08:00
longpanda
595b9441e9 Support prameters expansion in auto install script. 2022-06-15 20:53:35 +08:00
longpanda
0f3d48b3d9 Fix the chain load memory alloc failure in UEFI mode. 2022-06-15 20:50:25 +08:00
longpanda
61f289aa8a Fix a bug when booting daphile-21.01 2022-06-14 13:33:59 +08:00
66 changed files with 2507 additions and 482 deletions

View File

@@ -21,7 +21,7 @@ body:
attributes: attributes:
label: Ventoy Version label: Ventoy Version
description: What version of ventoy are you running? description: What version of ventoy are you running?
placeholder: 1.0.76 placeholder: 1.0.78
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@@ -60,7 +60,7 @@ ventoy_grub_param_file_replace *g_file_replace_list = NULL;
ventoy_efi_file_replace g_efi_file_replace; ventoy_efi_file_replace g_efi_file_replace;
ventoy_grub_param_file_replace *g_img_replace_list = NULL; ventoy_grub_param_file_replace *g_img_replace_list = NULL;
ventoy_efi_file_replace g_img_file_replace; ventoy_efi_file_replace g_img_file_replace[VTOY_MAX_CONF_REPLACE];
CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH; CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
CONST CHAR16 gUdfEfiDriverPath[] = UDF_EFI_DRIVER_PATH; CONST CHAR16 gUdfEfiDriverPath[] = UDF_EFI_DRIVER_PATH;
@@ -829,6 +829,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
ventoy_grub_param *pGrubParam = NULL; ventoy_grub_param *pGrubParam = NULL;
EFI_LOADED_IMAGE_PROTOCOL *pImageInfo = NULL; EFI_LOADED_IMAGE_PROTOCOL *pImageInfo = NULL;
ventoy_chain_head *chain = NULL; ventoy_chain_head *chain = NULL;
ventoy_grub_param_file_replace *replace = NULL;
Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&pImageInfo); Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&pImageInfo);
if (EFI_ERROR(Status)) if (EFI_ERROR(Status))
@@ -926,18 +927,27 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
old_cnt > 3 ? g_file_replace_list->old_file_name[3] : "" old_cnt > 3 ? g_file_replace_list->old_file_name[3] : ""
); );
g_img_replace_list = &pGrubParam->img_replace;
ventoy_proc_img_replace_name(g_img_replace_list); for (i = 0; i < VTOY_MAX_CONF_REPLACE; i++)
old_cnt = g_img_replace_list->old_file_cnt; {
debug("img replace: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>", replace = pGrubParam->img_replace + i;
g_img_replace_list->magic, if (replace->magic == GRUB_IMG_REPLACE_MAGIC)
g_img_replace_list->new_file_virtual_id, {
old_cnt, ventoy_proc_img_replace_name(replace);
old_cnt > 0 ? g_img_replace_list->old_file_name[0] : "", old_cnt = replace->old_file_cnt;
old_cnt > 1 ? g_img_replace_list->old_file_name[1] : "", debug("img replace[%d]: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>",
old_cnt > 2 ? g_img_replace_list->old_file_name[2] : "", i, replace->magic,
old_cnt > 3 ? g_img_replace_list->old_file_name[3] : "" replace->new_file_virtual_id,
); old_cnt,
old_cnt > 0 ? replace->old_file_name[0] : "",
old_cnt > 1 ? replace->old_file_name[1] : "",
old_cnt > 2 ? replace->old_file_name[2] : "",
old_cnt > 3 ? replace->old_file_name[3] : ""
);
g_img_replace_list = pGrubParam->img_replace;
}
}
pPos = StrStr(pCmdLine, L"mem:"); pPos = StrStr(pCmdLine, L"mem:");
chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4); chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
@@ -1178,8 +1188,7 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
gST->ConIn->Reset(gST->ConIn, FALSE); gST->ConIn->Reset(gST->ConIn, FALSE);
} }
if ((g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC) || if ((g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC) || g_img_replace_list)
(g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC))
{ {
ventoy_wrapper_push_openvolume(pFile->OpenVolume); ventoy_wrapper_push_openvolume(pFile->OpenVolume);
pFile->OpenVolume = ventoy_wrapper_open_volume; pFile->OpenVolume = ventoy_wrapper_open_volume;

View File

@@ -244,6 +244,7 @@ typedef int (*grub_env_printf_pf)(const char *fmt, ...);
#pragma pack(1) #pragma pack(1)
#define VTOY_MAX_CONF_REPLACE 2
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF #define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF #define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF
@@ -270,7 +271,7 @@ typedef struct ventoy_grub_param
grub_env_get_pf grub_env_get; grub_env_get_pf grub_env_get;
grub_env_set_pf grub_env_set; grub_env_set_pf grub_env_set;
ventoy_grub_param_file_replace file_replace; ventoy_grub_param_file_replace file_replace;
ventoy_grub_param_file_replace img_replace; ventoy_grub_param_file_replace img_replace[VTOY_MAX_CONF_REPLACE];
grub_env_printf_pf grub_env_printf; grub_env_printf_pf grub_env_printf;
}ventoy_grub_param; }ventoy_grub_param;
@@ -400,7 +401,7 @@ extern ventoy_virt_chunk *g_virt_chunk;
extern UINT32 g_virt_chunk_num; extern UINT32 g_virt_chunk_num;
extern vtoy_block_data gBlockData; extern vtoy_block_data gBlockData;
extern ventoy_efi_file_replace g_efi_file_replace; extern ventoy_efi_file_replace g_efi_file_replace;
extern ventoy_efi_file_replace g_img_file_replace; extern ventoy_efi_file_replace g_img_file_replace[VTOY_MAX_CONF_REPLACE];
extern ventoy_sector_flag *g_sector_flag; extern ventoy_sector_flag *g_sector_flag;
extern UINT32 g_sector_flag_num; extern UINT32 g_sector_flag_num;
extern BOOLEAN gMemdiskMode; extern BOOLEAN gMemdiskMode;

View File

@@ -37,9 +37,6 @@
#include <Protocol/DriverBinding.h> #include <Protocol/DriverBinding.h>
#include <Ventoy.h> #include <Ventoy.h>
#define ASSIGN_REPLACE(This, replace) \
replace = (This->FlushEx == ventoy_wrapper_file_flush_ex) ? &g_efi_file_replace : &g_img_file_replace
UINT8 *g_iso_data_buf = NULL; UINT8 *g_iso_data_buf = NULL;
UINTN g_iso_buf_size = 0; UINTN g_iso_buf_size = 0;
BOOLEAN gMemdiskMode = FALSE; BOOLEAN gMemdiskMode = FALSE;
@@ -1251,13 +1248,96 @@ ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
/* Ex version */ /* Ex version */
STATIC EFI_STATUS EFIAPI STATIC EFI_STATUS EFIAPI
ventoy_wrapper_file_flush_ex_img(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) ventoy_wrapper_file_flush_ex_img0(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
{
(VOID)This;
(VOID)Token;
return EFI_SUCCESS;
}
/* Ex version */
STATIC EFI_STATUS EFIAPI
ventoy_wrapper_file_flush_ex_img1(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
{ {
(VOID)This; (VOID)This;
(VOID)Token; (VOID)Token;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
#define DEF_WRAP_FUNC(n) \
STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_flush_ex_img#n(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) \
{\
(VOID)This;\
(VOID)Token;\
return EFI_SUCCESS;\
}
#define ITEM_WRAP_FUNC(n) ventoy_wrapper_file_flush_ex_img#n
#if (VTOY_MAX_CONF_REPLACE > 2)
DEF_WRAP_FUNC(2);
#endif
#if (VTOY_MAX_CONF_REPLACE > 3)
DEF_WRAP_FUNC(3);
#endif
#if (VTOY_MAX_CONF_REPLACE > 4)
DEF_WRAP_FUNC(4);
#endif
#if (VTOY_MAX_CONF_REPLACE > 5)
DEF_WRAP_FUNC(5);
#endif
#if (VTOY_MAX_CONF_REPLACE > 6)
DEF_WRAP_FUNC(6);
#endif
#if (VTOY_MAX_CONF_REPLACE > 7)
DEF_WRAP_FUNC(7);
#endif
#if (VTOY_MAX_CONF_REPLACE > 8)
#error "VTOY_MAX_CONF_REPLACE overflow"
#endif
static EFI_FILE_FLUSH_EX g_img_flush_func[VTOY_MAX_CONF_REPLACE] =
{
ventoy_wrapper_file_flush_ex_img0,
ventoy_wrapper_file_flush_ex_img1,
#if (VTOY_MAX_CONF_REPLACE > 2)
ITEM_WRAP_FUNC(2),
#endif
#if (VTOY_MAX_CONF_REPLACE > 3)
ITEM_WRAP_FUNC(3),
#endif
#if (VTOY_MAX_CONF_REPLACE > 4)
ITEM_WRAP_FUNC(4),
#endif
#if (VTOY_MAX_CONF_REPLACE > 5)
ITEM_WRAP_FUNC(5),
#endif
#if (VTOY_MAX_CONF_REPLACE > 6)
ITEM_WRAP_FUNC(6),
#endif
#if (VTOY_MAX_CONF_REPLACE > 7)
ITEM_WRAP_FUNC(7),
#endif
};
STATIC ventoy_efi_file_replace *ventoy_wrapper_get_replace(EFI_FILE_HANDLE This)
{
UINTN i;
if (This->FlushEx == ventoy_wrapper_file_flush_ex)
{
return &g_efi_file_replace;
}
for (i = 0; i < VTOY_MAX_CONF_REPLACE; i++)
{
if (This->FlushEx == g_img_flush_func[i])
{
return g_img_file_replace + i;
}
}
return NULL;
}
STATIC EFI_STATUS EFIAPI STATIC EFI_STATUS EFIAPI
ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
@@ -1288,7 +1368,7 @@ ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
{ {
ventoy_efi_file_replace *replace = NULL; ventoy_efi_file_replace *replace = NULL;
ASSIGN_REPLACE(This, replace); replace = ventoy_wrapper_get_replace(This);
if (Position <= replace->FileSizeBytes) if (Position <= replace->FileSizeBytes)
{ {
@@ -1307,7 +1387,7 @@ ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position)
{ {
ventoy_efi_file_replace *replace = NULL; ventoy_efi_file_replace *replace = NULL;
ASSIGN_REPLACE(This, replace); replace = ventoy_wrapper_get_replace(This);
*Position = replace->CurPos; *Position = replace->CurPos;
@@ -1321,7 +1401,7 @@ ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, V
EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data; EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data;
ventoy_efi_file_replace *replace = NULL; ventoy_efi_file_replace *replace = NULL;
ASSIGN_REPLACE(This, replace); replace = ventoy_wrapper_get_replace(This);
debug("ventoy_wrapper_file_get_info ... %u", *Len); debug("ventoy_wrapper_file_get_info ... %u", *Len);
@@ -1356,7 +1436,7 @@ ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
UINTN ReadLen = *Len; UINTN ReadLen = *Len;
ventoy_efi_file_replace *replace = NULL; ventoy_efi_file_replace *replace = NULL;
ASSIGN_REPLACE(This, replace); replace = ventoy_wrapper_get_replace(This);
debug("ventoy_wrapper_file_read ... %u", *Len); debug("ventoy_wrapper_file_read ... %u", *Len);
@@ -1382,7 +1462,7 @@ ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN
return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer); return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer);
} }
STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, BOOLEAN Img) STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, BOOLEAN Img, UINTN Index)
{ {
File->Revision = EFI_FILE_PROTOCOL_REVISION2; File->Revision = EFI_FILE_PROTOCOL_REVISION2;
File->Open = ventoy_wrapper_fs_open; File->Open = ventoy_wrapper_fs_open;
@@ -1398,7 +1478,15 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, B
File->OpenEx = ventoy_wrapper_file_open_ex; File->OpenEx = ventoy_wrapper_file_open_ex;
File->ReadEx = ventoy_wrapper_file_read_ex; File->ReadEx = ventoy_wrapper_file_read_ex;
File->WriteEx = ventoy_wrapper_file_write_ex; File->WriteEx = ventoy_wrapper_file_write_ex;
File->FlushEx = Img ? ventoy_wrapper_file_flush_ex_img : ventoy_wrapper_file_flush_ex;
if (Img)
{
File->FlushEx = g_img_flush_func[Index];
}
else
{
File->FlushEx = ventoy_wrapper_file_flush_ex;
}
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@@ -1419,6 +1507,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
CHAR8 TmpName[256]; CHAR8 TmpName[256];
CHAR8 OldName[256]; CHAR8 OldName[256];
ventoy_virt_chunk *virt = NULL; ventoy_virt_chunk *virt = NULL;
ventoy_grub_param_file_replace *replace = NULL;
debug("## ventoy_wrapper_file_open <%s> ", Name); debug("## ventoy_wrapper_file_open <%s> ", Name);
@@ -1449,7 +1538,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
{ {
g_original_fclose(*New); g_original_fclose(*New);
*New = &g_efi_file_replace.WrapperHandle; *New = &g_efi_file_replace.WrapperHandle;
ventoy_wrapper_file_procotol(*New, FALSE); ventoy_wrapper_file_procotol(*New, FALSE, 0);
virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id; virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
@@ -1475,15 +1564,18 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
} }
} }
for (i = 0; g_img_replace_list && i < VTOY_MAX_CONF_REPLACE; i++)
if (g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC &&
g_img_replace_list->new_file_virtual_id < g_virt_chunk_num)
{ {
AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name); replace = g_img_replace_list + i;
for (j = 0; j < g_img_replace_list->old_file_cnt; j++) if (replace->magic != GRUB_IMG_REPLACE_MAGIC || replace->new_file_virtual_id >= g_virt_chunk_num)
{ {
AsciiStrCpyS(OldName, sizeof(OldName), g_img_replace_list[i].old_file_name[j]); continue;
}
AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name);
for (j = 0; j < replace->old_file_cnt; j++)
{
AsciiStrCpyS(OldName, sizeof(OldName), replace->old_file_name[j]);
if ((0 == AsciiStrCmp(OldName, TmpName)) || if ((0 == AsciiStrCmp(OldName, TmpName)) ||
(AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 && (AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 &&
AsciiStrCmp(OldName + 16, TmpName) == 0 AsciiStrCmp(OldName + 16, TmpName) == 0
@@ -1491,31 +1583,31 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
) )
{ {
g_original_fclose(*New); g_original_fclose(*New);
*New = &g_img_file_replace.WrapperHandle; *New = &(g_img_file_replace[i].WrapperHandle);
ventoy_wrapper_file_procotol(*New, TRUE); ventoy_wrapper_file_procotol(*New, TRUE, i);
virt = g_virt_chunk + g_img_replace_list->new_file_virtual_id; virt = g_virt_chunk + replace->new_file_virtual_id;
Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start); Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
g_img_file_replace.BlockIoSectorStart = virt->mem_sector_start; g_img_file_replace[i].BlockIoSectorStart = virt->mem_sector_start;
g_img_file_replace.FileSizeBytes = Sectors * 2048; g_img_file_replace[i].FileSizeBytes = Sectors * 2048;
if (gDebugPrint) if (gDebugPrint)
{ {
debug("## ventoy_wrapper_file_open2 <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name, debug("## ventoy_wrapper_file_open2 <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name,
g_img_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048); g_img_file_replace[i].BlockIoSectorStart, Sectors, Sectors * 2048);
sleep(3); sleep(3);
} }
return Status; return Status;
} }
} }
}
if (StrCmp(Name, L"\\loader\\entries") == 0) if (g_img_replace_list && StrCmp(Name, L"\\loader\\entries") == 0)
{ {
(*New)->Open = ventoy_wrapper_file_open; (*New)->Open = ventoy_wrapper_file_open;
}
} }
return Status; return Status;

View File

@@ -28,6 +28,8 @@ typedef int (*grub_env_set_pf)(const char *name, const char *val);
typedef const char * (*grub_env_get_pf)(const char *name); typedef const char * (*grub_env_get_pf)(const char *name);
typedef int (*grub_env_printf_pf)(const char *fmt, ...); typedef int (*grub_env_printf_pf)(const char *fmt, ...);
#define VTOY_MAX_CONF_REPLACE 2
typedef struct ventoy_grub_param_file_replace typedef struct ventoy_grub_param_file_replace
{ {
UINT32 magic; UINT32 magic;
@@ -41,7 +43,7 @@ typedef struct ventoy_grub_param
grub_env_get_pf grub_env_get; grub_env_get_pf grub_env_get;
grub_env_set_pf grub_env_set; grub_env_set_pf grub_env_set;
ventoy_grub_param_file_replace file_replace; ventoy_grub_param_file_replace file_replace;
ventoy_grub_param_file_replace img_replace; ventoy_grub_param_file_replace img_replace[VTOY_MAX_CONF_REPLACE];
grub_env_printf_pf grub_env_printf; grub_env_printf_pf grub_env_printf;
}ventoy_grub_param; }ventoy_grub_param;
#pragma pack() #pragma pack()

View File

@@ -38,6 +38,7 @@
#include <grub/memory.h> #include <grub/memory.h>
#ifdef GRUB_MACHINE_EFI #ifdef GRUB_MACHINE_EFI
#include <grub/efi/efi.h> #include <grub/efi/efi.h>
#include <grub/efi/memory.h>
#endif #endif
#include <grub/ventoy.h> #include <grub/ventoy.h>
#include "ventoy_def.h" #include "ventoy_def.h"
@@ -75,7 +76,44 @@ void ventoy_str_toupper(char *str)
} }
} }
char *ventoy_str_last(char *str, char ch)
{
char *pos = NULL;
char *last = NULL;
if (!str)
{
return NULL;
}
for (pos = str; *pos; pos++)
{
if (*pos == ch)
{
last = pos;
}
}
return last;
}
int ventoy_str_all_digit(const char *str)
{
if (NULL == str || 0 == *str)
{
return 0;
}
while (*str)
{
if (*str < '0' || *str > '9')
{
return 0;
}
}
return 1;
}
int ventoy_strcmp(const char *pattern, const char *str) int ventoy_strcmp(const char *pattern, const char *str)
{ {
@@ -135,6 +173,22 @@ int ventoy_is_efi_os(void)
return g_efi_os; return g_efi_os;
} }
void * ventoy_alloc_chain(grub_size_t size)
{
void *p = NULL;
p = grub_malloc(size);
#ifdef GRUB_MACHINE_EFI
if (!p)
{
p = grub_efi_allocate_any_pages(GRUB_EFI_BYTES_TO_PAGES(size));
}
#endif
return p;
}
static int ventoy_arch_mode_init(void) static int ventoy_arch_mode_init(void)
{ {
#ifdef GRUB_MACHINE_EFI #ifdef GRUB_MACHINE_EFI

View File

@@ -171,6 +171,11 @@ static int ventoy_browser_iterate_partition(struct grub_disk *disk, const grub_p
fs->fs_label(dev, &Label); fs->fs_label(dev, &Label);
if (ventoy_check_file_exist("(%s)/.ventoyignore", partname))
{
return 0;
}
if (g_tree_view_menu_style == 0) if (g_tree_view_menu_style == 0)
{ {
grub_snprintf(title, sizeof(title), "%-10s (%s,%s%d) [%s] %s %s", grub_snprintf(title, sizeof(title), "%-10s (%s,%s%d) [%s] %s %s",
@@ -311,6 +316,25 @@ static int ventoy_browser_valid_filename(const char *filename, int len, int *typ
return 1; return 1;
} }
static int ventoy_browser_check_ignore(const char *device, const char *root, const char *dir)
{
grub_file_t file;
char fullpath[1024] = {0};
grub_snprintf(fullpath, 1023, "(%s)%s/%s/.ventoyignore", device, root, dir);
file = grub_file_open(fullpath, GRUB_FILE_TYPE_NONE);
if (!file)
{
grub_errno = 0;
return 0;
}
else
{
grub_file_close(file);
return 1;
}
}
static int ventoy_browser_iterate_dir(const char *filename, const struct grub_dirhook_info *info, void *data) static int ventoy_browser_iterate_dir(const char *filename, const struct grub_dirhook_info *info, void *data)
{ {
int type; int type;
@@ -328,6 +352,11 @@ static int ventoy_browser_iterate_dir(const char *filename, const struct grub_di
return 0; return 0;
} }
if (ventoy_browser_check_ignore(g_menu_device, g_menu_path_buf, filename))
{
return 0;
}
node = grub_zalloc(sizeof(browser_node)); node = grub_zalloc(sizeof(browser_node));
if (!node) if (!node)
{ {

View File

@@ -45,6 +45,7 @@
#include <grub/charset.h> #include <grub/charset.h>
#include <grub/crypto.h> #include <grub/crypto.h>
#include <grub/lib/crc.h> #include <grub/lib/crc.h>
#include <grub/random.h>
#include <grub/ventoy.h> #include <grub/ventoy.h>
#include "ventoy_def.h" #include "ventoy_def.h"
#include "miniz.h" #include "miniz.h"
@@ -106,12 +107,14 @@ grub_uint32_t g_wimiso_size = 0;
int g_vhdboot_enable = 0; int g_vhdboot_enable = 0;
grub_uint64_t g_conf_replace_offset = 0;
grub_uint64_t g_svd_replace_offset = 0; grub_uint64_t g_svd_replace_offset = 0;
conf_replace *g_conf_replace_node = NULL;
grub_uint8_t *g_conf_replace_new_buf = NULL; int g_conf_replace_count = 0;
int g_conf_replace_new_len = 0; grub_uint64_t g_conf_replace_offset[VTOY_MAX_CONF_REPLACE] = { 0 };
int g_conf_replace_new_len_align = 0; conf_replace *g_conf_replace_node[VTOY_MAX_CONF_REPLACE] = { NULL };
grub_uint8_t *g_conf_replace_new_buf[VTOY_MAX_CONF_REPLACE] = { NULL };
int g_conf_replace_new_len[VTOY_MAX_CONF_REPLACE] = { 0 };
int g_conf_replace_new_len_align[VTOY_MAX_CONF_REPLACE] = { 0 };
int g_ventoy_disk_bios_id = 0; int g_ventoy_disk_bios_id = 0;
ventoy_gpt_info *g_ventoy_part_info = NULL; ventoy_gpt_info *g_ventoy_part_info = NULL;
@@ -482,7 +485,7 @@ static int ventoy_load_efiboot_template(char **buf, int *datalen, int *direntoff
return 0; return 0;
} }
static int ventoy_set_check_result(int ret) static int ventoy_set_check_result(int ret, const char *msg)
{ {
char buf[32]; char buf[32];
@@ -496,7 +499,8 @@ static int ventoy_set_check_result(int ret)
grub_printf(VTOY_WARNING"\n"); grub_printf(VTOY_WARNING"\n");
grub_printf(VTOY_WARNING"\n\n\n"); grub_printf(VTOY_WARNING"\n\n\n");
grub_printf("This is NOT a standard Ventoy device and is NOT supported (%d).\n\n", ret); grub_printf("This is NOT a standard Ventoy device and is NOT supported (%d).\n", ret);
grub_printf("Error message: <%s>\n\n", msg);
grub_printf("You should follow the instructions in https://www.ventoy.net to use Ventoy.\n"); grub_printf("You should follow the instructions in https://www.ventoy.net to use Ventoy.\n");
grub_printf("\n\nWill exit after 10 seconds ...... "); grub_printf("\n\nWill exit after 10 seconds ...... ");
@@ -522,7 +526,7 @@ static int ventoy_check_official_device(grub_device_t dev)
if (dev->disk == NULL || dev->disk->partition == NULL) if (dev->disk == NULL || dev->disk->partition == NULL)
{ {
return ventoy_set_check_result(1 | 0x1000); return ventoy_set_check_result(1 | 0x1000, "Internal Error");
} }
if (0 == ventoy_check_file_exist("(%s,2)/ventoy/ventoy.cpio", dev->disk->name) || if (0 == ventoy_check_file_exist("(%s,2)/ventoy/ventoy.cpio", dev->disk->name) ||
@@ -530,11 +534,17 @@ static int ventoy_check_official_device(grub_device_t dev)
0 == ventoy_check_file_exist("(%s,2)/tool/mount.exfat-fuse_aarch64", dev->disk->name)) 0 == ventoy_check_file_exist("(%s,2)/tool/mount.exfat-fuse_aarch64", dev->disk->name))
{ {
#ifndef GRUB_MACHINE_EFI #ifndef GRUB_MACHINE_EFI
if (0 == ventoy_check_file_exist("(ventoydisk)/ventoy/ventoy.cpio", dev->disk->name) || if (0 == ventoy_check_file_exist("(ventoydisk)/ventoy/ventoy.cpio", dev->disk->name))
0 == ventoy_check_file_exist("(ventoydisk)/grub/localboot.cfg", dev->disk->name) ||
0 == ventoy_check_file_exist("(ventoydisk)/tool/mount.exfat-fuse_aarch64", dev->disk->name))
{ {
return ventoy_set_check_result(2 | 0x1000); return ventoy_set_check_result(2 | 0x1000, "File ventoy/ventoy.cpio missing in VTOYEFI partition");
}
else if (0 == ventoy_check_file_exist("(ventoydisk)/grub/localboot.cfg", dev->disk->name))
{
return ventoy_set_check_result(2 | 0x1000, "File grub/localboot.cfg missing in VTOYEFI partition");
}
else if (0 == ventoy_check_file_exist("(ventoydisk)/tool/mount.exfat-fuse_aarch64", dev->disk->name))
{
return ventoy_set_check_result(2 | 0x1000, "File tool/mount.exfat-fuse_aarch64 missing in VTOYEFI partition");
} }
else else
{ {
@@ -554,19 +564,19 @@ static int ventoy_check_official_device(grub_device_t dev)
} }
if (!file) if (!file)
{ {
return ventoy_set_check_result(3 | 0x1000); return ventoy_set_check_result(3 | 0x1000, "File ventoy/ventoy.cpio open failed in VTOYEFI partition");
} }
if (NULL == grub_strstr(file->fs->name, "fat")) if (NULL == grub_strstr(file->fs->name, "fat"))
{ {
grub_file_close(file); grub_file_close(file);
return ventoy_set_check_result(4 | 0x1000); return ventoy_set_check_result(4 | 0x1000, "VTOYEFI partition is not FAT filesystem");
} }
partition = dev->disk->partition; partition = dev->disk->partition;
if (partition->number != 0 || partition->start != 2048) if (partition->number != 0 || partition->start != 2048)
{ {
return ventoy_set_check_result(5); return ventoy_set_check_result(5, "Ventoy partition is not start at 1MB");
} }
if (workaround) if (workaround)
@@ -578,7 +588,7 @@ static int ventoy_check_official_device(grub_device_t dev)
(PartTbl[1].LastLBA + 1 - PartTbl[1].StartLBA) != 65536) (PartTbl[1].LastLBA + 1 - PartTbl[1].StartLBA) != 65536)
{ {
grub_file_close(file); grub_file_close(file);
return ventoy_set_check_result(6); return ventoy_set_check_result(6, "Disk partition layout check failed.");
} }
} }
else else
@@ -588,7 +598,7 @@ static int ventoy_check_official_device(grub_device_t dev)
PartTbl[1].SectorCount != 65536) PartTbl[1].SectorCount != 65536)
{ {
grub_file_close(file); grub_file_close(file);
return ventoy_set_check_result(6); return ventoy_set_check_result(6, "Disk partition layout check failed.");
} }
} }
} }
@@ -599,7 +609,7 @@ static int ventoy_check_official_device(grub_device_t dev)
if ((partition->number != 1) || (partition->len != 65536) || (offset != partition->start)) if ((partition->number != 1) || (partition->len != 65536) || (offset != partition->start))
{ {
grub_file_close(file); grub_file_close(file);
return ventoy_set_check_result(7); return ventoy_set_check_result(7, "Disk partition layout check failed.");
} }
} }
@@ -611,21 +621,21 @@ static int ventoy_check_official_device(grub_device_t dev)
dev2 = grub_device_open(devname); dev2 = grub_device_open(devname);
if (!dev2) if (!dev2)
{ {
return ventoy_set_check_result(8); return ventoy_set_check_result(8, "Disk open failed");
} }
fs = grub_fs_probe(dev2); fs = grub_fs_probe(dev2);
if (!fs) if (!fs)
{ {
grub_device_close(dev2); grub_device_close(dev2);
return ventoy_set_check_result(9); return ventoy_set_check_result(9, "FS probe failed");
} }
fs->fs_label(dev2, &label); fs->fs_label(dev2, &label);
if ((!label) || grub_strncmp("VTOYEFI", label, 7)) if ((!label) || grub_strncmp("VTOYEFI", label, 7))
{ {
grub_device_close(dev2); grub_device_close(dev2);
return ventoy_set_check_result(10); return ventoy_set_check_result(10, "Partition name is not VTOYEFI");
} }
grub_device_close(dev2); grub_device_close(dev2);
@@ -635,7 +645,7 @@ static int ventoy_check_official_device(grub_device_t dev)
disk = grub_disk_open(dev->disk->name); disk = grub_disk_open(dev->disk->name);
if (!disk) if (!disk)
{ {
return ventoy_set_check_result(11); return ventoy_set_check_result(11, "Disk open failed");
} }
grub_memset(mbr, 0, 512); grub_memset(mbr, 0, 512);
@@ -644,10 +654,10 @@ static int ventoy_check_official_device(grub_device_t dev)
if (grub_memcmp(g_check_mbr_data, mbr, 0x30) || grub_memcmp(g_check_mbr_data + 0x30, mbr + 0x190, 16)) if (grub_memcmp(g_check_mbr_data, mbr, 0x30) || grub_memcmp(g_check_mbr_data + 0x30, mbr + 0x190, 16))
{ {
return ventoy_set_check_result(12); return ventoy_set_check_result(12, "MBR check failed");
} }
return ventoy_set_check_result(0); return ventoy_set_check_result(0, NULL);
} }
static int ventoy_check_ignore_flag(const char *filename, const struct grub_dirhook_info *info, void *data) static int ventoy_check_ignore_flag(const char *filename, const struct grub_dirhook_info *info, void *data)
@@ -3242,8 +3252,9 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s\n", args[0]); return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s\n", args[0]);
} }
g_conf_replace_node = NULL; g_conf_replace_count = 0;
g_conf_replace_offset = 0; grub_memset(g_conf_replace_node, 0, sizeof(g_conf_replace_node ));
grub_memset(g_conf_replace_offset, 0, sizeof(g_conf_replace_offset ));
if (g_img_chunk_list.chunk) if (g_img_chunk_list.chunk)
{ {
@@ -3286,11 +3297,15 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int i;
int n;
grub_uint64_t offset = 0; grub_uint64_t offset = 0;
grub_uint32_t align = 0; grub_uint32_t align = 0;
grub_file_t file = NULL; grub_file_t file = NULL;
conf_replace *node = NULL; conf_replace *node = NULL;
conf_replace *nodes[VTOY_MAX_CONF_REPLACE] = { NULL };
ventoy_grub_param_file_replace *replace = NULL;
(void)ctxt; (void)ctxt;
(void)argc; (void)argc;
(void)args; (void)args;
@@ -3302,68 +3317,294 @@ static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int arg
return 0; return 0;
} }
node = ventoy_plugin_find_conf_replace(args[1]); n = ventoy_plugin_find_conf_replace(args[1], nodes);
if (!node) if (!n)
{ {
debug("Conf replace not found for %s\n", args[1]); debug("Conf replace not found for %s\n", args[1]);
goto end; goto end;
} }
debug("Find conf replace for %s\n", args[1]); debug("Find %d conf replace for %s\n", n, args[1]);
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", node->orgconf); g_conf_replace_count = n;
if (file) for (i = 0; i < n; i++)
{ {
offset = grub_iso9660_get_last_file_dirent_pos(file); node = nodes[i];
grub_file_close(file);
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", node->orgconf);
if (file)
{
offset = grub_iso9660_get_last_file_dirent_pos(file);
grub_file_close(file);
}
else if (node->img > 0)
{
offset = 0;
}
else
{
debug("<(loop)%s> NOT exist\n", node->orgconf);
continue;
}
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[0], node->newconf);
if (!file)
{
debug("New config file <%s%s> NOT exist\n", args[0], node->newconf);
continue;
}
align = ((int)file->size + 2047) / 2048 * 2048;
if (align > vtoy_max_replace_file_size)
{
debug("New config file <%s%s> too big\n", args[0], node->newconf);
grub_file_close(file);
continue;
}
grub_file_read(file, g_conf_replace_new_buf[i], file->size);
grub_file_close(file);
g_conf_replace_new_len[i] = (int)file->size;
g_conf_replace_new_len_align[i] = align;
g_conf_replace_node[i] = node;
g_conf_replace_offset[i] = offset + 2;
if (node->img > 0)
{
replace = &(g_grub_param->img_replace[i]);
replace->magic = GRUB_IMG_REPLACE_MAGIC;
grub_snprintf(replace->old_file_name[replace->old_name_cnt], 256, "%s", node->orgconf);
replace->old_name_cnt++;
}
debug("conf_replace OK: newlen[%d]: %d img:%d\n", i, g_conf_replace_new_len[i], node->img);
} }
else if (node->img > 0)
end:
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static int ventoy_var_expand(int *record, int *flag, const char *var, char *expand, int len)
{
int i = 0;
int n = 0;
char c;
const char *ch = var;
*record = 0;
expand[0] = 0;
while (*ch)
{ {
offset = 0; if (*ch == '_' || (*ch >= '0' && *ch <= '9') || (*ch >= 'A' && *ch <= 'Z') || (*ch >= 'a' && *ch <= 'z'))
{
ch++;
n++;
}
else
{
debug("Invalid variable letter <%c>\n", *ch);
goto end;
}
}
if (n > 32)
{
debug("Invalid variable length:%d <%s>\n", n, var);
goto end;
}
if (grub_strncmp(var, "VT_", 3) == 0) /* built-in variables */
{
} }
else else
{ {
debug("<(loop)%s> NOT exist\n", node->orgconf); if (*flag == 0)
goto end; {
*flag = 1;
grub_printf("\n=================== Variables Expansion ===================\n\n");
}
grub_printf("<%s>: ", var);
grub_refresh();
while (i < (len - 1))
{
c = grub_getkey();
if ((c == '\n') || (c == '\r'))
{
if (i > 0)
{
grub_printf("\n");
grub_refresh();
*record = 1;
break;
}
}
else if (grub_isprint(c))
{
if (i + 1 < (len - 1))
{
grub_printf("%c", c);
grub_refresh();
expand[i++] = c;
expand[i] = 0;
}
}
else if (c == '\b')
{
if (i > 0)
{
expand[i - 1] = ' ';
grub_printf("\r<%s>: %s", var, expand);
expand[i - 1] = 0;
grub_printf("\r<%s>: %s", var, expand);
grub_refresh();
i--;
}
}
}
} }
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[0], node->newconf);
if (!file)
{
debug("New config file <%s%s> NOT exist\n", args[0], node->newconf);
goto end;
}
align = ((int)file->size + 2047) / 2048 * 2048;
if (align > vtoy_max_replace_file_size)
{
debug("New config file <%s%s> too big\n", args[0], node->newconf);
goto end;
}
grub_file_read(file, g_conf_replace_new_buf, file->size);
g_conf_replace_new_len = (int)file->size;
g_conf_replace_new_len_align = align;
g_conf_replace_node = node;
g_conf_replace_offset = offset + 2;
if (node->img > 0)
{
g_grub_param->img_replace.magic = GRUB_IMG_REPLACE_MAGIC;
g_grub_param->img_replace.old_name_cnt = 1;
grub_snprintf(g_grub_param->img_replace.old_file_name[0], 256, "%s", node->orgconf);
}
debug("conf_replace OK: newlen: %d\n", g_conf_replace_new_len);
end: end:
if (file) if (expand[0] == 0)
{ {
grub_file_close(file); grub_snprintf(expand, len, "$$%s$$", var);
} }
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
return 0;
}
static int ventoy_auto_install_var_expand(install_template *node)
{
int pos = 0;
int flag = 0;
int record = 0;
int newlen = 0;
char *start = NULL;
char *end = NULL;
char *newbuf = NULL;
char *curline = NULL;
char *nextline = NULL;
grub_uint8_t *code = NULL;
char value[512];
var_node *CurNode = NULL;
var_node *pVarList = NULL;
code = (grub_uint8_t *)node->filebuf;
if (node->filelen >= VTOY_SIZE_1MB)
{
debug("auto install script too long %d\n", node->filelen);
return 0;
}
if ((code[0] == 0xff && code[1] == 0xfe) || (code[0] == 0xfe && code[1] == 0xff))
{
debug("UCS-2 encoding NOT supported\n");
return 0;
}
start = grub_strstr(node->filebuf, "$$");
if (!start)
{
debug("no need to expand variable, no start.\n");
return 0;
}
end = grub_strstr(start + 2, "$$");
if (!end)
{
debug("no need to expand variable, no end.\n");
return 0;
}
newlen = grub_max(node->filelen * 10, VTOY_SIZE_128KB);
newbuf = grub_malloc(newlen);
if (!newbuf)
{
debug("Failed to alloc newbuf %d\n", newlen);
return 0;
}
for (curline = node->filebuf; curline; curline = nextline)
{
nextline = ventoy_get_line(curline);
start = grub_strstr(curline, "$$");
if (start)
{
end = grub_strstr(start + 2, "$$");
}
if (start && end)
{
*start = *end = 0;
VTOY_APPEND_NEWBUF(curline);
for (CurNode = pVarList; CurNode; CurNode = CurNode->next)
{
if (grub_strcmp(start + 2, CurNode->var) == 0)
{
grub_snprintf(value, sizeof(value) - 1, "%s", CurNode->val);
break;
}
}
if (!CurNode)
{
value[sizeof(value) - 1] = 0;
ventoy_var_expand(&record, &flag, start + 2, value, sizeof(value) - 1);
if (record)
{
CurNode = grub_zalloc(sizeof(var_node));
if (CurNode)
{
grub_snprintf(CurNode->var, sizeof(CurNode->var), "%s", start + 2);
grub_snprintf(CurNode->val, sizeof(CurNode->val), "%s", value);
CurNode->next = pVarList;
pVarList = CurNode;
}
}
}
VTOY_APPEND_NEWBUF(value);
VTOY_APPEND_NEWBUF(end + 2);
}
else
{
VTOY_APPEND_NEWBUF(curline);
}
if (pos > 0 && newbuf[pos - 1] == '\r')
{
newbuf[pos - 1] = '\n';
}
else
{
newbuf[pos++] = '\n';
}
}
grub_free(node->filebuf);
node->filebuf = newbuf;
node->filelen = pos;
while (pVarList)
{
CurNode = pVarList->next;
grub_free(pVarList);
pVarList = CurNode;
}
return 0;
} }
static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int argc, char **args)
@@ -3372,6 +3613,7 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar
int pos = 0; int pos = 0;
int defidx = 1; int defidx = 1;
char *buf = NULL; char *buf = NULL;
grub_file_t file = NULL;
char configfile[128]; char configfile[128];
install_template *node = NULL; install_template *node = NULL;
@@ -3440,6 +3682,34 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar
node->cursel = g_ventoy_last_entry - 1; node->cursel = g_ventoy_last_entry - 1;
grub_check_free(node->filebuf);
node->filelen = 0;
if (node->cursel >= 0 && node->cursel < node->templatenum)
{
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", ventoy_get_env("vtoy_iso_part"),
node->templatepath[node->cursel].path);
if (file)
{
node->filebuf = grub_malloc(file->size + 8);
if (node->filebuf)
{
grub_file_read(file, node->filebuf, file->size);
grub_file_close(file);
grub_memset(node->filebuf + file->size, 0, 8);
node->filelen = (int)file->size;
ventoy_auto_install_var_expand(node);
}
}
else
{
debug("Failed to open auto install script <%s%s>\n",
ventoy_get_env("vtoy_iso_part"), node->templatepath[node->cursel].path);
}
}
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
@@ -5687,6 +5957,7 @@ static grub_err_t ventoy_cmd_dump_rsv_page(grub_extcmd_context_t ctxt, int argc,
int ventoy_env_init(void) int ventoy_env_init(void)
{ {
int i;
char buf[64]; char buf[64];
grub_env_set("vtdebug_flag", ""); grub_env_set("vtdebug_flag", "");
@@ -5694,7 +5965,10 @@ int ventoy_env_init(void)
g_part_list_buf = grub_malloc(VTOY_PART_BUF_LEN); g_part_list_buf = grub_malloc(VTOY_PART_BUF_LEN);
g_tree_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF); g_tree_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
g_list_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF); g_list_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
g_conf_replace_new_buf = grub_malloc(vtoy_max_replace_file_size); for (i = 0; i < VTOY_MAX_CONF_REPLACE; i++)
{
g_conf_replace_new_buf[i] = grub_malloc(vtoy_max_replace_file_size);
}
ventoy_filt_register(0, ventoy_wrapper_open); ventoy_filt_register(0, ventoy_wrapper_open);

View File

@@ -36,11 +36,14 @@
#define VTOY_SIZE_512KB (512 * 1024) #define VTOY_SIZE_512KB (512 * 1024)
#define VTOY_SIZE_1KB 1024 #define VTOY_SIZE_1KB 1024
#define VTOY_SIZE_32KB (32 * 1024) #define VTOY_SIZE_32KB (32 * 1024)
#define VTOY_SIZE_128KB (128 * 1024)
#define JSON_SUCCESS 0 #define JSON_SUCCESS 0
#define JSON_FAILED 1 #define JSON_FAILED 1
#define JSON_NOT_FOUND 2 #define JSON_NOT_FOUND 2
#define WINDATA_FLAG_TEMPLATE 1
#define ulong unsigned long #define ulong unsigned long
#define ulonglong unsigned long long #define ulonglong unsigned long long
@@ -84,6 +87,16 @@
return (err);\ return (err);\
} }
#define VTOY_APPEND_NEWBUF(buf) \
{\
char *__c = buf;\
while (*__c)\
{\
newbuf[pos++] = *__c;\
__c++;\
}\
}
typedef enum VTOY_FILE_FLT typedef enum VTOY_FILE_FLT
{ {
VTOY_FILE_FLT_ISO = 0, /* .iso */ VTOY_FILE_FLT_ISO = 0, /* .iso */
@@ -488,6 +501,7 @@ typedef struct wim_tail
grub_uint8_t *jump_bin_data; grub_uint8_t *jump_bin_data;
grub_uint32_t bin_raw_len; grub_uint32_t bin_raw_len;
grub_uint32_t bin_align_len; grub_uint32_t bin_align_len;
grub_uint32_t windata_flag;
grub_uint8_t *new_meta_data; grub_uint8_t *new_meta_data;
grub_uint32_t new_meta_len; grub_uint32_t new_meta_len;
@@ -587,6 +601,7 @@ typedef struct chk_case_fs_dir
grub_fs_t fs; grub_fs_t fs;
}chk_case_fs_dir; }chk_case_fs_dir;
int ventoy_str_all_digit(const char *str);
int ventoy_strcmp(const char *pattern, const char *str); int ventoy_strcmp(const char *pattern, const char *str);
int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n); int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n);
void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param); void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param);
@@ -853,6 +868,9 @@ typedef struct install_template
int templatenum; int templatenum;
file_fullpath *templatepath; file_fullpath *templatepath;
char *filebuf;
int filelen;
struct install_template *next; struct install_template *next;
}install_template; }install_template;
@@ -942,7 +960,7 @@ typedef struct custom_boot
struct custom_boot *next; struct custom_boot *next;
}custom_boot; }custom_boot;
#define vtoy_max_replace_file_size (2 * 1024 * 1024) #define vtoy_max_replace_file_size (1024 * 1024)
typedef struct conf_replace typedef struct conf_replace
{ {
int pathlen; int pathlen;
@@ -1028,12 +1046,13 @@ extern int g_vhdboot_enable;
extern int g_plugin_image_list; extern int g_plugin_image_list;
extern ventoy_gpt_info *g_ventoy_part_info; extern ventoy_gpt_info *g_ventoy_part_info;
extern grub_uint64_t g_conf_replace_offset; extern int g_conf_replace_count;
extern grub_uint64_t g_conf_replace_offset[VTOY_MAX_CONF_REPLACE];
extern grub_uint64_t g_svd_replace_offset; extern grub_uint64_t g_svd_replace_offset;
extern conf_replace *g_conf_replace_node; extern conf_replace *g_conf_replace_node[VTOY_MAX_CONF_REPLACE];
extern grub_uint8_t *g_conf_replace_new_buf; extern grub_uint8_t *g_conf_replace_new_buf[VTOY_MAX_CONF_REPLACE];
extern int g_conf_replace_new_len; extern int g_conf_replace_new_len[VTOY_MAX_CONF_REPLACE];
extern int g_conf_replace_new_len_align; extern int g_conf_replace_new_len_align[VTOY_MAX_CONF_REPLACE];
extern int g_ventoy_disk_bios_id; extern int g_ventoy_disk_bios_id;
extern grub_uint64_t g_ventoy_disk_size; extern grub_uint64_t g_ventoy_disk_size;
extern grub_uint64_t g_ventoy_disk_part_size[2]; extern grub_uint64_t g_ventoy_disk_part_size[2];
@@ -1061,15 +1080,15 @@ extern grub_uint32_t g_ventoy_plat_data;
void ventoy_str_tolower(char *str); void ventoy_str_tolower(char *str);
void ventoy_str_toupper(char *str); void ventoy_str_toupper(char *str);
char * ventoy_get_line(char *start); char * ventoy_get_line(char *start);
char *ventoy_str_last(char *str, char ch);
int ventoy_cmp_img(img_info *img1, img_info *img2); int ventoy_cmp_img(img_info *img1, img_info *img2);
void ventoy_swap_img(img_info *img1, img_info *img2); void ventoy_swap_img(img_info *img1, img_info *img2);
char * ventoy_plugin_get_cur_install_template(const char *isopath); char * ventoy_plugin_get_cur_install_template(const char *isopath, install_template **cur);
install_template * ventoy_plugin_find_install_template(const char *isopath); install_template * ventoy_plugin_find_install_template(const char *isopath);
persistence_config * ventoy_plugin_find_persistent(const char *isopath); persistence_config * ventoy_plugin_find_persistent(const char *isopath);
grub_uint64_t ventoy_get_vtoy_partsize(int part); grub_uint64_t ventoy_get_vtoy_partsize(int part);
void ventoy_plugin_dump_injection(void); void ventoy_plugin_dump_injection(void);
void ventoy_plugin_dump_auto_install(void); void ventoy_plugin_dump_auto_install(void);
int ventoy_fill_windows_rtdata(void *buf, char *isopath);
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list); int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
const char * ventoy_plugin_get_injection(const char *isopath); const char * ventoy_plugin_get_injection(const char *isopath);
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath); const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
@@ -1077,7 +1096,7 @@ const menu_tip * ventoy_plugin_get_menu_tip(int type, const char *isopath);
const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path); const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path);
int ventoy_plugin_check_memdisk(const char *isopath); int ventoy_plugin_check_memdisk(const char *isopath);
int ventoy_plugin_get_image_list_index(int type, const char *name); int ventoy_plugin_get_image_list_index(int type, const char *name);
conf_replace * ventoy_plugin_find_conf_replace(const char *iso); int ventoy_plugin_find_conf_replace(const char *iso, conf_replace *nodes[VTOY_MAX_CONF_REPLACE]);
dud * ventoy_plugin_find_dud(const char *iso); dud * ventoy_plugin_find_dud(const char *iso);
int ventoy_plugin_load_dud(dud *node, const char *isopart); int ventoy_plugin_load_dud(dud *node, const char *isopart);
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start); int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
@@ -1191,6 +1210,14 @@ typedef struct browser_node
struct browser_node *next; struct browser_node *next;
}browser_node; }browser_node;
typedef struct var_node
{
char var[128];
char val[256];
struct var_node *next;
}var_node;
extern char *g_tree_script_buf; extern char *g_tree_script_buf;
extern int g_tree_script_pos; extern int g_tree_script_pos;
extern int g_tree_script_pre; extern int g_tree_script_pre;
@@ -1206,6 +1233,7 @@ grub_err_t ventoy_cmd_browser_dir(grub_extcmd_context_t ctxt, int argc, char **a
grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **args);
int ventoy_get_fs_type(const char *fs); int ventoy_get_fs_type(const char *fs);
int ventoy_img_name_valid(const char *filename, grub_size_t namelen); int ventoy_img_name_valid(const char *filename, grub_size_t namelen);
void * ventoy_alloc_chain(grub_size_t size);
#endif /* __VENTOY_DEF_H__ */ #endif /* __VENTOY_DEF_H__ */

View File

@@ -654,11 +654,18 @@ int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, co
static grub_uint32_t ventoy_linux_get_virt_chunk_count(void) static grub_uint32_t ventoy_linux_get_virt_chunk_count(void)
{ {
int i;
grub_uint32_t count = g_valid_initrd_count; grub_uint32_t count = g_valid_initrd_count;
if (g_conf_replace_offset > 0) if (g_conf_replace_count > 0)
{ {
count++; for (i = 0; i < g_conf_replace_count; i++)
{
if (g_conf_replace_offset[i] > 0)
{
count++;
}
}
} }
if (g_append_ext_sector > 0) if (g_append_ext_sector > 0)
@@ -671,13 +678,20 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_count(void)
static grub_uint32_t ventoy_linux_get_virt_chunk_size(void) static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
{ {
int i;
grub_uint32_t size; grub_uint32_t size;
size = (sizeof(ventoy_virt_chunk) + g_ventoy_cpio_size) * g_valid_initrd_count; size = (sizeof(ventoy_virt_chunk) + g_ventoy_cpio_size) * g_valid_initrd_count;
if (g_conf_replace_offset > 0) if (g_conf_replace_count > 0)
{ {
size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align; for (i = 0; i < g_conf_replace_count; i++)
{
if (g_conf_replace_offset[i] > 0)
{
size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align[i];
}
}
} }
if (g_append_ext_sector > 0) if (g_append_ext_sector > 0)
@@ -690,6 +704,7 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain) static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain)
{ {
int i = 0;
int id = 0; int id = 0;
int virtid = 0; int virtid = 0;
initrd_info *node; initrd_info *node;
@@ -699,6 +714,7 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
grub_uint32_t initrd_secs; grub_uint32_t initrd_secs;
char *override; char *override;
ventoy_virt_chunk *cur; ventoy_virt_chunk *cur;
ventoy_grub_param_file_replace *replace = NULL;
char name[32]; char name[32];
override = (char *)chain + chain->virt_chunk_offset; override = (char *)chain + chain->virt_chunk_offset;
@@ -764,30 +780,37 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
virtid++; virtid++;
} }
if (g_conf_replace_offset > 0) if (g_conf_replace_count > 0)
{ {
cpio_secs = g_conf_replace_new_len_align / 2048; for (i = 0; i < g_conf_replace_count; i++)
cur->mem_sector_start = sector;
cur->mem_sector_end = cur->mem_sector_start + cpio_secs;
cur->mem_sector_offset = offset;
cur->remap_sector_start = 0;
cur->remap_sector_end = 0;
cur->org_sector_start = 0;
grub_memcpy(override + offset, g_conf_replace_new_buf, g_conf_replace_new_len);
chain->virt_img_size_in_bytes += g_conf_replace_new_len_align;
if (g_grub_param->img_replace.magic == GRUB_IMG_REPLACE_MAGIC)
{ {
g_grub_param->img_replace.new_file_virtual_id = virtid; if (g_conf_replace_offset[i] > 0)
} {
cpio_secs = g_conf_replace_new_len_align[i] / 2048;
cur->mem_sector_start = sector;
cur->mem_sector_end = cur->mem_sector_start + cpio_secs;
cur->mem_sector_offset = offset;
cur->remap_sector_start = 0;
cur->remap_sector_end = 0;
cur->org_sector_start = 0;
offset += g_conf_replace_new_len_align; grub_memcpy(override + offset, g_conf_replace_new_buf[i], g_conf_replace_new_len[i]);
sector += cpio_secs;
cur++; chain->virt_img_size_in_bytes += g_conf_replace_new_len_align[i];
virtid++;
replace = g_grub_param->img_replace + i;
if (replace->magic == GRUB_IMG_REPLACE_MAGIC)
{
replace->new_file_virtual_id = virtid;
}
offset += g_conf_replace_new_len_align[i];
sector += cpio_secs;
cur++;
virtid++;
}
}
} }
return; return;
@@ -795,11 +818,18 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
static grub_uint32_t ventoy_linux_get_override_chunk_count(void) static grub_uint32_t ventoy_linux_get_override_chunk_count(void)
{ {
int i;
grub_uint32_t count = g_valid_initrd_count; grub_uint32_t count = g_valid_initrd_count;
if (g_conf_replace_offset > 0) if (g_conf_replace_count > 0)
{ {
count++; for (i = 0; i < g_conf_replace_count; i++)
{
if (g_conf_replace_offset[i] > 0)
{
count++;
}
}
} }
if (g_svd_replace_offset > 0) if (g_svd_replace_offset > 0)
@@ -812,11 +842,18 @@ static grub_uint32_t ventoy_linux_get_override_chunk_count(void)
static grub_uint32_t ventoy_linux_get_override_chunk_size(void) static grub_uint32_t ventoy_linux_get_override_chunk_size(void)
{ {
int i;
int count = g_valid_initrd_count; int count = g_valid_initrd_count;
if (g_conf_replace_offset > 0) if (g_conf_replace_count > 0)
{ {
count++; for (i = 0; i < g_conf_replace_count; i++)
{
if (g_conf_replace_offset[i] > 0)
{
count++;
}
}
} }
if (g_svd_replace_offset > 0) if (g_svd_replace_offset > 0)
@@ -829,6 +866,7 @@ static grub_uint32_t ventoy_linux_get_override_chunk_size(void)
static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *override) static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *override)
{ {
int i;
initrd_info *node; initrd_info *node;
grub_uint32_t mod; grub_uint32_t mod;
grub_uint32_t newlen; grub_uint32_t newlen;
@@ -883,23 +921,29 @@ static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *ove
cur++; cur++;
} }
if (g_conf_replace_offset > 0) if (g_conf_replace_count > 0)
{ {
cur->img_offset = g_conf_replace_offset; for (i = 0; i < g_conf_replace_count; i++)
cur->override_size = sizeof(ventoy_iso9660_override); {
if (g_conf_replace_offset[i] > 0)
{
cur->img_offset = g_conf_replace_offset[i];
cur->override_size = sizeof(ventoy_iso9660_override);
newlen = (grub_uint32_t)(g_conf_replace_new_len); newlen = (grub_uint32_t)(g_conf_replace_new_len[i]);
dirent = (ventoy_iso9660_override *)cur->override_data; dirent = (ventoy_iso9660_override *)cur->override_data;
dirent->first_sector = (grub_uint32_t)sector; dirent->first_sector = (grub_uint32_t)sector;
dirent->size = newlen; dirent->size = newlen;
dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector); dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector);
dirent->size_be = grub_swap_bytes32(dirent->size); dirent->size_be = grub_swap_bytes32(dirent->size);
sector += (dirent->size + 2047) / 2048; sector += (dirent->size + 2047) / 2048;
cur++; cur++;
}
}
} }
if (g_svd_replace_offset > 0) if (g_svd_replace_offset > 0)
{ {
cur->img_offset = g_svd_replace_offset; cur->img_offset = g_svd_replace_offset;
@@ -1211,6 +1255,7 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
grub_file_t file; grub_file_t file;
grub_file_t archfile; grub_file_t archfile;
grub_file_t tmpfile; grub_file_t tmpfile;
install_template *template_node = NULL;
ventoy_img_chunk_list chunk_list; ventoy_img_chunk_list chunk_list;
(void)ctxt; (void)ctxt;
@@ -1257,26 +1302,17 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
persistent_buf = (char *)(chunk_list.chunk); persistent_buf = (char *)(chunk_list.chunk);
} }
template_file = ventoy_plugin_get_cur_install_template(args[1]); template_file = ventoy_plugin_get_cur_install_template(args[1], &template_node);
if (template_file) if (template_file)
{ {
debug("auto install template: <%s>\n", template_file); debug("auto install template: <%s> <addr:%p> <len:%d>\n",
tmpfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], template_file); template_file, template_node->filebuf, template_node->filelen);
if (tmpfile)
template_size = template_node->filelen;
template_buf = grub_malloc(template_size);
if (template_buf)
{ {
debug("auto install script size %d\n", (int)tmpfile->size); grub_memcpy(template_buf, template_node->filebuf, template_size);
template_size = tmpfile->size;
template_buf = grub_malloc(template_size);
if (template_buf)
{
grub_file_read(tmpfile, template_buf, template_size);
}
grub_file_close(tmpfile);
}
else
{
debug("Failed to open install script %s%s\n", args[2], template_file);
} }
} }
else else
@@ -1363,15 +1399,14 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
{ {
headlen = ventoy_cpio_newc_fill_head(buf, template_size, template_buf, "ventoy/autoinstall"); headlen = ventoy_cpio_newc_fill_head(buf, template_size, template_buf, "ventoy/autoinstall");
buf += headlen + ventoy_align(template_size, 4); buf += headlen + ventoy_align(template_size, 4);
grub_check_free(template_buf);
} }
if (persistent_size > 0 && persistent_buf) if (persistent_size > 0 && persistent_buf)
{ {
headlen = ventoy_cpio_newc_fill_head(buf, persistent_size, persistent_buf, "ventoy/ventoy_persistent_map"); headlen = ventoy_cpio_newc_fill_head(buf, persistent_size, persistent_buf, "ventoy/ventoy_persistent_map");
buf += headlen + ventoy_align(persistent_size, 4); buf += headlen + ventoy_align(persistent_size, 4);
grub_check_free(persistent_buf);
grub_free(persistent_buf);
persistent_buf = NULL;
} }
if (injection_size > 0 && injection_buf) if (injection_size > 0 && injection_buf)
@@ -1623,10 +1658,10 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
} }
} }
chain = grub_malloc(size); chain = ventoy_alloc_chain(size);
if (!chain) if (!chain)
{ {
grub_printf("Failed to alloc chain memory size %u\n", size); grub_printf("Failed to alloc chain linux memory size %u\n", size);
grub_file_close(file); grub_file_close(file);
return 1; return 1;
} }

View File

@@ -2641,10 +2641,15 @@ install_template * ventoy_plugin_find_install_template(const char *isopath)
return NULL; return NULL;
} }
char * ventoy_plugin_get_cur_install_template(const char *isopath) char * ventoy_plugin_get_cur_install_template(const char *isopath, install_template **cur)
{ {
install_template *node = NULL; install_template *node = NULL;
if (cur)
{
*cur = NULL;
}
node = ventoy_plugin_find_install_template(isopath); node = ventoy_plugin_find_install_template(isopath);
if ((!node) || (!node->templatepath)) if ((!node) || (!node->templatepath))
{ {
@@ -2656,6 +2661,11 @@ char * ventoy_plugin_get_cur_install_template(const char *isopath)
return NULL; return NULL;
} }
if (cur)
{
*cur = node;
}
return node->templatepath[node->cursel].path; return node->templatepath[node->cursel].path;
} }
@@ -3044,14 +3054,15 @@ int ventoy_plugin_get_image_list_index(int type, const char *name)
return 0; return 0;
} }
conf_replace * ventoy_plugin_find_conf_replace(const char *iso) int ventoy_plugin_find_conf_replace(const char *iso, conf_replace *nodes[VTOY_MAX_CONF_REPLACE])
{ {
int n = 0;
int len; int len;
conf_replace *node; conf_replace *node;
if (!g_conf_replace_head) if (!g_conf_replace_head)
{ {
return NULL; return 0;
} }
len = (int)grub_strlen(iso); len = (int)grub_strlen(iso);
@@ -3060,11 +3071,15 @@ conf_replace * ventoy_plugin_find_conf_replace(const char *iso)
{ {
if (node->pathlen == len && ventoy_strncmp(node->isopath, iso, len) == 0) if (node->pathlen == len && ventoy_strncmp(node->isopath, iso, len) == 0)
{ {
return node; nodes[n++] = node;
if (n >= VTOY_MAX_CONF_REPLACE)
{
return n;
}
} }
} }
return NULL; return n;
} }
dud * ventoy_plugin_find_dud(const char *iso) dud * ventoy_plugin_find_dud(const char *iso)

View File

@@ -445,12 +445,16 @@ grub_err_t ventoy_cmd_parse_freenas_ver(grub_extcmd_context_t ctxt, int argc, ch
ver = vtoy_json_get_string_ex(json->pstChild, "Version"); ver = vtoy_json_get_string_ex(json->pstChild, "Version");
if (ver) if (ver)
{ {
debug("freenas version:<%s>\n", ver); debug("NAS version:<%s>\n", ver);
if (grub_strncmp(ver, "TrueNAS-", 8) == 0)
{
ver += 8;
}
ventoy_set_env(args[1], ver); ventoy_set_env(args[1], ver);
} }
else else
{ {
debug("freenas version:<%s>\n", "NOT FOUND"); debug("NAS version:<%s>\n", "NOT FOUND");
grub_env_unset(args[1]); grub_env_unset(args[1]);
} }
@@ -1185,10 +1189,10 @@ grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char
} }
} }
chain = grub_malloc(size); chain = ventoy_alloc_chain(size);
if (!chain) if (!chain)
{ {
grub_printf("Failed to alloc chain memory size %u\n", size); grub_printf("Failed to alloc chain unix memory size %u\n", size);
grub_file_close(file); grub_file_close(file);
return 1; return 1;
} }

View File

@@ -687,10 +687,10 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
} }
} }
chain = grub_malloc(size); chain = ventoy_alloc_chain(size);
if (!chain) if (!chain)
{ {
grub_printf("Failed to alloc chain memory size %u\n", size); grub_printf("Failed to alloc chain raw memory size %u\n", size);
grub_file_close(file); grub_file_close(file);
return 1; return 1;
} }

View File

@@ -1015,7 +1015,7 @@ static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directo
return 0; return 0;
} }
static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, grub_uint8_t *exe_data) static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, grub_uint8_t *exe_data, int windatalen)
{ {
int pe64 = 0; int pe64 = 0;
char file[256]; char file[256];
@@ -1030,14 +1030,14 @@ static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, g
jump_align = ventoy_align(jump_len, 16); jump_align = ventoy_align(jump_len, 16);
wim_data->jump_exe_len = jump_len; wim_data->jump_exe_len = jump_len;
wim_data->bin_raw_len = jump_align + sizeof(ventoy_os_param) + sizeof(ventoy_windows_data) + exe_len; wim_data->bin_raw_len = jump_align + sizeof(ventoy_os_param) + windatalen + exe_len;
wim_data->bin_align_len = ventoy_align(wim_data->bin_raw_len, 2048); wim_data->bin_align_len = ventoy_align(wim_data->bin_raw_len, 2048);
wim_data->jump_bin_data = grub_malloc(wim_data->bin_align_len); wim_data->jump_bin_data = grub_malloc(wim_data->bin_align_len);
if (wim_data->jump_bin_data) if (wim_data->jump_bin_data)
{ {
grub_memcpy(wim_data->jump_bin_data, jump_data, jump_len); grub_memcpy(wim_data->jump_bin_data, jump_data, jump_len);
grub_memcpy(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param) + sizeof(ventoy_windows_data), exe_data, exe_len); grub_memcpy(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param) + windatalen, exe_data, exe_len);
} }
debug("jump_exe_len:%u bin_raw_len:%u bin_align_len:%u\n", debug("jump_exe_len:%u bin_raw_len:%u bin_align_len:%u\n",
@@ -1046,26 +1046,68 @@ static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, g
return 0; return 0;
} }
int ventoy_fill_windows_rtdata(void *buf, char *isopath) static int ventoy_get_windows_rtdata_len(const char *iso, int *flag)
{ {
int size = 0;
int template_file_len = 0;
char *pos = NULL; char *pos = NULL;
char *script = NULL; char *script = NULL;
install_template *template_node = NULL;
*flag = 0;
size = (int)sizeof(ventoy_windows_data);
pos = grub_strstr(iso, "/");
if (!pos)
{
return size;
}
script = ventoy_plugin_get_cur_install_template(pos, &template_node);
if (script)
{
(*flag) |= WINDATA_FLAG_TEMPLATE;
template_file_len = template_node->filelen;
}
return size + template_file_len;
}
static int ventoy_fill_windows_rtdata(void *buf, char *isopath, int dataflag)
{
int template_len = 0;
char *pos = NULL;
char *end = NULL;
char *script = NULL;
const char *env = NULL; const char *env = NULL;
install_template *template_node = NULL;
ventoy_windows_data *data = (ventoy_windows_data *)buf; ventoy_windows_data *data = (ventoy_windows_data *)buf;
grub_memset(data, 0, sizeof(ventoy_windows_data)); grub_memset(data, 0, sizeof(ventoy_windows_data));
env = grub_env_get("VTOY_WIN11_BYPASS_CHECK");
if (env && env[0] == '1' && env[1] == 0)
{
data->windows11_bypass_check = 1;
}
pos = grub_strstr(isopath, "/"); pos = grub_strstr(isopath, "/");
if (!pos) if (!pos)
{ {
return 1; return 1;
} }
script = ventoy_plugin_get_cur_install_template(pos); if (dataflag & WINDATA_FLAG_TEMPLATE)
if (script)
{ {
debug("auto install script <%s>\n", script); script = ventoy_plugin_get_cur_install_template(pos, &template_node);
grub_snprintf(data->auto_install_script, sizeof(data->auto_install_script) - 1, "%s", script); if (script)
{
data->auto_install_len = template_len = template_node->filelen;
debug("auto install script OK <%s> <len:%d>\n", script, template_len);
end = ventoy_str_last(script, '/');
grub_snprintf(data->auto_install_script, sizeof(data->auto_install_script) - 1, "%s", end ? end + 1 : script);
grub_memcpy(data + 1, template_node->filebuf, template_len);
}
} }
else else
{ {
@@ -1090,12 +1132,6 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath)
debug("injection archive not configed %s\n", pos); debug("injection archive not configed %s\n", pos);
} }
env = grub_env_get("VTOY_WIN11_BYPASS_CHECK");
if (env && env[0] == '1' && env[1] == 0)
{
data->windows11_bypass_check = 1;
}
return 0; return 0;
} }
@@ -1125,7 +1161,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
if (wim_data->jump_bin_data) if (wim_data->jump_bin_data)
{ {
grub_memcpy(wim_data->jump_bin_data + jump_align, param, sizeof(ventoy_os_param)); grub_memcpy(wim_data->jump_bin_data + jump_align, param, sizeof(ventoy_os_param));
ventoy_fill_windows_rtdata(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param), isopath); ventoy_fill_windows_rtdata(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param), isopath, wim_data->windata_flag);
} }
grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len); grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len);
@@ -1168,7 +1204,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
return 0; return 0;
} }
static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch, int windatalen)
{ {
int rc; int rc;
grub_uint16_t i; grub_uint16_t i;
@@ -1285,7 +1321,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
if (0 == ventoy_read_resource(file, head, &(patch->replace_look->resource), (void **)&(exe_data))) if (0 == ventoy_read_resource(file, head, &(patch->replace_look->resource), (void **)&(exe_data)))
{ {
ventoy_cat_exe_file_data(wim_data, exe_len, exe_data); ventoy_cat_exe_file_data(wim_data, exe_len, exe_data, windatalen);
grub_free(exe_data); grub_free(exe_data);
} }
else else
@@ -1330,15 +1366,20 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args) grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int datalen = 0;
int dataflag = 0;
wim_patch *node = g_wim_patch_head; wim_patch *node = g_wim_patch_head;
(void)ctxt; (void)ctxt;
(void)argc; (void)argc;
(void)args; (void)args;
datalen = ventoy_get_windows_rtdata_len(args[1], &dataflag);
while (node) while (node)
{ {
if (0 == ventoy_wimdows_locate_wim(args[0], node)) node->wim_data.windata_flag = dataflag;
if (0 == ventoy_wimdows_locate_wim(args[0], node, datalen))
{ {
node->valid = 1; node->valid = 1;
g_wim_valid_patch_count++; g_wim_valid_patch_count++;
@@ -1751,6 +1792,8 @@ end:
grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args) grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int datalen = 0;
int dataflag = 0;
grub_uint32_t size = 0; grub_uint32_t size = 0;
const char *addr = NULL; const char *addr = NULL;
ventoy_chain_head *chain = NULL; ventoy_chain_head *chain = NULL;
@@ -1776,7 +1819,9 @@ grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc,
return 1; return 1;
} }
size = sizeof(ventoy_os_param) + sizeof(ventoy_windows_data); datalen = ventoy_get_windows_rtdata_len(chain->os_param.vtoy_img_path, &dataflag);
size = sizeof(ventoy_os_param) + datalen;
param = (ventoy_os_param *)grub_zalloc(size); param = (ventoy_os_param *)grub_zalloc(size);
if (!param) if (!param)
{ {
@@ -1784,7 +1829,7 @@ grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc,
} }
grub_memcpy(param, &chain->os_param, sizeof(ventoy_os_param)); grub_memcpy(param, &chain->os_param, sizeof(ventoy_os_param));
ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path); ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path, dataflag);
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)param); grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)param);
grub_env_set("vtoy_wimboot_mem_addr", envbuf); grub_env_set("vtoy_wimboot_mem_addr", envbuf);
@@ -1896,10 +1941,10 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
} }
} }
chain = grub_malloc(size); chain = ventoy_alloc_chain(size);
if (!chain) if (!chain)
{ {
grub_printf("Failed to alloc chain memory size %u\n", size); grub_printf("Failed to alloc chain win1 memory size %u\n", size);
grub_file_close(file); grub_file_close(file);
return 1; return 1;
} }
@@ -2129,10 +2174,10 @@ static grub_err_t ventoy_vlnk_wim_chain_data(grub_file_t wimfile)
} }
} }
chain = grub_malloc(size); chain = ventoy_alloc_chain(size);
if (!chain) if (!chain)
{ {
grub_printf("Failed to alloc chain memory size %u\n", size); grub_printf("Failed to alloc chain win2 memory size %u\n", size);
grub_file_close(file); grub_file_close(file);
return 1; return 1;
} }
@@ -2294,10 +2339,10 @@ static grub_err_t ventoy_normal_wim_chain_data(grub_file_t wimfile)
} }
} }
chain = grub_malloc(size); chain = ventoy_alloc_chain(size);
if (!chain) if (!chain)
{ {
grub_printf("Failed to alloc chain memory size %u\n", size); grub_printf("Failed to alloc chain win3 memory size %u\n", size);
grub_file_close(file); grub_file_close(file);
return 1; return 1;
} }

View File

@@ -139,7 +139,13 @@ typedef struct ventoy_windows_data
char auto_install_script[384]; char auto_install_script[384];
char injection_archive[384]; char injection_archive[384];
grub_uint8_t windows11_bypass_check; grub_uint8_t windows11_bypass_check;
grub_uint8_t reserved[255];
grub_uint32_t auto_install_len;
grub_uint8_t reserved[255 - 4];
/* auto_intall file buf */
/* ...... + auto_install_len */
}ventoy_windows_data; }ventoy_windows_data;
@@ -256,6 +262,7 @@ typedef struct ventoy_img_chunk_list
#pragma pack(1) #pragma pack(1)
#define VTOY_MAX_CONF_REPLACE 2
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF #define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF #define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF
@@ -276,7 +283,7 @@ typedef struct ventoy_grub_param
grub_env_get_pf grub_env_get; grub_env_get_pf grub_env_get;
grub_env_set_pf grub_env_set; grub_env_set_pf grub_env_set;
ventoy_grub_param_file_replace file_replace; ventoy_grub_param_file_replace file_replace;
ventoy_grub_param_file_replace img_replace; ventoy_grub_param_file_replace img_replace[VTOY_MAX_CONF_REPLACE];
grub_env_printf_pf grub_env_printf; grub_env_printf_pf grub_env_printf;
}ventoy_grub_param; }ventoy_grub_param;

View File

@@ -19,21 +19,25 @@
. /ventoy/hook/ventoy-hook-lib.sh . /ventoy/hook/ventoy-hook-lib.sh
if is_ventoy_hook_finished || not_ventoy_disk "${1:0:-1}"; then
exit 0
fi
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
modprobe fuse NEWROOT=$(grep switch_root /init | awk '{print $3}')
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d "/dev/${1:0:-1}" > $VTOY_PATH/ventoy_dm_table for i in 'usr/bin' 'usr/sbin'; do
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse if [ -f $NEWROOT/$i/udevadm ]; then
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso UPATH=$i
break
fi
done
# OK finish blkdev_num=$(dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
set_ventoy_hook_finish vtDM=$(ventoy_find_dm_id ${blkdev_num})
PATH=$VTPATH_OLD sed "s#UPATH=.*#UPATH=/$UPATH#" -i /ventoy/hook/clear/udevadm
sed "s#DM=.*#DM=$vtDM#" -i /ventoy/hook/clear/udevadm
mv $NEWROOT/$UPATH/udevadm $NEWROOT/$UPATH/udevadm_bk
cp -a /ventoy/hook/clear/udevadm $NEWROOT/$UPATH/udevadm
chmod 777 $NEWROOT/$UPATH/udevadm

View File

@@ -0,0 +1,12 @@
#!/bin/bash
UPATH=/usr/bin
DM=dm-0
rm -f $UPATH/udevadm
mv $UPATH/udevadm_bk $UPATH/udevadm
echo 1 > /tmp/vthidden
mount --bind /tmp/vthidden /sys/block/$DM/hidden
exec $UPATH/udevadm "$@"

View File

@@ -26,3 +26,6 @@ else
echo "find_installer" >> $VTLOG echo "find_installer" >> $VTLOG
$SED "/\$.*find_installer/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/clear/disk-hook.sh" -i /init $SED "/\$.*find_installer/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/clear/disk-hook.sh" -i /init
fi fi
#issue 1674
$SED "/switch_root/i $BUSYBOX_PATH/sh $VTOY_PATH/hook/clear/hidden-hook.sh" -i /init

View File

@@ -19,6 +19,8 @@
. /ventoy/hook/ventoy-hook-lib.sh . /ventoy/hook/ventoy-hook-lib.sh
/sbin/mdev -s
# Just for KVM test environment # Just for KVM test environment
$BUSYBOX_PATH/modprobe virtio_blk 2>/dev/null $BUSYBOX_PATH/modprobe virtio_blk 2>/dev/null
$BUSYBOX_PATH/modprobe virtio_pci 2>/dev/null $BUSYBOX_PATH/modprobe virtio_pci 2>/dev/null
@@ -34,3 +36,6 @@ for i in 0 1 2 3 4 5 6 7 8 9; do
done done
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
$BUSYBOX_PATH/rm -f /dev/dm-*

View File

@@ -19,6 +19,6 @@
. $VTOY_PATH/hook/ventoy-os-lib.sh . $VTOY_PATH/hook/ventoy-os-lib.sh
$SED "/mount_boot /i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/gentoo/disk_hook.sh" -i /init $SED "/mount_boot[^(]*$/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/daphile/disk_hook.sh" -i /init
$SED "s#'\.\*/block/mmcblk[^ ]*'#'\.\*/block/dm-[0-9]*'#" -i /init $SED "s#'\.\*/block/mmcblk[^ ]*'#'\.\*/block/dm-[0-9]*'#" -i /init

View File

@@ -34,3 +34,7 @@ fi
vtlog "${vtdiskname#/dev/}2 found..." vtlog "${vtdiskname#/dev/}2 found..."
$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/udev_disk_hook.sh "${vtdiskname#/dev/}2" $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/udev_disk_hook.sh "${vtdiskname#/dev/}2"
if [ -f /ventoy/autoinstall ]; then
sh /ventoy/hook/default/auto_install_varexp.sh /ventoy/autoinstall
fi

View File

@@ -44,10 +44,15 @@ if [ $vtSplit -eq 1 ]; then
vtlog "Line number: $vtLine $vtLine1 $vtLine2" vtlog "Line number: $vtLine $vtLine1 $vtLine2"
sed -n "1,${vtLine1}p" $VTOY_PATH/autoinstall >/tmpcidata/user-data sed -n "1,${vtLine1}p" $VTOY_PATH/autoinstall >/tmpcidata/user-data
sed -n "${vtLine2},\$p" $VTOY_PATH/autoinstall >/tmpcidata/meta-data sed -n "${vtLine2},\$p" $VTOY_PATH/autoinstall >/tmpcidata/meta-data
sh /ventoy/hook/default/auto_install_varexp.sh /tmpcidata/user-data
sh /ventoy/hook/default/auto_install_varexp.sh /tmpcidata/meta-data
else else
vtlog "only user-data avaliable" vtlog "only user-data avaliable"
cp -a $VTOY_PATH/autoinstall /tmpcidata/user-data cp -a $VTOY_PATH/autoinstall /tmpcidata/user-data
touch /tmpcidata/meta-data touch /tmpcidata/meta-data
sh /ventoy/hook/default/auto_install_varexp.sh /tmpcidata/user-data
fi fi

View File

@@ -0,0 +1,53 @@
#!/bin/sh
#************************************************************************************
# Copyright (c) 2022, 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/>.
#
#************************************************************************************
PATH=$PATH:/ventoy/busybox:/ventoy/tool
vlog() {
echo "$@" >> /ventoy/autoinstall.log
}
if grep -q '\$\$VT_' /ventoy/autoinstall; then
vlog "======== auto install variables expansion ======="
else
vlog "======== auto install variables expansion no need ======="
exit 0
fi
if [ -f /ventoy/ventoy_os_param ]; then
VTOYDISK=$(vtoydump -f /ventoy/ventoy_os_param | awk -F'#' '{print $1}')
vlog VTOYDISK=$VTOYDISK
if [ -b "$VTOYDISK" ]; then
vlog "$VTOYDISK exist OK"
else
vlog "$VTOYDISK does NOT exist"
exit 0
fi
if [ -n "$1" -a -f "$1" ]; then
vtoyexpand "$1" "$VTOYDISK"
else
vlog "File $1 not exist"
fi
else
vlog "os param file not exist"
exit 0
fi

View File

@@ -0,0 +1,118 @@
#!/ventoy/busybox/sh
#************************************************************************************
# 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/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "######### $0 $* ############"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
ventoy_os_install_dmsetup_by_fuse() {
vtlog "ventoy_os_install_dmsetup_by_fuse $*"
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
sfsfile=$VTOY_PATH/mnt/iso/kdeos/x86_64/root-image.sqfs
mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs
kVer=$(uname -r)
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$kVer/kernel/drivers/md/dm-mod.ko*)
vtlog "insmod $KoName"
if echo $KoName | grep -q '\.zst'; then
zstdcat $KoName > $VTOY_PATH/dm-mod.ko
insmod $VTOY_PATH/dm-mod.ko
else
insmod $KoName
fi
ventoy_check_umount $VTOY_PATH/mnt/squashfs
ventoy_check_umount $VTOY_PATH/mnt/iso
ventoy_check_umount $VTOY_PATH/mnt/fuse
vtlog "umount done"
}
if is_ventoy_hook_finished; then
exit 0
fi
wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
exit 0
fi
if grep -q 'device-mapper' /proc/devices; then
vtlog "device-mapper module exist"
else
ventoy_os_install_dmsetup_by_fuse $vtdiskname
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
vtDM=$(ventoy_find_dm_id ${blkdev_num})
vtlog "blkdev_num=$blkdev_num vtDM=$vtDM ..."
while [ -n "Y" ]; do
if [ -b /dev/$vtDM ]; then
break
else
sleep 0.3
fi
done
if [ -n "$1" ]; then
vtlog "ln -s /dev/$vtDM $1"
if [ -e "$1" ]; then
vtlog "$1 already exist"
else
ln -s /dev/$vtDM "$1"
fi
else
vtLABEL=$($BUSYBOX_PATH/blkid /dev/$vtDM | $SED 's/.*LABEL="\([^"]*\)".*/\1/')
vtlog "vtLABEL is $vtLABEL"
if [ -z "$vtLABEL" ]; then
vtLABEL=$($SED "s/.*label=\([^ ]*\)/\1/" /proc/cmdline)
vtlog "vtLABEL is $vtLABEL from cmdline"
fi
if [ -e "/dev/disk/by-label/$vtLABEL" ]; then
vtlog "$1 already exist"
else
ln -s /dev/$vtDM "/dev/disk/by-label/$vtLABEL"
fi
fi
PATH=$VTPATH_OLD
# OK finish
set_ventoy_hook_finish

View File

@@ -2,5 +2,14 @@
. $VTOY_PATH/hook/ventoy-os-lib.sh . $VTOY_PATH/hook/ventoy-os-lib.sh
ventoy_systemd_udevd_work_around if $GREP -q '^"$mount_handler"' /init; then
ventoy_add_udev_rule "$VTOY_PATH/hook/kaos/udev_disk_hook.sh %k" echo 'use mount_handler1 ...' >> $VTLOG
$SED "/^\"\$mount_handler\"/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/kaos/ventoy-disk.sh" -i /init
elif $GREP -q '^$mount_handler' /init; then
echo 'use mount_handler2 ...' >> $VTLOG
$SED "/^\$mount_handler/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/kaos/ventoy-disk.sh" -i /init
fi
if [ -f $VTOY_PATH/ventoy_persistent_map ]; then
$SED "1 aexport cow_label=vtoycow" -i /init
fi

View File

@@ -29,10 +29,12 @@ ventoy_add_kernel_udev_rule "loop6" "$VTOY_PATH/hook/rhel6/udev_disk_hook.sh %k"
if [ -f $VTOY_PATH/autoinstall ]; then if [ -f $VTOY_PATH/autoinstall ]; then
$BUSYBOX_PATH/mv /sbin/loader /sbin/loader_bk $BUSYBOX_PATH/mv /sbin/loader /sbin/loader_bk
$BUSYBOX_PATH/mv $VTOY_PATH/tool/loader /sbin/loader $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/loader /sbin/loader
RawCmdLine=$($BUSYBOX_PATH/cat /proc/cmdline) RawCmdLine=$($BUSYBOX_PATH/cat /proc/cmdline)
echo -n "/sbin/loader_bk" > "/ventoy/loader_exec_file" echo -n "/sbin/loader_bk" > "/ventoy/loader_exec_file"
echo -n "--cmdline=$RawCmdLine ks=file:$VTOY_PATH/autoinstall" > "/ventoy/loader_exec_cmdline" echo -n "--cmdline=$RawCmdLine ks=file:$VTOY_PATH/autoinstall" > "/ventoy/loader_exec_cmdline"
#echo 111 > "/ventoy/loader_debug" #echo 111 > "/ventoy/loader_debug"
echo "/bin/sh /ventoy/hook/rhel6/ventoy-varexp.sh" > "/ventoy/loader_hook_cmd"
fi fi

View File

@@ -0,0 +1,37 @@
#!/bin/sh
#************************************************************************************
# Copyright (c) 2022, 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/>.
#
#************************************************************************************
PATH=$PATH:/ventoy/busybox:/ventoy/tool
if grep -q '\$\$VT_' /ventoy/autoinstall; then
:
else
exit 0
fi
if [ -f /sbin/hald ]; then
mv /sbin/hald /sbin/hald_bk
cp -a /ventoy/tool/hald /sbin/hald
rm -f "/ventoy/loader_exec_cmdline"
echo "/bin/sh /ventoy/hook/default/auto_install_varexp.sh /ventoy/autoinstall" > "/ventoy/loader_hook_cmd"
echo -n "/sbin/hald_bk" > "/ventoy/loader_exec_file"
fi
exit 0

View File

@@ -0,0 +1,24 @@
#!/bin/sh
#************************************************************************************
# Copyright (c) 2022, 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/>.
#
#************************************************************************************
if [ -f /run/install/ks.cfg ]; then
sh /ventoy/hook/default/auto_install_varexp.sh /run/install/ks.cfg
fi
exit 0

View File

@@ -128,3 +128,6 @@ if [ -e /usr/sbin/anaconda-diskroot ]; then
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot $SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
fi fi
if [ -f $VTOY_PATH/autoinstall ]; then
cp -a $VTOY_PATH/hook/rhel7/ventoy-autoexp.sh /lib/dracut/hooks/pre-mount/99-ventoy-autoexp.sh
fi

View File

@@ -49,7 +49,12 @@ if is_inotify_ventoy_part $3; then
if [ -e $vtGenRulFile ] && $GREP -q dmsquash $vtGenRulFile; then if [ -e $vtGenRulFile ] && $GREP -q dmsquash $vtGenRulFile; then
vtScript=$($GREP -m1 'RUN.=' $vtGenRulFile | $AWK -F'RUN.=' '{print $2}' | $SED 's/"\(.*\)".*/\1/') vtScript=$($GREP -m1 'RUN.=' $vtGenRulFile | $AWK -F'RUN.=' '{print $2}' | $SED 's/"\(.*\)".*/\1/')
vtlog "vtScript=$vtScript" vtlog "vtScript=$vtScript"
$vtScript
if $GREP -q SCRE /proc/cmdline; then
/sbin/dmsquash-live-root /dev/ventoy
else
$vtScript
fi
else else
vtlog "$vtGenRulFile not exist..." vtlog "$vtGenRulFile not exist..."
fi fi

View File

@@ -40,3 +40,11 @@ fi
if $GREP -q 'mediacheck=1' /proc/cmdline; then if $GREP -q 'mediacheck=1' /proc/cmdline; then
ventoy_copy_device_mapper "${vtdiskname}" ventoy_copy_device_mapper "${vtdiskname}"
fi fi
if [ -f /ventoy/autoinstall ]; then
sh /ventoy/hook/default/auto_install_varexp.sh /ventoy/autoinstall
fi
if [ -f /autoinst.xml ]; then
sh /ventoy/hook/default/auto_install_varexp.sh /autoinst.xml
fi

View File

@@ -868,3 +868,14 @@ ventoy_check_install_module_xz() {
$BUSYBOX_PATH/insmod "$1" $BUSYBOX_PATH/insmod "$1"
fi fi
} }
ventoy_check_umount() {
for vtLoop in 0 1 2 3 4 5 6 7 8 9; do
$BUSYBOX_PATH/umount "$1" > /dev/null 2>&1
if $BUSYBOX_PATH/mountpoint -q "$1"; then
$SLEEP 1
else
break
fi
done
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -185,7 +185,7 @@ function locate_initrd {
} }
function locate_wim { function locate_wim {
vt_windows_locate_wim_patch (loop) vt_windows_locate_wim_patch (loop) "$1"
if [ -n "${vtdebug_flag}" ]; then if [ -n "${vtdebug_flag}" ]; then
echo '###############################################' echo '###############################################'
@@ -615,7 +615,7 @@ function uefi_windows_menu_func {
fi fi
ventoy_debug_pause ventoy_debug_pause
locate_wim locate_wim "${chosen_path}"
fi fi
vt_windows_chain_data "${1}${chosen_path}" vt_windows_chain_data "${1}${chosen_path}"
@@ -1044,7 +1044,7 @@ function legacy_windows_menu_func {
fi fi
ventoy_debug_pause ventoy_debug_pause
locate_wim locate_wim "${chosen_path}"
fi fi
vt_windows_chain_data "${1}${chosen_path}" vt_windows_chain_data "${1}${chosen_path}"
@@ -2145,7 +2145,7 @@ function img_unsupport_menuentry {
############################################################# #############################################################
############################################################# #############################################################
set VENTOY_VERSION="1.0.76" set VENTOY_VERSION="1.0.78"
#ACPI not compatible with Window7/8, so disable by default #ACPI not compatible with Window7/8, so disable by default
set VTOY_PARAM_NO_ACPI=1 set VTOY_PARAM_NO_ACPI=1

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1359,58 +1359,58 @@
"name":"Hungarian (Magyar)", "name":"Hungarian (Magyar)",
"FontFamily":"Courier New", "FontFamily":"Courier New",
"FontSize":16, "FontSize":16,
"Author":"Bitfarago", "Author":"Bitfarago, gidano, meskobalazs",
"STR_ERROR":"Hiba", "STR_ERROR":"Hiba",
"STR_WARNING":"Figyelem", "STR_WARNING":"Figyelmeztetés",
"STR_INFO":"Infó", "STR_INFO":"Információ",
"STR_INCORRECT_DIR":"Kérjük, futtasd a megfelelő könyvtárból!", "STR_INCORRECT_DIR":"Futtassa a megfelelő könyvtárból.",
"STR_INCORRECT_TREE_DIR":"Ne futtasd innen. Töltsd le a kiadott telepítőcsomagot és onnan futtasd.", "STR_INCORRECT_TREE_DIR":"Ne innen futtassa, töltse le a kiadott telepítőcsomagot, és futtassa onnan.",
"STR_DEVICE":"Eszköz", "STR_DEVICE":"Eszköz",
"STR_LOCAL_VER":"Ventoy a csomagban", "STR_LOCAL_VER":"A csomagban lévő Ventoy",
"STR_DISK_VER":"Ventoy az eszközön", "STR_DISK_VER":"Az eszközön lévő Ventoy",
"STR_STATUS":"Állapot - KÉSZ", "STR_STATUS":"Állapot KÉSZ",
"STR_INSTALL":"Telepítés", "STR_INSTALL":"Telepítés",
"STR_UPDATE":"Frissítés", "STR_UPDATE":"Frissítés",
"STR_UPDATE_TIP":"A frissítés biztonságos, az ISO fájlok nem változnak.#@Folytatod?", "STR_UPDATE_TIP":"A frissítés biztonságos, az ISO-fájlok nem változnak.#@Folytatja?",
"STR_INSTALL_TIP":"A meghajtó formázva lesz és minden rajta lévő adat elveszik.#@Folytatod?", "STR_INSTALL_TIP":"A meghajtó formázva lesz, és minden rajta lévő adat elvész.#@Folytatja?",
"STR_INSTALL_TIP2":"A meghajtó formázva lesz és minden rajta lévő adat elveszik.#@Folytatod? (Második jóváhagyás)", "STR_INSTALL_TIP2":"A meghajtó formázva lesz, és minden rajta lévő adat elvész.#@Folytatja? (Második jóváhagyás)",
"STR_INSTALL_SUCCESS":"Gratulálunk!#@A Ventoy sikeresen telepítve lett az eszközön.", "STR_INSTALL_SUCCESS":"Gratulálunk!#@A Ventoy sikeresen telepítve lett az eszközön.",
"STR_INSTALL_FAILED":"Hiba történt a telepítés során. Csatlakoztasd újra az USB eszközt, és próbáld újra.#@A részleteket lásd a log.txt fájlban.", "STR_INSTALL_FAILED":"Hiba történt a telepítés során. Csatlakoztassa újra az USB-eszközt, és próbálja újra.#@A részleteket lásd a log.txt fájlban.",
"STR_UPDATE_SUCCESS":"Gratulálunk!#@A Ventoy sikeresen frissítve lett az eszközön.", "STR_UPDATE_SUCCESS":"Gratulálunk!#@A Ventoy sikeresen frissítve lett az eszközön.",
"STR_UPDATE_FAILED":"Hiba történt a frissítés során. Csatlakoztasd újra az USB eszközt, és próbáld újra.#@A részleteket lásd a log.txt fájlban.", "STR_UPDATE_FAILED":"Hiba történt a frissítés során. Csatlakoztassa újra az USB-eszközt, és próbálja újra.#@A részleteket lásd a log.txt fájlban.",
"STR_WAIT_PROCESS":"A feldolgozás még folyamatban van, kérlek várj...", "STR_WAIT_PROCESS":"A feldolgozás még folyamatban van, kis türelmet…",
"STR_MENU_OPTION":"Opció", "STR_MENU_OPTION":"Beállítás",
"STR_MENU_SECURE_BOOT":"Biztonsági mód (Secure Boot)", "STR_MENU_SECURE_BOOT":"Secure Boot támogatás",
"STR_MENU_PART_CFG":"Partíciókonfiguráció", "STR_MENU_PART_CFG":"Partíciókonfiguráció",
"STR_BTN_OK":"rendben", "STR_BTN_OK":"OK",
"STR_BTN_CANCEL":"Megszünteti", "STR_BTN_CANCEL":"Mégse",
"STR_PRESERVE_SPACE":"Tartson szabad helyet a lemez alján", "STR_PRESERVE_SPACE":"Szabad terület hagyása a lemez végén",
"STR_SPACE_VAL_INVALID":"A fenntartott hely érvénytelen értéke", "STR_SPACE_VAL_INVALID":"Érvénytelen érték a fenntartott helynél",
"STR_MENU_CLEAR":"Clear Ventoy", "STR_MENU_CLEAR":"A Ventoy eltávolítása",
"STR_CLEAR_SUCCESS":"Ventoy has been successfully removed from the device.", "STR_CLEAR_SUCCESS":"A Ventoy sikeresen eltávolítva az eszközről.",
"STR_CLEAR_FAILED":"An error occurred when clear Ventoy from disk. You can replug the USB and try again. Check log.txt for detail.", "STR_CLEAR_FAILED":"Hiba történt a Ventoy lemezről törlése során. Újra csatlakoztathatja az USB-t, és megpróbálhatja újra. A részleteket lásd a log.txt fájlban.",
"STR_MENU_PART_STYLE":"Partition Style", "STR_MENU_PART_STYLE":"Partíció fajtája",
"STR_DISK_2TB_MBR_ERROR":"Please select GPT for disk over 2TB", "STR_DISK_2TB_MBR_ERROR":"2 TB-nál nagyobb lemezhez válassza a GPT-t",
"STR_SHOW_ALL_DEV":"Show All Devices", "STR_SHOW_ALL_DEV":"Az összes eszköz megjelenítése",
"STR_PART_ALIGN_4KB":"Align partitions with 4KB", "STR_PART_ALIGN_4KB":"A partíciók 4 kB-hoz igazítása",
"STR_WEB_COMMUNICATION_ERR":"Communication error:", "STR_WEB_COMMUNICATION_ERR":"Kommunikációs hiba:",
"STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", "STR_WEB_REMOTE_ABNORMAL":"Kommunikációs hiba: Távoli hiba",
"STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", "STR_WEB_REQUEST_TIMEOUT":"Kommunikációs hiba: Kérés időtúllépése",
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikációs hiba: A szolgáltatás nem érhető el",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"A démon állapota frissítve, próbálja újra később.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"A szolgáltatás foglalt, próbálja újra később.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File", "STR_MENU_VTSI_CREATE":"VTSI fájl előállítása",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", "STR_VTSI_CREATE_TIP":"Ez alkalommal nem ír az eszközre, csak egy VTSI fájlt állít elő#@Folytatja?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", "STR_VTSI_CREATE_SUCCESS":"A VTSI fájl sikeresen létrehozva!#@A Rufus(3.15+) segítségével az eszközre írhatja a Ventoy telepítésének befejezéséhez.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.", "STR_VTSI_CREATE_FAILED":"A VTSI fájl létrehozása nem sikerült.",
"STR_MENU_PART_RESIZE":"Non-destructive Install", "STR_MENU_PART_RESIZE":"Rombolásmentes telepítés",
"STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", "STR_PART_RESIZE_TIP":"A Ventoy lehetőség szerint megpróbálja a rombolásmentes telepítést. #@Folytatja?",
"STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", "STR_PART_RESIZE_SUCCESS":"Gratulálunk!#@A Ventoy rombolásmentes telepítése sikeresen befejeződött.",
"STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", "STR_PART_RESIZE_FAILED":"A rombolásmentes telepítés nem sikerült, a részleteket lásd a log.txt fájlban.",
"STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", "STR_PART_RESIZE_UNSUPPORTED":"A Ventoy rombolásmentes telepítése leállt, mert bizonyos feltételek nem teljesíthetők. A részleteket lásd a log.txt fájlban.",
"STR_INSTALL_YES_TIP1":"Warning: Data will be lost!", "STR_INSTALL_YES_TIP1":"Figyelmeztetés: Az adatok elvesznek!",
"STR_INSTALL_YES_TIP2":"Please enter YES in the text box below to confirm that you indeed want to do a fresh install instead of upgrade.", "STR_INSTALL_YES_TIP2":"Írja a YES szót az alábbi szövegmezőbe, hogy megerősítse, valóban új telepítést szeretne végrehajtani a frissítés helyett.",
"STRXXX":"" "STRXXX":""
}, },
@@ -2359,61 +2359,61 @@
}, },
{ {
"name":"Bulgarian (Български)", "name":"Bulgarian (Български)",
"FontFamily":"Courier New", "FontFamily":"Segoe",
"FontSize":16, "FontSize":16,
"Author":"jekovcar", "Author":"jekovcar",
"STR_ERROR":"Грешка", "STR_ERROR":"Грешка",
"STR_WARNING":"Предупреждение", "STR_WARNING":"Предупреждение",
"STR_INFO":"Информация", "STR_INFO":"Информация",
"STR_INCORRECT_DIR":"Моля, стартирайте в друга директория!", "STR_INCORRECT_DIR":"Стартирайте от правилната папка!",
"STR_INCORRECT_TREE_DIR":"Не ме стартирайте оттук, моля, изтеглете инсталационен пакет и го стартирайте в друго място.", "STR_INCORRECT_TREE_DIR":"Не стартирайте оттук, изтеглете инсталационен пакет и стартирайте него.",
"STR_DEVICE":"Устройство", "STR_DEVICE":"Устройство",
"STR_LOCAL_VER":"Ventoy в пакета", "STR_LOCAL_VER":"Ventoy в пакета",
"STR_DISK_VER":"Ventoy на устройството", "STR_DISK_VER":"Ventoy на устройството",
"STR_STATUS":"Статус - ГОТОВ", "STR_STATUS":"Състояние - В готовност",
"STR_INSTALL":"Инсталирай", "STR_INSTALL":"Инсталиране",
"STR_UPDATE":"Обнови", "STR_UPDATE":"Обновяване",
"STR_UPDATE_TIP":"Обновяването е безопасно, ISO-файловете няма да се променят.#@Продължаваме?", "STR_UPDATE_TIP":"Обновяването е безопасно, файловете на ISO няма да бъдат променени.#@Продължаване?",
"STR_INSTALL_TIP":"Диска ще се форматира и всички данни изтрият.#@Продължаваме?", "STR_INSTALL_TIP":"Устройството ще бъде форматирано, а всички данни - премахнати.#@Продължаване?",
"STR_INSTALL_TIP2":"Диска ще се форматира и всички данни изтрият..#@ДЕЙСТВИТЕЛНО ще продължите?", "STR_INSTALL_TIP2":"Устройството ще бъде форматирано, а всички данни - премахнати.#@Продължаване? (повторно потвърждаване)",
"STR_INSTALL_SUCCESS":"Поздрави!#@Ventoy бе успешно инсталиран на устройството.", "STR_INSTALL_SUCCESS":"Поздравления!#@Ventoy е успешно инсталиран на устройството.",
"STR_INSTALL_FAILED":"По време на инсталирането на Ventoy възникна грешка. Подсъединете устройството и опитайте отново. Проверете log.txt за грешки.", "STR_INSTALL_FAILED":"По време на инсталацията е възникнала грешка. Можете да поставите отново USB устройството и да опитате отново. Проверете log.txt за подробности. Ако инсталацията винаги е неуспешна, направете справка с често задаваните въпроси на официалната страница.",
"STR_UPDATE_SUCCESS":"Поздрави!#@Ventoy бе успешно обновен на устройството.", "STR_UPDATE_SUCCESS":"Поздравление!#@Ventoy е успешно обновен на устройството.",
"STR_UPDATE_FAILED":"По време на обновяването на Ventoy възникна грешка. Подсъединете устройството и опитайте отново. Проверете log.txt за грешки.", "STR_UPDATE_FAILED":"По време на обновяването е възникнала грешка. Можете да поставите отново USB устройството и да опитате отново. Проверете log.txt за подробности. Ако обновяването винаги е неуспешно, направете справка с често задаваните въпроси на официалната страница.",
"STR_WAIT_PROCESS":"Процеса е стартиран, моля изчакайте...", "STR_WAIT_PROCESS":"Работи, моля изчакайте",
"STR_MENU_OPTION":"Опции", "STR_MENU_OPTION":"Настройки",
"STR_MENU_SECURE_BOOT":"Поддръжка на Secure Boot", "STR_MENU_SECURE_BOOT":"Поддръжка на Secure Boot",
"STR_MENU_PART_CFG":"Допълнителен дял", "STR_MENU_PART_CFG":"Допълнителен дял",
"STR_BTN_OK":"ОК", "STR_BTN_OK":"Добре",
"STR_BTN_CANCEL":"Отказ", "STR_BTN_CANCEL":"Отказ",
"STR_PRESERVE_SPACE":"Създай Допълнителен дял в края на диска", "STR_PRESERVE_SPACE":"Създаване на допълнителен дял в края на диска",
"STR_SPACE_VAL_INVALID":"Неправилен размер на дяла", "STR_SPACE_VAL_INVALID":"Невярна стойност за запазено пространство",
"STR_MENU_CLEAR":"Изтрий Ventoy", "STR_MENU_CLEAR":"Премахване на Ventoy",
"STR_CLEAR_SUCCESS":"Ventoy бе успешно изтрит от устройството.", "STR_CLEAR_SUCCESS":"Ventoy е успешно премахнат от устройството.",
"STR_CLEAR_FAILED":"По време на изтриването на Ventoy възникна грешка. Подсъединете устройството и опитайте отново. Проверете log.txt за грешки.", "STR_CLEAR_FAILED":"По време на премахването е възникнала грешка. Можете да поставите отново USB устройството и да опитате отново. Проверете log.txt за подробности.",
"STR_MENU_PART_STYLE":"Стил на оразмеряване на дяловете", "STR_MENU_PART_STYLE":"Вид на дяловете",
"STR_DISK_2TB_MBR_ERROR":"Моля, изберете GPT за дискове по-големи от 2ТБ", "STR_DISK_2TB_MBR_ERROR":"Изберете GPT за устройства по-големи от 2ТБ",
"STR_SHOW_ALL_DEV":"Покажи всички устройства", "STR_SHOW_ALL_DEV":"Показване на всички устройства",
"STR_PART_ALIGN_4KB":"Подравни дяловете с размер 4КБ", "STR_PART_ALIGN_4KB":"Подравняване на дяловете по 4КБ",
"STR_WEB_COMMUNICATION_ERR":"Грешка при свързване:", "STR_WEB_COMMUNICATION_ERR":"Грешка при свързване:",
"STR_WEB_REMOTE_ABNORMAL":"Грешка при свързване: Отдалечената връзка е недействителна", "STR_WEB_REMOTE_ABNORMAL":"Грешка при свързване: Отдалечената връзка е недействителна",
"STR_WEB_REQUEST_TIMEOUT":"Грешка при свързване: Изтекло време за изчакване на заявката", "STR_WEB_REQUEST_TIMEOUT":"Грешка при свързване: Изтекло време за изчакване на заявката",
"STR_WEB_SERVICE_UNAVAILABLE":"Грешка при свързване: Службата е недостъпна", "STR_WEB_SERVICE_UNAVAILABLE":"Грешка при свързване: Услугата е недостъпна",
"STR_WEB_TOKEN_MISMATCH":"Статуса на агента е обновен. Повторете по-късно.", "STR_WEB_TOKEN_MISMATCH":"Статуса на демона е обновен, опитайте по-късно.",
"STR_WEB_SERVICE_BUSY":"Службата е заета, Повторете по-късно.", "STR_WEB_SERVICE_BUSY":"Услугата е заета, опитайте по-късно.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File", "STR_MENU_VTSI_CREATE":"Създаване на файл на VTSI",
"STR_VTSI_CREATE_TIP":"Сега няма да се записва на диска, само ще се генерира VTSI файл#@Продължаваме?", "STR_VTSI_CREATE_TIP":"Този път няма да се записва на устройството, а само ще се създаде файл на VTSI#@Продължаване?",
"STR_VTSI_CREATE_SUCCESS":"VTSI файла бе създаден успешно!#@Може да използвате Rufus(3.15+) да го запишете на устройството за инсталацията с Ventoy.", "STR_VTSI_CREATE_SUCCESS":"Файлът на VTSI е създаден успешно!#@Може да използвате Rufus(3.15+), за да го запишете на устройството и така да завършите инсталацията на Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI файла създаване се провали.", "STR_VTSI_CREATE_FAILED":"Грешка при създаване на файла на VTSI.",
"STR_MENU_PART_RESIZE":"Non-destructive Install", "STR_MENU_PART_RESIZE":"Неразрушително инсталиране",
"STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", "STR_PART_RESIZE_TIP":"Ventoy ще направи опит за неразрушително инсталиране, ако е възможно.#@Продължаване?",
"STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", "STR_PART_RESIZE_SUCCESS":"Поздравления!#@Неразрушителното инсталиране на Ventoy е успешно.",
"STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", "STR_PART_RESIZE_FAILED":"Неразрушителното инсталиране на Ventoy е неуспешно. Проверете log.txt за подробности.",
"STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", "STR_PART_RESIZE_UNSUPPORTED":"Неразрушителното инсталиране на Ventoy е спряна, защото някои от условията не могат да бъдат изпълнени. Проверете log.txt за подробности.",
"STR_INSTALL_YES_TIP1":"Warning: Data will be lost!", "STR_INSTALL_YES_TIP1":"Внимание: Ще има загуба на данни!",
"STR_INSTALL_YES_TIP2":"Please enter YES in the text box below to confirm that you indeed want to do a fresh install instead of upgrade.", "STR_INSTALL_YES_TIP2":"Въведете „YES“ в полето отдолу, за да потвърдите, че искате да извършите нова инсталация вместо обновяване.",
"STRXXX":"" "STRXXX":""
}, },
{ {

View File

@@ -743,10 +743,10 @@
<script src="/static/js/jQuery-2.1.4.min.js"></script> <script src="/static/js/jQuery-2.1.4.min.js"></script>
<!-- jquery validate --> <!-- jquery validate -->
<script src="/static/js/jquery.validate.min.js"></script> <script src="/static/js/jquery.validate.min.js"></script>
<script src="/static/js/jquery.validate.vtoymethods.js"></script> <script src="/static/js/jquery.validate.vtoymethods.js?v=100"></script>
<script src="/static/js/vtoy.js"></script> <script src="/static/js/vtoy.js?v=100"></script>
<script src="/static/js/jquery.vtoy.alert.js"></script> <script src="/static/js/jquery.vtoy.alert.js?v=100"></script>
<script src="/static/js/md5.min.js"></script> <script src="/static/js/md5.min.js"></script>
<!-- Bootstrap 3.3.5 --> <!-- Bootstrap 3.3.5 -->

View File

@@ -2,6 +2,13 @@
function ventoy_replace_slash(str) { function ventoy_replace_slash(str) {
var str1 = str.replace(/\\/g, '/'); var str1 = str.replace(/\\/g, '/');
var str2 = str1.replace(/\/\//g, '/'); var str2 = str1.replace(/\/\//g, '/');
if (str2 && str2.length > 0) {
if (str2.substr(-1) === "/") {
return str2.substr(0, str2.length - 1);
}
}
return str2; return str2;
} }

View File

@@ -18,7 +18,7 @@ You can also browse ISO/WIM/IMG/VHD(x)/EFI files in local disk and boot them.<br
x86 Legacy BIOS, IA32 UEFI, x86_64 UEFI, ARM64 UEFI and MIPS64EL UEFI are supported in the same way.<br/> x86 Legacy BIOS, IA32 UEFI, x86_64 UEFI, ARM64 UEFI and MIPS64EL UEFI are supported in the same way.<br/>
Both MBR and GPT partition style are supported in the same way.<br/> Both MBR and GPT partition style are supported in the same way.<br/>
Most type of OS supported(Windows/WinPE/Linux/Unix/ChromeOS/Vmware/Xen...) <br/> Most type of OS supported(Windows/WinPE/Linux/Unix/ChromeOS/Vmware/Xen...) <br/>
900+ ISO files are tested (<a href="https://www.ventoy.net/en/isolist.html">List</a>). 90%+ distros in <a href="https://distrowatch.com/">distrowatch.com</a> supported (<a href="https://www.ventoy.net/en/distrowatch.html">Details</a>). <br/> 920+ ISO files are tested (<a href="https://www.ventoy.net/en/isolist.html">List</a>). 90%+ distros in <a href="https://distrowatch.com/">distrowatch.com</a> supported (<a href="https://www.ventoy.net/en/distrowatch.html">Details</a>). <br/>
<br/>Official Website: <a href=https://www.ventoy.net>https://www.ventoy.net</a> <br/>Official Website: <a href=https://www.ventoy.net>https://www.ventoy.net</a>
</h4> </h4>
@@ -70,7 +70,7 @@ A GUI Ventoy plugin configurator. [VentoyPlugson](https://www.ventoy.net/en/plug
* FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) supported for main partition * FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) supported for main partition
* ISO files larger than 4GB supported * ISO files larger than 4GB supported
* Native boot menu style for Legacy & UEFI * Native boot menu style for Legacy & UEFI
* Most types of OS supported, 900+ iso files tested * Most types of OS supported, 920+ iso files tested
* Linux vDisk boot supported * Linux vDisk boot supported
* Not only boot but also complete installation process * Not only boot but also complete installation process
* Menu dynamically switchable between List/TreeView mode * Menu dynamically switchable between List/TreeView mode

554
VtoyTool/vtoyexpand.c Normal file
View File

@@ -0,0 +1,554 @@
/******************************************************************************
* vtoyexpand.c ---- ventoy auto install script variable expansion
*
* Copyright (c) 2022, 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/>.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <linux/fs.h>
#include <dirent.h>
#include "vtoytool.h"
#ifndef O_BINARY
#define O_BINARY 0
#endif
#define TMP_FILE "/ventoy/tmp_var_expansion"
#define SIZE_1MB (1024 * 1024)
#define ulong unsigned long
#define ulonglong unsigned long long
typedef struct disk_info
{
char name[128];
ulonglong size;
int isUSB;
int isSDX;
}disk_info;
static disk_info *g_disk_list = NULL;
static int g_disk_num = 0;
static const char *g_vtoy_disk_name = NULL;
static void vlog(const char *fmt, ...)
{
int n = 0;
va_list arg;
FILE *fp = NULL;
char log[1024];
fp = fopen("/ventoy/autoinstall.log", "a+");
if (fp)
{
va_start(arg, fmt);
n += vsnprintf(log, sizeof(log) - 1, fmt, arg);
va_end(arg);
fwrite(log, 1, n, fp);
fclose(fp);
}
}
static int copy_file(const char *file1, const char *file2)
{
int n;
int size;
int ret = 1;
FILE *fp1 = NULL;
FILE *fp2 = NULL;
char *buf = NULL;
fp1 = fopen(file1, "rb");
if (!fp1)
{
vlog("Failed to read file <%s>\n", file1);
goto end;
}
fp2 = fopen(file2, "wb+");
if (!fp2)
{
vlog("Failed to create file <%s>\n", file2);
goto end;
}
fseek(fp1, 0, SEEK_END);
size = (int)ftell(fp1);
fseek(fp1, 0, SEEK_SET);
buf = malloc(size);
if (!buf)
{
vlog("Failed to malloc buf\n");
goto end;
}
n = fread(buf, 1, size, fp1);
if (n != size)
{
vlog("Failed to read <%s> %d %d\n", file1, n, size);
goto end;
}
n = fwrite(buf, 1, size, fp2);
if (n != size)
{
vlog("Failed to write <%s> %d %d\n", file2, n, size);
goto end;
}
ret = 0;
end:
if (fp1)
fclose(fp1);
if (fp2)
fclose(fp2);
if (buf)
free(buf);
return ret;
}
static int vtoy_is_possible_blkdev(const char *name)
{
if (name[0] == '.')
{
return 0;
}
/* /dev/ramX */
if (name[0] == 'r' && name[1] == 'a' && name[2] == 'm')
{
return 0;
}
/* /dev/loopX */
if (name[0] == 'l' && name[1] == 'o' && name[2] == 'o' && name[3] == 'p')
{
return 0;
}
/* /dev/dm-X */
if (name[0] == 'd' && name[1] == 'm' && name[2] == '-' && IS_DIGIT(name[3]))
{
return 0;
}
/* /dev/srX */
if (name[0] == 's' && name[1] == 'r' && (name[2] >= '0' && name[2] <= '9'))
{
return 0;
}
return 1;
}
static ulonglong vtoy_get_disk_size_in_byte(const char *disk)
{
int fd;
int rc;
unsigned long long size = 0;
char diskpath[256] = {0};
char sizebuf[64] = {0};
// Try 1: get size from sysfs
snprintf(diskpath, sizeof(diskpath) - 1, "/sys/block/%s/size", disk);
if (access(diskpath, F_OK) >= 0)
{
vlog("get disk size from sysfs for %s\n", disk);
fd = open(diskpath, O_RDONLY | O_BINARY);
if (fd >= 0)
{
read(fd, sizebuf, sizeof(sizebuf));
size = strtoull(sizebuf, NULL, 10);
close(fd);
return (size * 512);
}
}
else
{
vlog("%s not exist \n", diskpath);
}
// Try 2: get size from ioctl
snprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk);
fd = open(diskpath, O_RDONLY);
if (fd >= 0)
{
vlog("get disk size from ioctl for %s\n", disk);
rc = ioctl(fd, BLKGETSIZE64, &size);
if (rc == -1)
{
size = 0;
vlog("failed to ioctl %d\n", rc);
}
close(fd);
}
else
{
vlog("failed to open %s %d\n", diskpath, errno);
}
vlog("disk %s size %llu bytes\n", disk, (ulonglong)size);
return size;
}
static int get_disk_num(void)
{
int n = 0;
DIR* dir = NULL;
struct dirent* p = NULL;
dir = opendir("/sys/block");
if (!dir)
{
return 0;
}
while ((p = readdir(dir)) != NULL)
{
n++;
}
closedir(dir);
return n;
}
static int is_usb_disk(const char *diskname)
{
int rc;
char dstpath[1024] = { 0 };
char syspath[1024] = { 0 };
snprintf(syspath, sizeof(syspath), "/sys/block/%s", diskname);
rc = readlink(syspath, dstpath, sizeof(dstpath) - 1);
if (rc > 0 && strstr(dstpath, "/usb"))
{
return 1;
}
return 0;
}
static int get_all_disk(void)
{
int i = 0;
int j = 0;
int num = 0;
ulonglong cursize = 0;
DIR* dir = NULL;
struct dirent* p = NULL;
disk_info *node = NULL;
disk_info tmpnode;
num = get_disk_num();
if (num <= 0)
{
return 1;
}
g_disk_list = malloc(num * sizeof(disk_info));
if (!g_disk_list)
{
return 1;
}
memset(g_disk_list, 0, num * sizeof(disk_info));
dir = opendir("/sys/block");
if (!dir)
{
return 0;
}
while (((p = readdir(dir)) != NULL) && g_disk_num < num)
{
if (!vtoy_is_possible_blkdev(p->d_name))
{
vlog("disk %s is filted by name\n", p->d_name);
continue;
}
cursize = vtoy_get_disk_size_in_byte(p->d_name);
node = g_disk_list + g_disk_num;
g_disk_num++;
snprintf(node->name, sizeof(node->name), p->d_name);
node->size = cursize;
node->isUSB = is_usb_disk(p->d_name);
if (strncmp(node->name, "sd", 2) == 0)
{
node->isSDX = 1;
}
}
closedir(dir);
/* sort disks */
for (i = 0; i < g_disk_num; i++)
{
for (j = i + 1; j < g_disk_num; j++)
{
if (g_disk_list[i].isSDX && g_disk_list[j].isSDX)
{
if (strcmp(g_disk_list[i].name, g_disk_list[j].name) > 0)
{
memcpy(&tmpnode, g_disk_list + i, sizeof(tmpnode));
memcpy(g_disk_list + i, g_disk_list + j, sizeof(tmpnode));
memcpy(g_disk_list + j, &tmpnode, sizeof(tmpnode));
}
}
}
}
vlog("============ DISK DUMP BEGIN ===========\n");
for (i = 0; i < g_disk_num; i++)
{
node = g_disk_list + i;
vlog("[%d] %s %dGB(%llu) USB:%d\n", i, node->name,
node->size / 1024 / 1024 / 1024, node->size, node->isUSB);
}
vlog("============ DISK DUMP END ===========\n");
return 0;
}
static int expand_var(const char *var, char *value, int len)
{
int i;
int index = -1;
ulonglong uiDst = 0;
ulonglong delta = 0;
ulonglong maxsize = 0;
ulonglong maxdelta = 0xFFFFFFFFFFFFFFFFULL;
disk_info *node = NULL;
value[0] = 0;
if (strcmp(var, "VT_LINUX_DISK_SDX_1ST_NONVTOY") == 0)
{
for (i = 0; i < g_disk_num; i++)
{
node = g_disk_list + i;
if (node->size > 0 && node->isSDX && strcmp(node->name, g_vtoy_disk_name) != 0)
{
vlog("%s=<%s>\n", var, node->name);
snprintf(value, len, "%s", node->name);
return 0;
}
}
vlog("[Error] %s not found\n", var);
}
else if (strcmp(var, "VT_LINUX_DISK_SDX_1ST_NONUSB") == 0)
{
for (i = 0; i < g_disk_num; i++)
{
node = g_disk_list + i;
if (node->size > 0 && node->isSDX && node->isUSB == 0)
{
vlog("%s=<%s>\n", var, node->name);
snprintf(value, len, "%s", node->name);
return 0;
}
}
vlog("[Error] %s not found\n", var);
}
else if (strcmp(var, "VT_LINUX_DISK_MAX_SIZE") == 0)
{
for (i = 0; i < g_disk_num; i++)
{
node = g_disk_list + i;
if (node->size > 0 && node->size > maxsize)
{
index = i;
maxsize = node->size;
}
}
if (index >= 0)
{
vlog("%s=<%s>\n", var, g_disk_list[index].name);
snprintf(value, len, "%s", g_disk_list[index].name);
return 0;
}
else
{
vlog("[Error] %s not found\n", var);
}
}
else if (strncmp(var, "VT_LINUX_DISK_CLOSEST_", 22) == 0)
{
uiDst = strtoul(var + 22, NULL, 10);
uiDst = uiDst * (1024ULL * 1024ULL * 1024ULL);
for (i = 0; i < g_disk_num; i++)
{
node = g_disk_list + i;
if (node->size == 0)
{
continue;
}
if (node->size > uiDst)
{
delta = node->size - uiDst;
}
else
{
delta = uiDst - node->size;
}
if (delta < maxdelta)
{
index = i;
maxdelta = delta;
}
}
if (index >= 0)
{
vlog("%s=<%s>\n", var, g_disk_list[index].name);
snprintf(value, len, "%s", g_disk_list[index].name);
return 0;
}
else
{
vlog("[Error] %s not found\n", var);
}
}
else
{
vlog("Invalid var name <%s>\n", var);
snprintf(value, len, "$$%s$$", var);
}
if (value[0] == 0)
{
snprintf(value, len, "$$%s$$", var);
}
return 0;
}
int vtoyexpand_main(int argc, char **argv)
{
FILE *fp = NULL;
FILE *fout = NULL;
char *start = NULL;
char *end = NULL;
char line[4096];
char value[256];
vlog("========= vtoyexpand_main %d ========\n", argc);
if (argc != 3)
{
return 1;
}
g_vtoy_disk_name = argv[2];
if (strncmp(g_vtoy_disk_name, "/dev/", 5) == 0)
{
g_vtoy_disk_name += 5;
}
vlog("<%s> <%s> <%s>\n", argv[1], argv[2], g_vtoy_disk_name);
get_all_disk();
fp = fopen(argv[1], "r");
if (!fp)
{
vlog("Failed to open file <%s>\n", argv[1]);
return 1;
}
fout = fopen(TMP_FILE, "w+");
if (!fout)
{
vlog("Failed to create file <%s>\n", TMP_FILE);
fclose(fp);
return 1;
}
memset(line, 0, sizeof(line));
memset(value, 0, sizeof(value));
while (fgets(line, sizeof(line), fp))
{
start = strstr(line, "$$VT_");
if (start)
{
end = strstr(start + 5, "$$");
}
if (start && end)
{
*start = 0;
fprintf(fout, "%s", line);
*end = 0;
expand_var(start + 2, value, sizeof(value));
fprintf(fout, "%s", value);
fprintf(fout, "%s", end + 2);
memset(value, 0, sizeof(value));
}
else
{
fprintf(fout, "%s", line);
}
line[0] = line[4095] = 0;
}
fclose(fp);
fclose(fout);
vlog("delete file <%s>\n", argv[1]);
remove(argv[1]);
vlog("Copy file <%s> --> <%s>\n", TMP_FILE, argv[1]);
copy_file(TMP_FILE, argv[1]);
return 0;
}
// wrapper main
#ifndef BUILD_VTOY_TOOL
int main(int argc, char **argv)
{
return vtoyexpand_main(argc, argv);
}
#endif

View File

@@ -91,10 +91,6 @@ int vtoyloader_main(int argc, char **argv)
{ {
rc = vtoy_read_file_to_buf(HOOK_CMD_FILE, g_hook_cmd, sizeof(g_hook_cmd) - 1); rc = vtoy_read_file_to_buf(HOOK_CMD_FILE, g_hook_cmd, sizeof(g_hook_cmd) - 1);
debug("g_hook_cmd=<%s>\n", g_hook_cmd); debug("g_hook_cmd=<%s>\n", g_hook_cmd);
// call hook script
rc = system(g_hook_cmd);
debug("system return code =<%d> errno=<%d>\n", rc, errno);
} }
cmdline = (char *)malloc(CMDLINE_BUF_LEN); cmdline = (char *)malloc(CMDLINE_BUF_LEN);
@@ -156,6 +152,13 @@ int vtoyloader_main(int argc, char **argv)
debug("execv [%s]...\n", cmdlist[0]); debug("execv [%s]...\n", cmdlist[0]);
// call hook script
if (g_hook_cmd[0])
{
rc = system(g_hook_cmd);
debug("system return code =<%d> errno=<%d>\n", rc, errno);
}
execv(cmdlist[0], cmdlist); execv(cmdlist[0], cmdlist);
return 0; return 0;

View File

@@ -38,6 +38,7 @@ int vtoyloader_main(int argc, char **argv);
int vtoyvine_main(int argc, char **argv); int vtoyvine_main(int argc, char **argv);
int vtoyksym_main(int argc, char **argv); int vtoyksym_main(int argc, char **argv);
int vtoykmod_main(int argc, char **argv); int vtoykmod_main(int argc, char **argv);
int vtoyexpand_main(int argc, char **argv);
static char *g_vtoytool_name = NULL; static char *g_vtoytool_name = NULL;
static cmd_def g_cmd_list[] = static cmd_def g_cmd_list[] =
@@ -46,8 +47,10 @@ static cmd_def g_cmd_list[] =
{ "vtoydump", vtoydump_main }, { "vtoydump", vtoydump_main },
{ "vtoydm", vtoydm_main }, { "vtoydm", vtoydm_main },
{ "loader", vtoyloader_main }, { "loader", vtoyloader_main },
{ "hald", vtoyloader_main },
{ "vtoyksym", vtoyksym_main }, { "vtoyksym", vtoyksym_main },
{ "vtoykmod", vtoykmod_main }, { "vtoykmod", vtoykmod_main },
{ "vtoyexpand", vtoyexpand_main },
{ "--install", vtoytool_install }, { "--install", vtoytool_install },
}; };

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -36,6 +36,8 @@ static ventoy_guid g_ventoy_guid = VENTOY_GUID;
static HANDLE g_vtoylog_mutex = NULL; static HANDLE g_vtoylog_mutex = NULL;
static HANDLE g_vtoyins_mutex = NULL; static HANDLE g_vtoyins_mutex = NULL;
static DWORD g_vtoy_disk_drive;
static CHAR g_prog_full_path[MAX_PATH]; static CHAR g_prog_full_path[MAX_PATH];
static CHAR g_prog_dir[MAX_PATH]; static CHAR g_prog_dir[MAX_PATH];
static CHAR g_prog_name[MAX_PATH]; static CHAR g_prog_name[MAX_PATH];
@@ -47,6 +49,8 @@ static CHAR g_prog_name[MAX_PATH];
#define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat" #define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat"
#define AUTO_RUN_LOG "X:\\VentoyAutoRun.log" #define AUTO_RUN_LOG "X:\\VentoyAutoRun.log"
#define VTOY_AUTO_FILE "X:\\_vtoy_auto_install"
#define LOG_FILE "X:\\Windows\\system32\\ventoy.log" #define LOG_FILE "X:\\Windows\\system32\\ventoy.log"
#define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE) #define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE)
#define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex) #define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex)
@@ -255,9 +259,25 @@ End:
return rc; return rc;
} }
static BOOL CheckPeHead(BYTE *Head) static BOOL CheckPeHead(BYTE *Buffer, DWORD Size, DWORD Offset)
{ {
UINT32 PeOffset; UINT32 PeOffset;
BYTE *Head = NULL;
DWORD End;
ventoy_windows_data *pdata = NULL;
Head = Buffer + Offset;
pdata = (ventoy_windows_data *)Head;
Head += sizeof(ventoy_windows_data);
if (pdata->auto_install_script[0] && pdata->auto_install_len > 0)
{
End = Offset + sizeof(ventoy_windows_data) + pdata->auto_install_len + 60;
if (End < Size)
{
Head += pdata->auto_install_len;
}
}
if (Head[0] != 'M' || Head[1] != 'Z') if (Head[0] != 'M' || Head[1] != 'Z')
{ {
@@ -742,7 +762,7 @@ static int VentoyFatDiskRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount)
bRet = ReadFile(g_FatPhyDrive, Buffer, ReadSize, &dwSize, NULL); bRet = ReadFile(g_FatPhyDrive, Buffer, ReadSize, &dwSize, NULL);
if (bRet == FALSE || dwSize != ReadSize) if (bRet == FALSE || dwSize != ReadSize)
{ {
Log("ReadFile error bRet:%u WriteSize:%u dwSize:%u ErrCode:%u\n", bRet, ReadSize, dwSize, GetLastError()); Log("ReadFile error bRet:%u WriteSize:%u dwSize:%u ErrCode:%u", bRet, ReadSize, dwSize, GetLastError());
} }
return 1; return 1;
@@ -1273,12 +1293,485 @@ End:
return rc; return rc;
} }
static int UnattendNeedVarExpand(const char *script)
{
FILE *fp = NULL;
char szLine[4096];
fopen_s(&fp, script, "r");
if (!fp)
{
return 0;
}
szLine[0] = szLine[4095] = 0;
while (fgets(szLine, sizeof(szLine) - 1, fp))
{
if (strstr(szLine, "$$VT_"))
{
fclose(fp);
return 1;
}
szLine[0] = szLine[4095] = 0;
}
fclose(fp);
return 0;
}
static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var, char *value, int len)
{
int i;
int index = -1;
UINT64 uiDst = 0;
UINT64 uiDelta = 0;
UINT64 uiMaxSize = 0;
UINT64 uiMaxDelta = ULLONG_MAX;
value[0] = 0;
if (strcmp(var, "VT_WINDOWS_DISK_1ST_NONVTOY") == 0)
{
for (i = 0; i < DiskNum; i++)
{
if (pDiskInfo[i].Capacity > 0 && i != g_vtoy_disk_drive)
{
Log("%s=<PhyDrive%d>", var, i);
sprintf_s(value, len, "%d", i);
return 0;
}
}
}
else if (strcmp(var, "VT_WINDOWS_DISK_1ST_NONUSB") == 0)
{
for (i = 0; i < DiskNum; i++)
{
if (pDiskInfo[i].Capacity > 0 && pDiskInfo[i].BusType != BusTypeUsb)
{
Log("%s=<PhyDrive%d>", var, i);
sprintf_s(value, len, "%d", i);
return 0;
}
}
}
else if (strcmp(var, "VT_WINDOWS_DISK_MAX_SIZE") == 0)
{
for (i = 0; i < DiskNum; i++)
{
if (pDiskInfo[i].Capacity > 0 && pDiskInfo[i].Capacity > uiMaxSize)
{
index = i;
uiMaxSize = pDiskInfo[i].Capacity;
}
}
Log("%s=<PhyDrive%d>", var, index);
sprintf_s(value, len, "%d", index);
}
else if (strncmp(var, "VT_WINDOWS_DISK_CLOSEST_", 24) == 0)
{
uiDst = strtoul(var + 24, NULL, 10);
uiDst = uiDst * (1024ULL * 1024ULL * 1024ULL);
for (i = 0; i < DiskNum; i++)
{
if (pDiskInfo[i].Capacity == 0)
{
continue;
}
if (pDiskInfo[i].Capacity > uiDst)
{
uiDelta = pDiskInfo[i].Capacity - uiDst;
}
else
{
uiDelta = uiDst - pDiskInfo[i].Capacity;
}
if (uiDelta < uiMaxDelta)
{
uiMaxDelta = uiDelta;
index = i;
}
}
Log("%s=<PhyDrive%d>", var, index);
sprintf_s(value, len, "%d", index);
}
else
{
Log("Invalid var name <%s>", var);
sprintf_s(value, len, "$$%s$$", var);
}
if (value[0] == 0)
{
sprintf_s(value, len, "$$%s$$", var);
}
return 0;
}
static void TrimString(CHAR *String)
{
CHAR *Pos1 = String;
CHAR *Pos2 = String;
size_t Len = strlen(String);
while (Len > 0)
{
if (String[Len - 1] != ' ' && String[Len - 1] != '\t')
{
break;
}
String[Len - 1] = 0;
Len--;
}
while (*Pos1 == ' ' || *Pos1 == '\t')
{
Pos1++;
}
while (*Pos1)
{
*Pos2++ = *Pos1++;
}
*Pos2++ = 0;
return;
}
static int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue)
{
HKEY hKey;
DWORD Type;
DWORD Size;
LSTATUS lRet;
DWORD Value;
lRet = RegOpenKeyExA(Key, SubKey, 0, KEY_QUERY_VALUE, &hKey);
Log("RegOpenKeyExA <%s> Ret:%ld", SubKey, lRet);
if (ERROR_SUCCESS == lRet)
{
Size = sizeof(Value);
lRet = RegQueryValueExA(hKey, ValueName, NULL, &Type, (LPBYTE)&Value, &Size);
Log("RegQueryValueExA <%s> ret:%u Size:%u Value:%u", ValueName, lRet, Size, Value);
*pValue = Value;
RegCloseKey(hKey);
return 0;
}
else
{
return 1;
}
}
static const CHAR * GetBusTypeString(int Type)
{
switch (Type)
{
case BusTypeUnknown: return "unknown";
case BusTypeScsi: return "SCSI";
case BusTypeAtapi: return "Atapi";
case BusTypeAta: return "ATA";
case BusType1394: return "1394";
case BusTypeSsa: return "SSA";
case BusTypeFibre: return "Fibre";
case BusTypeUsb: return "USB";
case BusTypeRAID: return "RAID";
case BusTypeiScsi: return "iSCSI";
case BusTypeSas: return "SAS";
case BusTypeSata: return "SATA";
case BusTypeSd: return "SD";
case BusTypeMmc: return "MMC";
case BusTypeVirtual: return "Virtual";
case BusTypeFileBackedVirtual: return "FileBackedVirtual";
case BusTypeSpaces: return "Spaces";
case BusTypeNvme: return "Nvme";
}
return "unknown";
}
static int GetHumanReadableGBSize(UINT64 SizeBytes)
{
int i;
int Pow2 = 1;
double Delta;
double GB = SizeBytes * 1.0 / 1000 / 1000 / 1000;
if ((SizeBytes % 1073741824) == 0)
{
return (int)(SizeBytes / 1073741824);
}
for (i = 0; i < 12; i++)
{
if (Pow2 > GB)
{
Delta = (Pow2 - GB) / Pow2;
}
else
{
Delta = (GB - Pow2) / Pow2;
}
if (Delta < 0.05)
{
return Pow2;
}
Pow2 <<= 1;
}
return (int)GB;
}
static int EnumerateAllDisk(VarDiskInfo **ppDiskInfo, int *pDiskNum)
{
int i;
DWORD Value;
int DiskNum = 0;
BOOL bRet;
DWORD dwBytes;
VarDiskInfo *pDiskInfo = NULL;
HANDLE Handle = INVALID_HANDLE_VALUE;
CHAR PhyDrive[128];
GET_LENGTH_INFORMATION LengthInfo;
STORAGE_PROPERTY_QUERY Query;
STORAGE_DESCRIPTOR_HEADER DevDescHeader;
STORAGE_DEVICE_DESCRIPTOR *pDevDesc;
if (GetRegDwordValue(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\disk\\Enum", "Count", &Value) == 0)
{
DiskNum = (int)Value;
}
else
{
Log("Failed to read disk count");
return 1;
}
Log("Current phy disk count:%d", DiskNum);
if (DiskNum <= 0)
{
return 1;
}
pDiskInfo = malloc(DiskNum * sizeof(VarDiskInfo));
if (!pDiskInfo)
{
Log("Failed to alloc");
return 1;
}
memset(pDiskInfo, 0, DiskNum * sizeof(VarDiskInfo));
for (i = 0; i < DiskNum; i++)
{
SAFE_CLOSE_HANDLE(Handle);
safe_sprintf(PhyDrive, "\\\\.\\PhysicalDrive%d", i);
Handle = CreateFileA(PhyDrive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
Log("Create file Handle:%p %s status:%u", Handle, PhyDrive, LASTERR);
if (Handle == INVALID_HANDLE_VALUE)
{
continue;
}
bRet = DeviceIoControl(Handle,
IOCTL_DISK_GET_LENGTH_INFO, NULL,
0,
&LengthInfo,
sizeof(LengthInfo),
&dwBytes,
NULL);
if (!bRet)
{
Log("DeviceIoControl IOCTL_DISK_GET_LENGTH_INFO failed error:%u", LASTERR);
continue;
}
Log("PHYSICALDRIVE%d size %llu bytes", i, (ULONGLONG)LengthInfo.Length.QuadPart);
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
bRet = DeviceIoControl(Handle,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query,
sizeof(Query),
&DevDescHeader,
sizeof(STORAGE_DESCRIPTOR_HEADER),
&dwBytes,
NULL);
if (!bRet)
{
Log("DeviceIoControl1 error:%u dwBytes:%u", LASTERR, dwBytes);
continue;
}
if (DevDescHeader.Size < sizeof(STORAGE_DEVICE_DESCRIPTOR))
{
Log("Invalid DevDescHeader.Size:%u", DevDescHeader.Size);
continue;
}
pDevDesc = (STORAGE_DEVICE_DESCRIPTOR *)malloc(DevDescHeader.Size);
if (!pDevDesc)
{
Log("failed to malloc error:%u len:%u", LASTERR, DevDescHeader.Size);
continue;
}
bRet = DeviceIoControl(Handle,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query,
sizeof(Query),
pDevDesc,
DevDescHeader.Size,
&dwBytes,
NULL);
if (!bRet)
{
Log("DeviceIoControl2 error:%u dwBytes:%u", LASTERR, dwBytes);
free(pDevDesc);
continue;
}
pDiskInfo[i].RemovableMedia = pDevDesc->RemovableMedia;
pDiskInfo[i].BusType = pDevDesc->BusType;
pDiskInfo[i].DeviceType = pDevDesc->DeviceType;
pDiskInfo[i].Capacity = LengthInfo.Length.QuadPart;
if (pDevDesc->VendorIdOffset)
{
safe_strcpy(pDiskInfo[i].VendorId, (char *)pDevDesc + pDevDesc->VendorIdOffset);
TrimString(pDiskInfo[i].VendorId);
}
if (pDevDesc->ProductIdOffset)
{
safe_strcpy(pDiskInfo[i].ProductId, (char *)pDevDesc + pDevDesc->ProductIdOffset);
TrimString(pDiskInfo[i].ProductId);
}
if (pDevDesc->ProductRevisionOffset)
{
safe_strcpy(pDiskInfo[i].ProductRev, (char *)pDevDesc + pDevDesc->ProductRevisionOffset);
TrimString(pDiskInfo[i].ProductRev);
}
if (pDevDesc->SerialNumberOffset)
{
safe_strcpy(pDiskInfo[i].SerialNumber, (char *)pDevDesc + pDevDesc->SerialNumberOffset);
TrimString(pDiskInfo[i].SerialNumber);
}
free(pDevDesc);
SAFE_CLOSE_HANDLE(Handle);
}
Log("########## DUMP DISK BEGIN ##########");
for (i = 0; i < DiskNum; i++)
{
Log("PhyDrv:%d BusType:%-4s Removable:%u Size:%dGB(%llu) Name:%s %s",
i, GetBusTypeString(pDiskInfo[i].BusType), pDiskInfo[i].RemovableMedia,
GetHumanReadableGBSize(pDiskInfo[i].Capacity), pDiskInfo[i].Capacity,
pDiskInfo[i].VendorId, pDiskInfo[i].ProductId);
}
Log("Ventoy disk is PhyDvr%d", g_vtoy_disk_drive);
Log("########## DUMP DISK END ##########");
*ppDiskInfo = pDiskInfo;
*pDiskNum = DiskNum;
return 0;
}
static int UnattendVarExpand(const char *script, const char *tmpfile)
{
FILE *fp = NULL;
FILE *fout = NULL;
char *start = NULL;
char *end = NULL;
char szLine[4096];
char szValue[256];
int DiskNum = 0;
VarDiskInfo *pDiskInfo = NULL;
Log("UnattendVarExpand ...");
if (EnumerateAllDisk(&pDiskInfo, &DiskNum))
{
Log("Failed to EnumerateAllDisk");
return 1;
}
fopen_s(&fp, script, "r");
if (!fp)
{
free(pDiskInfo);
return 0;
}
fopen_s(&fout, tmpfile, "w+");
if (!fout)
{
fclose(fp);
free(pDiskInfo);
return 0;
}
szLine[0] = szLine[4095] = 0;
while (fgets(szLine, sizeof(szLine) - 1, fp))
{
start = strstr(szLine, "$$VT_");
if (start)
{
end = strstr(start + 5, "$$");
}
if (start && end)
{
*start = 0;
fprintf(fout, "%s", szLine);
*end = 0;
ExpandSingleVar(pDiskInfo, DiskNum, start + 2, szValue, sizeof(szValue) - 1);
fprintf(fout, "%s", szValue);
fprintf(fout, "%s", end + 2);
}
else
{
fprintf(fout, "%s", szLine);
}
szLine[0] = szLine[4095] = 0;
}
fclose(fp);
fclose(fout);
free(pDiskInfo);
return 0;
}
//#define VAR_DEBUG 1
static int ProcessUnattendedInstallation(const char *script) static int ProcessUnattendedInstallation(const char *script)
{ {
DWORD dw; DWORD dw;
HKEY hKey; HKEY hKey;
LSTATUS Ret; LSTATUS Ret;
CHAR Letter; CHAR Letter;
CHAR TmpFile[MAX_PATH];
CHAR CurDir[MAX_PATH]; CHAR CurDir[MAX_PATH];
Log("Copy unattended XML ..."); Log("Copy unattended XML ...");
@@ -1293,16 +1786,34 @@ static int ProcessUnattendedInstallation(const char *script)
{ {
Letter = 'X'; Letter = 'X';
} }
sprintf_s(CurDir, sizeof(CurDir), "%C:\\Autounattend.xml", Letter);
Log("Copy file <%s> --> <%s>", script, CurDir);
CopyFile(script, CurDir, FALSE);
#ifdef VAR_DEBUG
sprintf_s(CurDir, sizeof(CurDir), "%C:\\AutounattendXXX.xml", Letter);
#else
sprintf_s(CurDir, sizeof(CurDir), "%C:\\Autounattend.xml", Letter);
#endif
if (UnattendNeedVarExpand(script))
{
sprintf_s(TmpFile, sizeof(TmpFile), "%C:\\__Autounattend", Letter);
UnattendVarExpand(script, TmpFile);
Log("Expand Copy file <%s> --> <%s>", script, CurDir);
CopyFile(TmpFile, CurDir, FALSE);
}
else
{
Log("No var expand copy file <%s> --> <%s>", script, CurDir);
CopyFile(script, CurDir, FALSE);
}
#ifndef VAR_DEBUG
Ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw); Ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw);
if (ERROR_SUCCESS == Ret) if (ERROR_SUCCESS == Ret)
{ {
Ret = RegSetValueEx(hKey, "UnattendFile", 0, REG_SZ, CurDir, (DWORD)(strlen(CurDir) + 1)); Ret = RegSetValueEx(hKey, "UnattendFile", 0, REG_SZ, CurDir, (DWORD)(strlen(CurDir) + 1));
} }
#endif
return 0; return 0;
} }
@@ -1475,7 +1986,7 @@ static int VentoyHook(ventoy_os_param *param)
if (IsUTF8Encode(param->vtoy_img_path)) if (IsUTF8Encode(param->vtoy_img_path))
{ {
Log("This file is UTF8 encoding\n"); Log("This file is UTF8 encoding");
} }
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
@@ -1604,6 +2115,8 @@ static int VentoyHook(ventoy_os_param *param)
return 1; return 1;
} }
g_vtoy_disk_drive = VtoyDiskNum;
Drives = GetLogicalDrives(); Drives = GetLogicalDrives();
Log("Drives before mount: 0x%x", Drives); Log("Drives before mount: 0x%x", Drives);
@@ -1647,11 +2160,10 @@ static int VentoyHook(ventoy_os_param *param)
if (g_windows_data.auto_install_script[0]) if (g_windows_data.auto_install_script[0])
{ {
sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.auto_install_script); if (IsFileExist("%s", VTOY_AUTO_FILE))
if (IsFileExist("%s", IsoPath))
{ {
Log("use auto install script %s...", IsoPath); Log("use auto install script %s...", VTOY_AUTO_FILE);
ProcessUnattendedInstallation(IsoPath); ProcessUnattendedInstallation(VTOY_AUTO_FILE);
} }
else else
{ {
@@ -1724,6 +2236,25 @@ static int VentoyHook(ventoy_os_param *param)
return 0; return 0;
} }
static int ExtractWindowsDataFile(char *databuf)
{
int len = 0;
char *filedata = NULL;
ventoy_windows_data *pdata = (ventoy_windows_data *)databuf;
Log("ExtractWindowsDataFile: auto install <%s:%d>", pdata->auto_install_script, pdata->auto_install_len);
filedata = databuf + sizeof(ventoy_windows_data);
if (pdata->auto_install_script[0] && pdata->auto_install_len > 0)
{
SaveBuffer2File(VTOY_AUTO_FILE, filedata, pdata->auto_install_len);
filedata += pdata->auto_install_len;
len = pdata->auto_install_len;
}
return len;
}
int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile) int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)
{ {
@@ -1741,6 +2272,7 @@ int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)
memcpy(&g_os_param, buf, sizeof(ventoy_os_param)); memcpy(&g_os_param, buf, sizeof(ventoy_os_param));
memcpy(&g_windows_data, buf + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); memcpy(&g_windows_data, buf + sizeof(ventoy_os_param), sizeof(ventoy_windows_data));
ExtractWindowsDataFile(buf + sizeof(ventoy_os_param));
memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved)); memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved));
if (g_os_param_reserved[0] == 1) if (g_os_param_reserved[0] == 1)
@@ -1800,6 +2332,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
{ {
int rc = 1; int rc = 1;
int stat = 0; int stat = 0;
int exlen = 0;
DWORD Pos; DWORD Pos;
DWORD PeStart; DWORD PeStart;
DWORD FileSize; DWORD FileSize;
@@ -1835,12 +2368,13 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
for (PeStart = 0; PeStart < FileSize; PeStart += 16) for (PeStart = 0; PeStart < FileSize; PeStart += 16)
{ {
if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) && if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) &&
CheckPeHead(Buffer + PeStart + sizeof(ventoy_os_param) + sizeof(ventoy_windows_data))) CheckPeHead(Buffer, FileSize, PeStart + sizeof(ventoy_os_param)))
{ {
Log("Find os pararm at %u", PeStart); Log("Find os pararm at %u", PeStart);
memcpy(&g_os_param, Buffer + PeStart, sizeof(ventoy_os_param)); memcpy(&g_os_param, Buffer + PeStart, sizeof(ventoy_os_param));
memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data));
exlen = ExtractWindowsDataFile(Buffer + PeStart + sizeof(ventoy_os_param));
memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved)); memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved));
if (g_os_param_reserved[0] == 1) if (g_os_param_reserved[0] == 1)
@@ -1858,7 +2392,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
} }
} }
PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data); PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data) + exlen;
sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName)); sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));
MUTEX_LOCK(g_vtoyins_mutex); MUTEX_LOCK(g_vtoyins_mutex);

View File

@@ -1,29 +1,29 @@
/****************************************************************************** /******************************************************************************
* vtoyjump.h * vtoyjump.h
* *
* Copyright (c) 2020, longpanda <admin@ventoy.net> * Copyright (c) 2020, longpanda <admin@ventoy.net>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the * published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version. * License, or (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, but * This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of * WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details. * General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
* *
*/ */
#ifndef __VTOYJUMP_H__ #ifndef __VTOYJUMP_H__
#define __VTOYJUMP_H__ #define __VTOYJUMP_H__
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#define SIZE_1MB (1024 * 1024) #define SIZE_1MB (1024 * 1024)
#define VENTOY_EFI_PART_SIZE (32 * SIZE_1MB) #define VENTOY_EFI_PART_SIZE (32 * SIZE_1MB)
#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }} #define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
@@ -67,98 +67,124 @@ typedef struct ventoy_os_param
UINT8 reserved[27]; UINT8 reserved[27];
}ventoy_os_param; }ventoy_os_param;
typedef struct ventoy_windows_data typedef struct ventoy_windows_data
{ {
char auto_install_script[384]; char auto_install_script[384];
char injection_archive[384]; char injection_archive[384];
UINT8 windows11_bypass_check; UINT8 windows11_bypass_check;
UINT8 reserved[255];
UINT32 auto_install_len;
UINT8 reserved[255 - 4];
/* auto install script file data ... + auto_install_len */
/* ...... */
}ventoy_windows_data; }ventoy_windows_data;
typedef struct PART_TABLE typedef struct PART_TABLE
{ {
UINT8 Active; // 0x00 0x80 UINT8 Active; // 0x00 0x80
UINT8 StartHead; UINT8 StartHead;
UINT16 StartSector : 6; UINT16 StartSector : 6;
UINT16 StartCylinder : 10; UINT16 StartCylinder : 10;
UINT8 FsFlag; UINT8 FsFlag;
UINT8 EndHead; UINT8 EndHead;
UINT16 EndSector : 6; UINT16 EndSector : 6;
UINT16 EndCylinder : 10; UINT16 EndCylinder : 10;
UINT32 StartSectorId; UINT32 StartSectorId;
UINT32 SectorCount; UINT32 SectorCount;
}PART_TABLE; }PART_TABLE;
typedef struct MBR_HEAD typedef struct MBR_HEAD
{ {
UINT8 BootCode[446]; UINT8 BootCode[446];
PART_TABLE PartTbl[4]; PART_TABLE PartTbl[4];
UINT8 Byte55; UINT8 Byte55;
UINT8 ByteAA; UINT8 ByteAA;
}MBR_HEAD; }MBR_HEAD;
typedef struct VTOY_GPT_HDR typedef struct VTOY_GPT_HDR
{ {
CHAR Signature[8]; /* EFI PART */ CHAR Signature[8]; /* EFI PART */
UINT8 Version[4]; UINT8 Version[4];
UINT32 Length; UINT32 Length;
UINT32 Crc; UINT32 Crc;
UINT8 Reserved1[4]; UINT8 Reserved1[4];
UINT64 EfiStartLBA; UINT64 EfiStartLBA;
UINT64 EfiBackupLBA; UINT64 EfiBackupLBA;
UINT64 PartAreaStartLBA; UINT64 PartAreaStartLBA;
UINT64 PartAreaEndLBA; UINT64 PartAreaEndLBA;
GUID DiskGuid; GUID DiskGuid;
UINT64 PartTblStartLBA; UINT64 PartTblStartLBA;
UINT32 PartTblTotNum; UINT32 PartTblTotNum;
UINT32 PartTblEntryLen; UINT32 PartTblEntryLen;
UINT32 PartTblCrc; UINT32 PartTblCrc;
UINT8 Reserved2[420]; UINT8 Reserved2[420];
}VTOY_GPT_HDR; }VTOY_GPT_HDR;
typedef struct VTOY_GPT_PART_TBL typedef struct VTOY_GPT_PART_TBL
{ {
GUID PartType; GUID PartType;
GUID PartGuid; GUID PartGuid;
UINT64 StartLBA; UINT64 StartLBA;
UINT64 LastLBA; UINT64 LastLBA;
UINT64 Attr; UINT64 Attr;
UINT16 Name[36]; UINT16 Name[36];
}VTOY_GPT_PART_TBL; }VTOY_GPT_PART_TBL;
typedef struct VTOY_GPT_INFO typedef struct VTOY_GPT_INFO
{ {
MBR_HEAD MBR; MBR_HEAD MBR;
VTOY_GPT_HDR Head; VTOY_GPT_HDR Head;
VTOY_GPT_PART_TBL PartTbl[128]; VTOY_GPT_PART_TBL PartTbl[128];
}VTOY_GPT_INFO; }VTOY_GPT_INFO;
#pragma pack() #pragma pack()
#define SAFE_CLOSE_HANDLE(handle) \
{\ typedef struct VarDiskInfo
if (handle != INVALID_HANDLE_VALUE) \ {
{\ UINT64 Capacity;
CloseHandle(handle); \ int BusType;
(handle) = INVALID_HANDLE_VALUE; \ BOOL RemovableMedia;
}\ BYTE DeviceType;
} CHAR VendorId[128];
CHAR ProductId[128];
#define LASTERR GetLastError() CHAR ProductRev[128];
CHAR SerialNumber[128];
int unxz(unsigned char *in, int in_size, }VarDiskInfo;
int(*fill)(void *dest, unsigned int size),
int(*flush)(void *src, unsigned int size),
unsigned char *out, int *in_used, #define SAFE_CLOSE_HANDLE(handle) \
void(*error)(char *x)); {\
if (handle != INVALID_HANDLE_VALUE) \
#endif {\
CloseHandle(handle); \
(handle) = INVALID_HANDLE_VALUE; \
}\
}
#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 LASTERR GetLastError()
int 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));
#endif