mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-09-16 09:01:15 +00:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
147a23c9dd | ||
|
062c71b972 | ||
|
78ab7a0759 | ||
|
3ebd58c9df | ||
|
ce6d379564 | ||
|
40fdfa66b9 | ||
|
9ddee7394d | ||
|
c9b316a757 | ||
|
1ba23bcdff | ||
|
6630ab3585 |
@@ -82,6 +82,8 @@ grub_uint32_t g_ventoy_cpio_size = 0;
|
||||
cpio_newc_header *g_ventoy_initrd_head = NULL;
|
||||
grub_uint8_t *g_ventoy_runtime_buf = NULL;
|
||||
|
||||
int g_plugin_image_list = 0;
|
||||
|
||||
ventoy_grub_param *g_grub_param = NULL;
|
||||
|
||||
ventoy_guid g_ventoy_guid = VENTOY_GUID;
|
||||
@@ -94,6 +96,12 @@ char *g_wimiso_path = NULL;
|
||||
|
||||
int g_vhdboot_enable = 0;
|
||||
|
||||
grub_uint64_t g_conf_replace_offset = 0;
|
||||
conf_replace *g_conf_replace_node = NULL;
|
||||
grub_uint8_t *g_conf_replace_new_buf = NULL;
|
||||
int g_conf_replace_new_len = 0;
|
||||
int g_conf_replace_new_len_align = 0;
|
||||
|
||||
ventoy_gpt_info *g_ventoy_part_info = NULL;
|
||||
|
||||
static char *g_tree_script_buf = NULL;
|
||||
@@ -1018,6 +1026,11 @@ int ventoy_cmp_img(img_info *img1, img_info *img2)
|
||||
int c1 = 0;
|
||||
int c2 = 0;
|
||||
|
||||
if (g_plugin_image_list)
|
||||
{
|
||||
return (img1->plugin_list_index - img2->plugin_list_index);
|
||||
}
|
||||
|
||||
for (s1 = img1->name, s2 = img2->name; *s1 && *s2; s1++, s2++)
|
||||
{
|
||||
c1 = *s1;
|
||||
@@ -1045,13 +1058,18 @@ int ventoy_cmp_img(img_info *img1, img_info *img2)
|
||||
return (c1 - c2);
|
||||
}
|
||||
|
||||
static int ventoy_cmp_subdir(char *name1, char *name2)
|
||||
static int ventoy_cmp_subdir(img_iterator_node *node1, img_iterator_node *node2)
|
||||
{
|
||||
char *s1, *s2;
|
||||
int c1 = 0;
|
||||
int c2 = 0;
|
||||
|
||||
for (s1 = name1, s2 = name2; *s1 && *s2; s1++, s2++)
|
||||
if (g_plugin_image_list)
|
||||
{
|
||||
return (node1->plugin_list_index - node2->plugin_list_index);
|
||||
}
|
||||
|
||||
for (s1 = node1->dir, s2 = node2->dir; *s1 && *s2; s1++, s2++)
|
||||
{
|
||||
c1 = *s1;
|
||||
c2 = *s2;
|
||||
@@ -1135,6 +1153,7 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
|
||||
int i = 0;
|
||||
int type = 0;
|
||||
int ignore = 0;
|
||||
int index = 0;
|
||||
grub_size_t len;
|
||||
img_info *img;
|
||||
img_info *tail;
|
||||
@@ -1162,9 +1181,21 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_plugin_image_list)
|
||||
{
|
||||
grub_snprintf(g_img_swap_tmp_buf, sizeof(g_img_swap_tmp_buf), "%s%s/", node->dir, filename);
|
||||
index = ventoy_plugin_get_image_list_index(vtoy_class_directory, g_img_swap_tmp_buf);
|
||||
if (index == 0)
|
||||
{
|
||||
debug("Directory %s not found in image_list plugin config...\n", g_img_swap_tmp_buf);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
new_node = grub_zalloc(sizeof(img_iterator_node));
|
||||
if (new_node)
|
||||
{
|
||||
new_node->plugin_list_index = index;
|
||||
new_node->dirlen = grub_snprintf(new_node->dir, sizeof(new_node->dir), "%s%s/", node->dir, filename);
|
||||
|
||||
g_enum_fs->fs_dir(g_enum_dev, new_node->dir, ventoy_check_ignore_flag, &ignore);
|
||||
@@ -1247,11 +1278,23 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (g_plugin_image_list)
|
||||
{
|
||||
grub_snprintf(g_img_swap_tmp_buf, sizeof(g_img_swap_tmp_buf), "%s%s", node->dir, filename);
|
||||
index = ventoy_plugin_get_image_list_index(vtoy_class_image_file, g_img_swap_tmp_buf);
|
||||
if (index == 0)
|
||||
{
|
||||
debug("File %s not found in image_list plugin config...\n", g_img_swap_tmp_buf);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
img = grub_zalloc(sizeof(img_info));
|
||||
if (img)
|
||||
{
|
||||
img->type = type;
|
||||
img->plugin_list_index = index;
|
||||
grub_snprintf(img->name, sizeof(img->name), "%s", filename);
|
||||
|
||||
for (i = 0; i < (int)len; i++)
|
||||
@@ -1435,7 +1478,7 @@ static img_iterator_node * ventoy_get_min_child(img_iterator_node *node)
|
||||
|
||||
while (child && child->parent == node)
|
||||
{
|
||||
if (child->select == 0 && (NULL == Minchild || ventoy_cmp_subdir(child->dir, Minchild->dir) < 0))
|
||||
if (child->select == 0 && (NULL == Minchild || ventoy_cmp_subdir(child, Minchild) < 0))
|
||||
{
|
||||
Minchild = child;
|
||||
}
|
||||
@@ -1695,6 +1738,7 @@ static int ventoy_set_default_menu(void)
|
||||
char *pos = NULL;
|
||||
char *end = NULL;
|
||||
char *def = NULL;
|
||||
const char *strdata = NULL;
|
||||
img_info *cur = NULL;
|
||||
img_info *default_node = NULL;
|
||||
const char *default_image = NULL;
|
||||
@@ -1732,7 +1776,20 @@ static int ventoy_set_default_menu(void)
|
||||
|
||||
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, "set default=%c", '\'');
|
||||
|
||||
pos = def + 1;
|
||||
strdata = ventoy_get_env("VTOY_DEFAULT_SEARCH_ROOT");
|
||||
if (strdata && strdata[0] == '/')
|
||||
{
|
||||
pos = def + grub_strlen(strdata);
|
||||
if (*pos == '/')
|
||||
{
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pos = def + 1;
|
||||
}
|
||||
|
||||
while ((end = grub_strchr(pos, '/')) != NULL)
|
||||
{
|
||||
*end = 0;
|
||||
@@ -2311,6 +2368,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]);
|
||||
}
|
||||
|
||||
g_conf_replace_node = NULL;
|
||||
g_conf_replace_offset = 0;
|
||||
|
||||
if (g_img_chunk_list.chunk)
|
||||
{
|
||||
grub_free(g_img_chunk_list.chunk);
|
||||
@@ -2349,6 +2409,75 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_uint64_t offset = 0;
|
||||
grub_uint32_t align = 0;
|
||||
grub_file_t file = NULL;
|
||||
conf_replace *node = NULL;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
(void)args;
|
||||
|
||||
debug("select conf replace argc:%d\n", argc);
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
node = ventoy_plugin_find_conf_replace(args[1]);
|
||||
if (!node)
|
||||
{
|
||||
debug("Conf replace not found for %s\n", args[1]);
|
||||
goto end;
|
||||
}
|
||||
|
||||
debug("Find conf replace for %s\n", args[1]);
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", node->orgconf);
|
||||
if (!file)
|
||||
{
|
||||
debug("<(loop)%s> NOT exist\n", node->orgconf);
|
||||
goto end;
|
||||
}
|
||||
|
||||
offset = grub_iso9660_get_last_file_dirent_pos(file);
|
||||
grub_file_close(file);
|
||||
|
||||
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;
|
||||
|
||||
debug("conf_replace OK: newlen: %d\n", g_conf_replace_new_len);
|
||||
|
||||
end:
|
||||
if (file)
|
||||
{
|
||||
grub_file_close(file);
|
||||
}
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i = 0;
|
||||
@@ -2678,7 +2807,7 @@ static grub_err_t ventoy_cmd_dump_img_list(grub_extcmd_context_t ctxt, int argc,
|
||||
|
||||
while (cur)
|
||||
{
|
||||
grub_printf("path:<%s> id=%d\n", cur->path, cur->id);
|
||||
grub_printf("path:<%s> id=%d list_index=%d\n", cur->path, cur->id, cur->plugin_list_index);
|
||||
grub_printf("name:<%s>\n\n", cur->name);
|
||||
cur = cur->next;
|
||||
}
|
||||
@@ -3778,6 +3907,7 @@ static int ventoy_env_init(void)
|
||||
g_part_list_buf = grub_malloc(VTOY_PART_BUF_LEN);
|
||||
g_tree_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);
|
||||
|
||||
ventoy_filt_register(0, ventoy_wrapper_open);
|
||||
|
||||
@@ -3846,6 +3976,7 @@ static cmd_para ventoy_cmds[] =
|
||||
{ "vt_dump_persistence", ventoy_cmd_dump_persistence, 0, NULL, "", "", NULL },
|
||||
{ "vt_select_auto_install", ventoy_cmd_sel_auto_install, 0, NULL, "", "", NULL },
|
||||
{ "vt_select_persistence", ventoy_cmd_sel_persistence, 0, NULL, "", "", NULL },
|
||||
{ "vt_select_conf_replace", ventoy_select_conf_replace, 0, NULL, "", "", NULL },
|
||||
|
||||
{ "vt_iso9660_nojoliet", ventoy_cmd_iso9660_nojoliet, 0, NULL, "", "", NULL },
|
||||
{ "vt_is_udf", ventoy_cmd_is_udf, 0, NULL, "", "", NULL },
|
||||
@@ -3910,7 +4041,7 @@ GRUB_MOD_INIT(ventoy)
|
||||
cmd_para *cur = NULL;
|
||||
|
||||
ventoy_env_init();
|
||||
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ventoy_cmds); i++)
|
||||
{
|
||||
cur = ventoy_cmds + i;
|
||||
|
@@ -52,6 +52,12 @@
|
||||
|
||||
#define VTOY_WARNING "!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!"
|
||||
|
||||
#ifdef GRUB_MACHINE_EFI
|
||||
#define VTOY_DUAL_MODE_SUFFIX "uefi"
|
||||
#else
|
||||
#define VTOY_DUAL_MODE_SUFFIX "legacy"
|
||||
#endif
|
||||
|
||||
typedef struct ventoy_initrd_ctx
|
||||
{
|
||||
const char *path_prefix;
|
||||
@@ -172,6 +178,7 @@ typedef struct img_info
|
||||
|
||||
int id;
|
||||
int type;
|
||||
int plugin_list_index;
|
||||
grub_uint64_t size;
|
||||
int select;
|
||||
int unsupport;
|
||||
@@ -192,6 +199,8 @@ typedef struct img_iterator_node
|
||||
int done;
|
||||
int select;
|
||||
|
||||
int plugin_list_index;
|
||||
|
||||
struct img_iterator_node *parent;
|
||||
struct img_iterator_node *firstchild;
|
||||
|
||||
@@ -761,6 +770,17 @@ typedef struct menu_class
|
||||
struct menu_class *next;
|
||||
}menu_class;
|
||||
|
||||
#define vtoy_max_replace_file_size (2 * 1024 * 1024)
|
||||
typedef struct conf_replace
|
||||
{
|
||||
int pathlen;
|
||||
char isopath[256];
|
||||
char orgconf[256];
|
||||
char newconf[256];
|
||||
|
||||
struct conf_replace *next;
|
||||
}conf_replace;
|
||||
|
||||
typedef struct injection_config
|
||||
{
|
||||
int pathlen;
|
||||
@@ -778,6 +798,14 @@ typedef struct auto_memdisk
|
||||
struct auto_memdisk *next;
|
||||
}auto_memdisk;
|
||||
|
||||
typedef struct image_list
|
||||
{
|
||||
int pathlen;
|
||||
char isopath[256];
|
||||
|
||||
struct image_list *next;
|
||||
}image_list;
|
||||
|
||||
extern int g_ventoy_menu_esc;
|
||||
extern int g_ventoy_suppress_esc;
|
||||
extern int g_ventoy_last_entry;
|
||||
@@ -787,7 +815,13 @@ extern int g_ventoy_iso_uefi_drv;
|
||||
extern int g_ventoy_case_insensitive;
|
||||
extern grub_uint8_t g_ventoy_chain_type;
|
||||
extern int g_vhdboot_enable;
|
||||
extern int g_plugin_image_list;
|
||||
extern ventoy_gpt_info *g_ventoy_part_info;
|
||||
extern grub_uint64_t g_conf_replace_offset;
|
||||
extern conf_replace *g_conf_replace_node;
|
||||
extern grub_uint8_t *g_conf_replace_new_buf;
|
||||
extern int g_conf_replace_new_len;
|
||||
extern int g_conf_replace_new_len_align;
|
||||
|
||||
#define ventoy_unix_fill_virt(new_data, new_len) \
|
||||
{ \
|
||||
@@ -819,6 +853,8 @@ 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_class(int type, const char *name);
|
||||
int ventoy_plugin_check_memdisk(const char *isopath);
|
||||
int ventoy_plugin_get_image_list_index(int type, const char *name);
|
||||
conf_replace * ventoy_plugin_find_conf_replace(const char *iso);
|
||||
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||
void ventoy_plugin_dump_persistence(void);
|
||||
|
@@ -333,6 +333,7 @@ end:
|
||||
static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
{
|
||||
int i = 0;
|
||||
int dollar = 0;
|
||||
grub_file_t file = NULL;
|
||||
char *buf = NULL;
|
||||
char *start = NULL;
|
||||
@@ -388,13 +389,18 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
dollar = 0;
|
||||
for (i = 0; i < 255 && (0 == ventoy_is_word_end(*start)); i++)
|
||||
{
|
||||
img->name[i] = *start++;
|
||||
if (img->name[i] == '$')
|
||||
{
|
||||
dollar = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
|
||||
if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
|
||||
{
|
||||
grub_free(img);
|
||||
}
|
||||
@@ -625,9 +631,30 @@ int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, co
|
||||
return headlen;
|
||||
}
|
||||
|
||||
static grub_uint32_t ventoy_linux_get_virt_chunk_count(void)
|
||||
{
|
||||
grub_uint32_t count = g_valid_initrd_count;
|
||||
|
||||
if (g_conf_replace_offset > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
|
||||
{
|
||||
return (sizeof(ventoy_virt_chunk) + g_ventoy_cpio_size) * g_valid_initrd_count;
|
||||
grub_uint32_t size;
|
||||
|
||||
size = (sizeof(ventoy_virt_chunk) + g_ventoy_cpio_size) * g_valid_initrd_count;
|
||||
|
||||
if (g_conf_replace_offset > 0)
|
||||
{
|
||||
size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain)
|
||||
@@ -646,7 +673,7 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
|
||||
sector = (isosize + 2047) / 2048;
|
||||
cpio_secs = g_ventoy_cpio_size / 2048;
|
||||
|
||||
offset = g_valid_initrd_count * sizeof(ventoy_virt_chunk);
|
||||
offset = ventoy_linux_get_virt_chunk_count() * sizeof(ventoy_virt_chunk);
|
||||
cur = (ventoy_virt_chunk *)override;
|
||||
|
||||
for (node = g_initrd_img_list; node; node = node->next)
|
||||
@@ -682,12 +709,51 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
|
||||
cur++;
|
||||
}
|
||||
|
||||
if (g_conf_replace_offset > 0)
|
||||
{
|
||||
cpio_secs = g_conf_replace_new_len_align / 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;
|
||||
|
||||
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;
|
||||
|
||||
offset += g_conf_replace_new_len_align;
|
||||
sector += cpio_secs;
|
||||
cur++;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static grub_uint32_t ventoy_linux_get_override_chunk_count(void)
|
||||
{
|
||||
grub_uint32_t count = g_valid_initrd_count;
|
||||
|
||||
if (g_conf_replace_offset > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static grub_uint32_t ventoy_linux_get_override_chunk_size(void)
|
||||
{
|
||||
return sizeof(ventoy_override_chunk) * g_valid_initrd_count;
|
||||
int count = g_valid_initrd_count;
|
||||
|
||||
if (g_conf_replace_offset > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
return sizeof(ventoy_override_chunk) * count;
|
||||
}
|
||||
|
||||
static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *override)
|
||||
@@ -697,6 +763,8 @@ static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *ove
|
||||
grub_uint32_t newlen;
|
||||
grub_uint64_t sector;
|
||||
ventoy_override_chunk *cur;
|
||||
ventoy_iso9660_override *dirent;
|
||||
ventoy_udf_override *udf;
|
||||
|
||||
sector = (isosize + 2047) / 2048;
|
||||
|
||||
@@ -712,12 +780,12 @@ static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *ove
|
||||
mod = newlen % 4;
|
||||
if (mod > 0)
|
||||
{
|
||||
newlen += 4 - mod;
|
||||
newlen += 4 - mod; /* cpio must align with 4 */
|
||||
}
|
||||
|
||||
if (node->iso_type == 0)
|
||||
{
|
||||
ventoy_iso9660_override *dirent = (ventoy_iso9660_override *)node->override_data;
|
||||
dirent = (ventoy_iso9660_override *)node->override_data;
|
||||
|
||||
node->override_length = sizeof(ventoy_iso9660_override);
|
||||
dirent->first_sector = (grub_uint32_t)sector;
|
||||
@@ -729,7 +797,7 @@ static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *ove
|
||||
}
|
||||
else
|
||||
{
|
||||
ventoy_udf_override *udf = (ventoy_udf_override *)node->override_data;
|
||||
udf = (ventoy_udf_override *)node->override_data;
|
||||
|
||||
node->override_length = sizeof(ventoy_udf_override);
|
||||
udf->length = newlen;
|
||||
@@ -744,6 +812,23 @@ static void ventoy_linux_fill_override_data( grub_uint64_t isosize, void *ove
|
||||
cur++;
|
||||
}
|
||||
|
||||
if (g_conf_replace_offset > 0)
|
||||
{
|
||||
cur->img_offset = g_conf_replace_offset;
|
||||
cur->override_size = sizeof(ventoy_iso9660_override);
|
||||
|
||||
newlen = (grub_uint32_t)(g_conf_replace_new_len);
|
||||
|
||||
dirent = (ventoy_iso9660_override *)cur->override_data;
|
||||
dirent->first_sector = (grub_uint32_t)sector;
|
||||
dirent->size = newlen;
|
||||
dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector);
|
||||
dirent->size_be = grub_swap_bytes32(dirent->size);
|
||||
|
||||
sector += (dirent->size + 2047) / 2048;
|
||||
cur++;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1241,7 +1326,9 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
||||
grub_uint64_t isosize = 0;
|
||||
grub_uint32_t boot_catlog = 0;
|
||||
grub_uint32_t img_chunk_size = 0;
|
||||
grub_uint32_t override_count = 0;
|
||||
grub_uint32_t override_size = 0;
|
||||
grub_uint32_t virt_chunk_count = 0;
|
||||
grub_uint32_t virt_chunk_size = 0;
|
||||
grub_file_t file;
|
||||
grub_disk_t disk;
|
||||
@@ -1294,6 +1381,9 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
||||
}
|
||||
|
||||
img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
|
||||
|
||||
override_count = ventoy_linux_get_override_chunk_count();
|
||||
virt_chunk_count = ventoy_linux_get_virt_chunk_count();
|
||||
|
||||
if (ventoy_compatible)
|
||||
{
|
||||
@@ -1360,20 +1450,21 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_valid_initrd_count == 0)
|
||||
/* part 4: override chunk */
|
||||
if (override_count > 0)
|
||||
{
|
||||
return 0;
|
||||
chain->override_chunk_offset = chain->img_chunk_offset + img_chunk_size;
|
||||
chain->override_chunk_num = override_count;
|
||||
ventoy_linux_fill_override_data(isosize, (char *)chain + chain->override_chunk_offset);
|
||||
}
|
||||
|
||||
/* part 4: override chunk */
|
||||
chain->override_chunk_offset = chain->img_chunk_offset + img_chunk_size;
|
||||
chain->override_chunk_num = g_valid_initrd_count;
|
||||
ventoy_linux_fill_override_data(isosize, (char *)chain + chain->override_chunk_offset);
|
||||
|
||||
/* part 5: virt chunk */
|
||||
chain->virt_chunk_offset = chain->override_chunk_offset + override_size;
|
||||
chain->virt_chunk_num = g_valid_initrd_count;
|
||||
ventoy_linux_fill_virt_data(isosize, chain);
|
||||
if (virt_chunk_count > 0)
|
||||
{
|
||||
chain->virt_chunk_offset = chain->override_chunk_offset + override_size;
|
||||
chain->virt_chunk_num = virt_chunk_count;
|
||||
ventoy_linux_fill_virt_data(isosize, chain);
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
@@ -46,6 +46,8 @@ static menu_alias *g_menu_alias_head = NULL;
|
||||
static menu_class *g_menu_class_head = NULL;
|
||||
static injection_config *g_injection_head = NULL;
|
||||
static auto_memdisk *g_auto_memdisk_head = NULL;
|
||||
static image_list *g_image_list_head = NULL;
|
||||
static conf_replace *g_conf_replace_head = NULL;
|
||||
|
||||
static int ventoy_plugin_control_check(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
@@ -1019,6 +1021,146 @@ static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
const char *isof = NULL;
|
||||
const char *orgf = NULL;
|
||||
const char *newf = NULL;
|
||||
VTOY_JSON *pNode = NULL;
|
||||
conf_replace *tail = NULL;
|
||||
conf_replace *node = NULL;
|
||||
conf_replace *next = NULL;
|
||||
|
||||
(void)isodisk;
|
||||
|
||||
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||
{
|
||||
debug("Not array %d\n", json->enDataType);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_conf_replace_head)
|
||||
{
|
||||
for (node = g_conf_replace_head; node; node = next)
|
||||
{
|
||||
next = node->next;
|
||||
grub_free(node);
|
||||
}
|
||||
|
||||
g_conf_replace_head = NULL;
|
||||
}
|
||||
|
||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||
{
|
||||
isof = vtoy_json_get_string_ex(pNode->pstChild, "iso");
|
||||
orgf = vtoy_json_get_string_ex(pNode->pstChild, "org");
|
||||
newf = vtoy_json_get_string_ex(pNode->pstChild, "new");
|
||||
if (isof && orgf && newf && isof[0] == '/' && orgf[0] == '/' && newf[0] == '/')
|
||||
{
|
||||
node = grub_zalloc(sizeof(conf_replace));
|
||||
if (node)
|
||||
{
|
||||
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", isof);
|
||||
grub_snprintf(node->orgconf, sizeof(node->orgconf), "%s", orgf);
|
||||
grub_snprintf(node->newconf, sizeof(node->newconf), "%s", newf);
|
||||
|
||||
if (g_conf_replace_head)
|
||||
{
|
||||
tail->next = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_conf_replace_head = node;
|
||||
}
|
||||
tail = node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
const char *isof = NULL;
|
||||
const char *orgf = NULL;
|
||||
const char *newf = NULL;
|
||||
VTOY_JSON *pNode = NULL;
|
||||
grub_file_t file = NULL;
|
||||
char cmd[256];
|
||||
|
||||
(void)isodisk;
|
||||
|
||||
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||
{
|
||||
grub_printf("Not array %d\n", json->enDataType);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||
{
|
||||
isof = vtoy_json_get_string_ex(pNode->pstChild, "iso");
|
||||
orgf = vtoy_json_get_string_ex(pNode->pstChild, "org");
|
||||
newf = vtoy_json_get_string_ex(pNode->pstChild, "new");
|
||||
if (isof && orgf && newf && isof[0] == '/' && orgf[0] == '/' && newf[0] == '/')
|
||||
{
|
||||
if (ventoy_check_file_exist("%s%s", isodisk, isof))
|
||||
{
|
||||
grub_printf("iso:<%s> [OK]\n", isof);
|
||||
|
||||
grub_snprintf(cmd, sizeof(cmd), "loopback vtisocheck %s%s", isodisk, isof);
|
||||
grub_script_execute_sourcecode(cmd);
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(vtisocheck)/%s", orgf);
|
||||
if (file)
|
||||
{
|
||||
if (grub_strcmp(file->fs->name, "iso9660") == 0)
|
||||
{
|
||||
grub_printf("org:<%s> [OK]\n", orgf);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("org:<%s> [Exist But NOT ISO9660]\n", orgf);
|
||||
}
|
||||
grub_file_close(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("org:<%s> [NOT Exist]\n", orgf);
|
||||
}
|
||||
|
||||
grub_script_execute_sourcecode("loopback -d vtisocheck");
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("iso:<%s> [NOT Exist]\n", isof);
|
||||
grub_printf("org:<%s>\n", orgf);
|
||||
}
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", isodisk, newf);
|
||||
if (file)
|
||||
{
|
||||
if (file->size > vtoy_max_replace_file_size)
|
||||
{
|
||||
grub_printf("new:<%s> [Too Big %lu] \n", newf, (ulong)file->size);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("new:<%s> [OK]\n", newf);
|
||||
}
|
||||
grub_file_close(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("new:<%s> [NOT Exist]\n", newf);
|
||||
}
|
||||
grub_printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_auto_memdisk_entry(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
VTOY_JSON *pNode = NULL;
|
||||
@@ -1096,6 +1238,89 @@ static int ventoy_plugin_auto_memdisk_check(VTOY_JSON *json, const char *isodisk
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_image_list_entry(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
VTOY_JSON *pNode = NULL;
|
||||
image_list *node = NULL;
|
||||
image_list *next = NULL;
|
||||
image_list *tail = NULL;
|
||||
|
||||
(void)isodisk;
|
||||
|
||||
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||
{
|
||||
debug("Not array %d\n", json->enDataType);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_image_list_head)
|
||||
{
|
||||
for (node = g_image_list_head; node; node = next)
|
||||
{
|
||||
next = node->next;
|
||||
grub_free(node);
|
||||
}
|
||||
|
||||
g_image_list_head = NULL;
|
||||
}
|
||||
|
||||
g_plugin_image_list = 1;
|
||||
|
||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||
{
|
||||
if (pNode->enDataType == JSON_TYPE_STRING)
|
||||
{
|
||||
node = grub_zalloc(sizeof(image_list));
|
||||
if (node)
|
||||
{
|
||||
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", pNode->unData.pcStrVal);
|
||||
|
||||
if (g_image_list_head)
|
||||
{
|
||||
tail->next = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_image_list_head = node;
|
||||
}
|
||||
tail = node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_image_list_check(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
VTOY_JSON *pNode = NULL;
|
||||
|
||||
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||
{
|
||||
grub_printf("Not array %d\n", json->enDataType);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||
{
|
||||
if (pNode->enDataType == JSON_TYPE_STRING)
|
||||
{
|
||||
grub_printf("<%s> ", pNode->unData.pcStrVal);
|
||||
|
||||
if (ventoy_check_file_exist("%s%s", isodisk, pNode->unData.pcStrVal))
|
||||
{
|
||||
grub_printf(" [OK]\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf(" [NOT EXIST]\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static plugin_entry g_plugin_entries[] =
|
||||
{
|
||||
{ "control", ventoy_plugin_control_entry, ventoy_plugin_control_check },
|
||||
@@ -1106,11 +1331,14 @@ static plugin_entry g_plugin_entries[] =
|
||||
{ "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check },
|
||||
{ "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check },
|
||||
{ "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check },
|
||||
{ "image_list", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check },
|
||||
{ "conf_replace", ventoy_plugin_conf_replace_entry, ventoy_plugin_conf_replace_check },
|
||||
};
|
||||
|
||||
static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
int i;
|
||||
char key[128];
|
||||
VTOY_JSON *cur = json;
|
||||
|
||||
grub_snprintf(g_iso_disk_name, sizeof(g_iso_disk_name), "%s", isodisk);
|
||||
@@ -1119,7 +1347,8 @@ static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
for (i = 0; i < (int)ARRAY_SIZE(g_plugin_entries); i++)
|
||||
{
|
||||
if (grub_strcmp(g_plugin_entries[i].key, cur->pcName) == 0)
|
||||
grub_snprintf(key, sizeof(key), "%s_%s", g_plugin_entries[i].key, VTOY_DUAL_MODE_SUFFIX);
|
||||
if (grub_strcmp(g_plugin_entries[i].key, cur->pcName) == 0 || grub_strcmp(key, cur->pcName) == 0)
|
||||
{
|
||||
debug("Plugin entry for %s\n", g_plugin_entries[i].key);
|
||||
g_plugin_entries[i].entryfunc(cur, isodisk);
|
||||
@@ -1150,7 +1379,7 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
|
||||
}
|
||||
|
||||
debug("json configuration file size %d\n", (int)file->size);
|
||||
|
||||
|
||||
buf = grub_malloc(file->size + 1);
|
||||
if (!buf)
|
||||
{
|
||||
@@ -1173,6 +1402,9 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
|
||||
ret = vtoy_json_parse(json, buf);
|
||||
if (ret)
|
||||
{
|
||||
grub_env_set("VTOY_PLUGIN_SYNTAX_ERROR", "1");
|
||||
grub_env_export("VTOY_PLUGIN_SYNTAX_ERROR");
|
||||
|
||||
debug("Failed to parse json string %d\n", ret);
|
||||
grub_free(buf);
|
||||
return 1;
|
||||
@@ -1472,11 +1704,69 @@ int ventoy_plugin_check_memdisk(const char *isopath)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ventoy_plugin_get_image_list_index(int type, const char *name)
|
||||
{
|
||||
int len;
|
||||
int index = 1;
|
||||
image_list *node = NULL;
|
||||
|
||||
if (!g_image_list_head)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
len = (int)grub_strlen(name);
|
||||
|
||||
for (node = g_image_list_head; node; node = node->next, index++)
|
||||
{
|
||||
if (vtoy_class_directory == type)
|
||||
{
|
||||
if (len < node->pathlen && grub_strncmp(name, node->isopath, len) == 0)
|
||||
{
|
||||
return index;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (len == node->pathlen && grub_strncmp(name, node->isopath, len) == 0)
|
||||
{
|
||||
return index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
conf_replace * ventoy_plugin_find_conf_replace(const char *iso)
|
||||
{
|
||||
int len;
|
||||
conf_replace *node;
|
||||
|
||||
if (!g_conf_replace_head)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = (int)grub_strlen(iso);
|
||||
|
||||
for (node = g_conf_replace_head; node; node = node->next)
|
||||
{
|
||||
if (node->pathlen == len && grub_strncmp(iso, node->isopath, len) == 0)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i = 0;
|
||||
int ret = 0;
|
||||
char *buf = NULL;
|
||||
char key[128];
|
||||
grub_file_t file;
|
||||
VTOY_JSON *node = NULL;
|
||||
VTOY_JSON *json = NULL;
|
||||
@@ -1519,9 +1809,10 @@ grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, ch
|
||||
goto end;
|
||||
}
|
||||
|
||||
grub_snprintf(key, sizeof(key), "%s_%s", args[1], VTOY_DUAL_MODE_SUFFIX);
|
||||
for (node = json->pstChild; node; node = node->pstNext)
|
||||
{
|
||||
if (grub_strcmp(node->pcName, args[1]) == 0)
|
||||
if (grub_strcmp(node->pcName, args[1]) == 0 || grub_strcmp(node->pcName, key) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@@ -33,12 +33,11 @@ if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
||||
fi
|
||||
elif [ -e "$CD_DETECT" ]; then
|
||||
echo "$CD_DETECT exist, now add hook in it..." >> $VTLOG
|
||||
|
||||
$SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/disk_mount_hook.sh" -i "$CD_DETECT"
|
||||
TITLE_LINE=$($GREP -m1 '^hw-detect.*detect_progress_title' "$CD_DETECT")
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "add $TITLE_LINE for hook" >> $VTLOG
|
||||
$SED "1 a$TITLE_LINE" -i "$CD_DETECT"
|
||||
|
||||
if [ -e /bin/list-devices ]; then
|
||||
mv /bin/list-devices /bin/list-devices-bk
|
||||
cp -a /ventoy/hook/debian/list-devices /bin/list-devices
|
||||
fi
|
||||
elif [ -e /init ] && $GREP -q '/start-udev$' /init; then
|
||||
echo "Here use notify ..." >> $VTLOG
|
||||
|
9
IMG/cpio/ventoy/hook/debian/list-devices
Normal file
9
IMG/cpio/ventoy/hook/debian/list-devices
Normal file
@@ -0,0 +1,9 @@
|
||||
#! /bin/sh
|
||||
|
||||
if [ "$1" = "usb-partition" -a -z "$2" ]; then
|
||||
if [ -f /ventoy/list-devices-usb-part ]; then
|
||||
cat /ventoy/list-devices-usb-part
|
||||
fi
|
||||
fi
|
||||
|
||||
/bin/list-devices-bk $*
|
@@ -133,15 +133,7 @@ else
|
||||
vtlog "boot=, or casper, don't mount"
|
||||
else
|
||||
vtlog "No boot param, need to mount"
|
||||
$BUSYBOX_PATH/mkdir /cdrom
|
||||
|
||||
if [ -b $VTOY_DM_PATH ]; then
|
||||
vtlog "mount $VTOY_DM_PATH ..."
|
||||
$BUSYBOX_PATH/mount -t iso9660 $VTOY_DM_PATH /cdrom
|
||||
else
|
||||
vtlog "mount /dev/$1 ..."
|
||||
$BUSYBOX_PATH/mount -t iso9660 /dev/$1 /cdrom
|
||||
fi
|
||||
echo /dev/$1 > /ventoy/list-devices-usb-part
|
||||
fi
|
||||
fi
|
||||
|
||||
|
Binary file not shown.
@@ -74,7 +74,25 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
||||
echo -e "\npress ENTER to exit ..."
|
||||
read vtInputKey
|
||||
unset pager
|
||||
}
|
||||
}
|
||||
|
||||
menuentry 'Check image list plugin configuration' --class=debug_imagelist {
|
||||
set pager=1
|
||||
vt_check_plugin_json $vt_plugin_path image_list $vtoy_iso_part
|
||||
|
||||
echo -e "\npress ENTER to exit ..."
|
||||
read vtInputKey
|
||||
unset pager
|
||||
}
|
||||
|
||||
menuentry 'Check boot conf replace plugin configuration' --class=debug_bootconf_replace {
|
||||
set pager=1
|
||||
vt_check_plugin_json $vt_plugin_path conf_replace $vtoy_iso_part
|
||||
|
||||
echo -e "\npress ENTER to exit ..."
|
||||
read vtInputKey
|
||||
unset pager
|
||||
}
|
||||
|
||||
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||
echo 'Return ...'
|
||||
@@ -107,7 +125,17 @@ submenu "Resolution Configuration" --class=debug_resolution {
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
submenu "Screen Display Mode" --class=debug_screen_mode {
|
||||
menuentry 'Force Text Mode' --class=debug_text_mode {
|
||||
terminal_output console
|
||||
}
|
||||
menuentry 'Force Graphics Mode' --class=debug_gui_mode {
|
||||
terminal_output gfxterm
|
||||
}
|
||||
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||
echo 'Return ...'
|
||||
}
|
||||
}
|
||||
|
||||
if [ "$grub_platform" != "pc" ]; then
|
||||
submenu 'Ventoy UEFI Utilities' --class=debug_util {
|
||||
|
@@ -265,6 +265,12 @@ function distro_specify_initrd_file_phase2 {
|
||||
fi
|
||||
elif [ -f (loop)/blackarch/boot/x86_64/archiso.img ]; then
|
||||
vt_linux_specify_initrd_file /blackarch/boot/x86_64/archiso.img
|
||||
|
||||
elif [ -f (loop)/install.amd/initrd.gz ]; then
|
||||
vt_linux_specify_initrd_file /live/initrd2.img
|
||||
vt_linux_specify_initrd_file /install.amd/initrd.gz
|
||||
vt_linux_specify_initrd_file /install.amd/gtk/initrd.gz
|
||||
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -619,6 +625,10 @@ function uefi_iso_menu_func {
|
||||
|
||||
vt_img_sector ${1}${chosen_path}
|
||||
|
||||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||
vt_select_conf_replace ${1} ${chosen_path}
|
||||
fi
|
||||
|
||||
if [ "$vtoy_os" = "Windows" ]; then
|
||||
vt_check_compatible_pe (loop)
|
||||
uefi_windows_menu_func $1 ${chosen_path}
|
||||
@@ -782,7 +792,7 @@ function legacy_iso_menu_func {
|
||||
loopback loop ${1}${chosen_path}
|
||||
|
||||
get_os_type (loop)
|
||||
|
||||
|
||||
if [ -n "$vtcompat" ]; then
|
||||
set ventoy_compatible=YES
|
||||
unset vtcompat
|
||||
@@ -794,6 +804,10 @@ function legacy_iso_menu_func {
|
||||
|
||||
vt_img_sector ${1}${chosen_path}
|
||||
|
||||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||
vt_select_conf_replace ${1} ${chosen_path}
|
||||
fi
|
||||
|
||||
if [ "$vtoy_os" = "Windows" ]; then
|
||||
vt_check_compatible_pe (loop)
|
||||
legacy_windows_menu_func $1 ${chosen_path}
|
||||
@@ -1044,12 +1058,12 @@ function vtoyboot_common_func {
|
||||
ventoy_debug_pause
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
ventoy_acpi_param ${vtoy_chain_mem_addr} 512
|
||||
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} sector512 mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
vt_acpi_param ${vtoy_chain_mem_addr} 512
|
||||
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} bios80 sector512 mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||
boot
|
||||
else
|
||||
ventoy_acpi_param ${vtoy_chain_mem_addr} 512
|
||||
ventoy_cli_console
|
||||
chainloader ${vtoy_path}/ventoy_x64.efi sector512 env_param=${ventoy_env_param} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||
boot
|
||||
@@ -1344,7 +1358,10 @@ function img_unsupport_menuentry {
|
||||
#############################################################
|
||||
#############################################################
|
||||
|
||||
set VENTOY_VERSION="1.0.23"
|
||||
set VENTOY_VERSION="1.0.27"
|
||||
|
||||
#ACPI not compatible with Window7/8, so disable by default
|
||||
set VTOY_PARAM_NO_ACPI=1
|
||||
|
||||
# Default menu display mode, you can change it as you want.
|
||||
# 0: List mode
|
||||
@@ -1381,7 +1398,7 @@ if [ "$vtoy_dev" = "tftp" ]; then
|
||||
loadfont ascii
|
||||
|
||||
if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
|
||||
set vt_plugin_path=$vtoy_iso_part
|
||||
set vt_plugin_path=$vtoy_iso_part
|
||||
else
|
||||
set vt_plugin_path=$prefix
|
||||
vt_load_plugin $vt_plugin_path
|
||||
@@ -1468,6 +1485,15 @@ else
|
||||
terminal_output gfxterm
|
||||
fi
|
||||
|
||||
|
||||
if [ -n "$VTOY_PLUGIN_SYNTAX_ERROR" ]; then
|
||||
clear
|
||||
echo -e "\n Syntax error detected in ventoy.json, please check! \n"
|
||||
echo -e " ventoy.json 文件中有语法错误,所有配置都不会生效,请检查!\n"
|
||||
echo -e "\n press ENTER to continue (请按 回车 键继续) ..."
|
||||
read vtInputKey
|
||||
fi
|
||||
|
||||
#export necessary variable
|
||||
export theme
|
||||
export gfxmode
|
||||
|
Binary file not shown.
@@ -21,7 +21,12 @@ if [ "$grub_platform" = "pc" ]; then
|
||||
if search -n -s -f /Boot/BCD; then
|
||||
for bt in bootmgr BOOTMGR Bootmgr BootMGR; do
|
||||
if [ -f /$bt ]; then
|
||||
ntldr /$bt
|
||||
if regexp '^hd0' $root; then
|
||||
ntldr /$bt
|
||||
else
|
||||
drivemap -s hd0 $root
|
||||
ntldr /$bt
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
@@ -63,7 +63,11 @@ if ! [ -b "$DISK" ]; then
|
||||
fi
|
||||
|
||||
if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
|
||||
vterr "$DISK is a partition, please use the whole disk"
|
||||
vterr "$DISK is a partition, please use the whole disk."
|
||||
echo "For example:"
|
||||
vterr " sudo sh Ventoy2Disk.sh -i /dev/sdX1 <=== This is wrong"
|
||||
vtinfo " sudo sh Ventoy2Disk.sh -i /dev/sdX <=== This is right"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -26,6 +26,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
int g_debug = 0;
|
||||
int g_hddmode = 0;
|
||||
int g_bios_disk80 = 0;
|
||||
char *g_cmdline_copy;
|
||||
void *g_initrd_addr;
|
||||
size_t g_initrd_len;
|
||||
@@ -697,6 +698,11 @@ int ventoy_boot_vdisk(void *data)
|
||||
{
|
||||
g_hddmode = 1;
|
||||
}
|
||||
|
||||
if (strstr(g_cmdline_copy, "bios80"))
|
||||
{
|
||||
g_bios_disk80 = 1;
|
||||
}
|
||||
|
||||
g_chain = (ventoy_chain_head *)g_initrd_addr;
|
||||
g_chunk = (ventoy_img_chunk *)((char *)g_chain + g_chain->img_chunk_offset);
|
||||
|
@@ -1425,7 +1425,7 @@ unsigned int ventoy_int13_hook (ventoy_chain_head *chain)
|
||||
|
||||
if (g_hddmode)
|
||||
{
|
||||
natural_drive = num_drives | 0x80;
|
||||
natural_drive = g_bios_disk80 ? 0x80 : (num_drives | 0x80);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@@ -187,6 +187,7 @@ typedef struct ventoy_sector_flag
|
||||
|
||||
extern int g_debug;
|
||||
extern int g_hddmode;
|
||||
extern int g_bios_disk80;
|
||||
extern char *g_cmdline_copy;
|
||||
extern void *g_initrd_addr;
|
||||
extern size_t g_initrd_len;
|
||||
|
Binary file not shown.
Reference in New Issue
Block a user