From a1c6fe2d2428cb8a1b4a9e11a9a5075a4bccecd1 Mon Sep 17 00:00:00 2001 From: longpanda Date: Mon, 14 Feb 2022 23:31:54 +0800 Subject: [PATCH] 1.0.67 release support to browse and boot files in local disk. --- .github/ISSUE_TEMPLATE/issue_template.yml | 2 +- .../grub-2.04/grub-core/Makefile.core.def | 1 + GRUB2/MOD_SRC/grub-2.04/grub-core/kern/file.c | 27 +- .../grub-core/ventoy/ventoy_browser.c | 500 ++++++++++++++++++ .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 67 ++- .../grub-2.04/grub-core/ventoy/ventoy_def.h | 30 ++ GRUB2/MOD_SRC/grub-2.04/include/grub/file.h | 1 + INSTALL/grub/debug.cfg | 1 + INSTALL/grub/grub.cfg | 18 +- INSTALL/grub/help/de_DE.txt | 2 +- INSTALL/grub/help/en_US.txt | 2 +- INSTALL/grub/help/fr_FR.txt | 2 +- INSTALL/grub/help/hr_HR.txt | 2 +- INSTALL/grub/help/id_ID.txt | 2 +- INSTALL/grub/help/ja_JP.txt | 2 +- INSTALL/grub/help/pt_PT.txt | 2 +- INSTALL/grub/help/sr_CY.txt | 2 +- INSTALL/grub/help/sr_SR.txt | 2 +- INSTALL/grub/help/tr_TR.txt | 2 +- INSTALL/grub/help/zh_CN.txt | 2 +- INSTALL/grub/power.cfg | 26 +- INSTALL/ventoy/vtoyjump32.exe | Bin 125952 -> 126464 bytes INSTALL/ventoy/vtoyjump64.exe | Bin 151040 -> 151552 bytes Plugson/src/Web/ventoy_http.c | 2 - .../VentoyPlugson/Release/VentoyPlugson.exe | Bin 320000 -> 320000 bytes vtoyjump/vtoyjump/vtoyjump.c | 58 +- vtoyjump/vtoyjump/vtoyjump.h | 4 +- 27 files changed, 709 insertions(+), 50 deletions(-) create mode 100644 GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c diff --git a/.github/ISSUE_TEMPLATE/issue_template.yml b/.github/ISSUE_TEMPLATE/issue_template.yml index 396c69d7..91029fcd 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.yml +++ b/.github/ISSUE_TEMPLATE/issue_template.yml @@ -21,7 +21,7 @@ body: attributes: label: Ventoy Version description: What version of ventoy are you running? - placeholder: 1.0.66 + placeholder: 1.0.67 validations: required: true - type: dropdown diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/Makefile.core.def b/GRUB2/MOD_SRC/grub-2.04/grub-core/Makefile.core.def index f7351891..987400db 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/Makefile.core.def +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/Makefile.core.def @@ -1610,6 +1610,7 @@ module = { common = ventoy/ventoy_vhd.c; common = ventoy/ventoy_plugin.c; common = ventoy/ventoy_json.c; + common = ventoy/ventoy_browser.c; common = ventoy/lzx.c; common = ventoy/xpress.c; common = ventoy/huffman.c; diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/file.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/file.c index 61e02614..22a74414 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/file.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/file.c @@ -114,6 +114,7 @@ typedef struct grub_vlnk struct grub_vlnk *next; }grub_vlnk; +static grub_vlnk g_vtoy_vlnk; static grub_vlnk *g_vlnk_list; int grub_file_is_vlnk_suffix(const char *name, int len) @@ -146,6 +147,23 @@ int grub_file_is_vlnk_suffix(const char *name, int len) return 0; } +int grub_file_vtoy_vlnk(const char *src, const char *dst) +{ + if (src) + { + g_vtoy_vlnk.srclen = (int)grub_strlen(src); + grub_strncpy(g_vtoy_vlnk.src, src, sizeof(g_vtoy_vlnk.src) - 1); + grub_strncpy(g_vtoy_vlnk.dst, dst, sizeof(g_vtoy_vlnk.dst) - 1); + } + else + { + g_vtoy_vlnk.srclen = 0; + g_vtoy_vlnk.src[0] = 0; + g_vtoy_vlnk.dst[0] = 0; + } + return 0; +} + int grub_file_add_vlnk(const char *src, const char *dst) { grub_vlnk *node = NULL; @@ -174,10 +192,17 @@ const char *grub_file_get_vlnk(const char *name, int *vlnk) grub_vlnk *node = g_vlnk_list; len = grub_strlen(name); + if (!grub_file_is_vlnk_suffix(name, len)) { return name; } + + if (len == g_vtoy_vlnk.srclen && grub_strcmp(name, g_vtoy_vlnk.src) == 0) + { + *vlnk = 1; + return g_vtoy_vlnk.dst; + } while (node) { @@ -207,7 +232,7 @@ grub_file_open (const char *name, enum grub_file_type type) return grub_memfile_open(name); } - if (g_vlnk_list && (type & GRUB_FILE_TYPE_NO_VLNK) == 0) + if ((g_vlnk_list || g_vtoy_vlnk.srclen) && (type & GRUB_FILE_TYPE_NO_VLNK) == 0) name = grub_file_get_vlnk(name, &vlnk); device_name = grub_file_get_device_name (name); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c new file mode 100644 index 00000000..831795bc --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c @@ -0,0 +1,500 @@ +/****************************************************************************** + * ventoy_browser.c + * + * Copyright (c) 2022, longpanda + * + * 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 . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ventoy_def.h" + +GRUB_MOD_LICENSE ("GPLv3+"); + +#define BROWSER_MENU_BUF 65536 + +static grub_fs_t g_menu_fs = NULL; +static char *g_menu_device = NULL; +static char g_menu_path_buf[1024]; +static int g_menu_path_len = 0; +static browser_node *g_browser_list = NULL; + +static int ventoy_browser_strcmp(char *str1, char *str2) +{ + char *s1, *s2; + int c1 = 0; + int c2 = 0; + + for (s1 = str1, s2 = str2; *s1 && *s2; s1++, s2++) + { + c1 = *s1; + c2 = *s2; + + if (0 == g_sort_case_sensitive) + { + if (grub_islower(c1)) + { + c1 = c1 - 'a' + 'A'; + } + + if (grub_islower(c2)) + { + c2 = c2 - 'a' + 'A'; + } + } + + if (c1 != c2) + { + break; + } + } + + return (c1 - c2); +} + +static int ventoy_browser_mbuf_alloc(browser_mbuf *mbuf) +{ + grub_memset(mbuf, 0, sizeof(browser_mbuf)); + mbuf->buf = grub_malloc(BROWSER_MENU_BUF); + if (!mbuf->buf) + { + return 0; + } + + mbuf->pos = 0; + mbuf->max = BROWSER_MENU_BUF; + return 1; +} + +static void ventoy_browser_mbuf_free(browser_mbuf *mbuf) +{ + if (mbuf) + grub_check_free(mbuf->buf) +} + +static int ventoy_browser_mbuf_extend(browser_mbuf *mbuf) +{ + if (mbuf->max - mbuf->pos <= VTOY_SIZE_1KB) + { + mbuf->max += BROWSER_MENU_BUF; + mbuf->buf = grub_realloc(mbuf->buf, mbuf->max); + } + + return 0; +} + +static browser_node * ventoy_browser_find_top_node(int dir) +{ + browser_node *node = NULL; + browser_node *sel = NULL; + + for (node = g_browser_list; node; node = node->next) + { + if (node->dir == dir) + { + if (sel) + { + if (ventoy_browser_strcmp(sel->filename, node->filename) > 0) + { + sel = node; + } + } + else + { + sel = node; + } + } + } + + return sel; +} + +static int ventoy_browser_check_filename(const char *filename, int len, int *type) +{ + if (len < 4) + { + return 0; + } + + if (FILE_FLT(ISO) && 0 == grub_strcasecmp(filename + len - 4, ".iso")) + { + *type = img_type_iso; + } + else if (FILE_FLT(WIM) && g_wimboot_enable && (0 == grub_strcasecmp(filename + len - 4, ".wim"))) + { + *type = img_type_wim; + } + else if (FILE_FLT(VHD) && g_vhdboot_enable && (0 == grub_strcasecmp(filename + len - 4, ".vhd") || + (len >= 5 && 0 == grub_strcasecmp(filename + len - 5, ".vhdx")))) + { + *type = img_type_vhd; + } + #ifdef GRUB_MACHINE_EFI + else if (FILE_FLT(EFI) && 0 == grub_strcasecmp(filename + len - 4, ".efi")) + { + *type = img_type_efi; + } + #endif + else if (FILE_FLT(IMG) && 0 == grub_strcasecmp(filename + len - 4, ".img")) + { + if (len == 18 && grub_strncmp(filename, "ventoy_", 7) == 0) + { + if (grub_strncmp(filename + 7, "wimboot", 7) == 0 || + grub_strncmp(filename + 7, "vhdboot", 7) == 0) + { + return 0; + } + } + *type = img_type_img; + } + else if (FILE_FLT(VTOY) && len >= 5 && 0 == grub_strcasecmp(filename + len - 5, ".vtoy")) + { + *type = img_type_vtoy; + } + else + { + return 0; + } + + if (g_filt_dot_underscore_file && filename[0] == '.' && filename[1] == '_') + { + return 0; + } + + return 1; +} + + +static int ventoy_browser_iterate_partition(struct grub_disk *disk, const grub_partition_t partition, void *data) +{ + char partname[64]; + char title[256]; + grub_device_t dev; + grub_fs_t fs; + char *Label = NULL; + browser_mbuf *mbuf = (browser_mbuf *)data; + + (void)data; + + grub_snprintf(partname, sizeof(partname) - 1, "%s,%d", disk->name, partition->number + 1); + + dev = grub_device_open(partname); + if (!dev) + { + return 0; + } + + fs = grub_fs_probe(dev); + if (!fs) + { + grub_device_close(dev); + return 0; + } + + fs->fs_label(dev, &Label); + + grub_snprintf(title, sizeof(title), "%-10s (%s,%s%d) [%s] %s %s", + "DISK", disk->name, partition->msdostype == 0xee ? "gpt" : "msdos", + partition->number + 1, (Label ? Label : ""), fs->name, + grub_get_human_size(partition->len << disk->log_sector_size, GRUB_HUMAN_SIZE_SHORT)); + + if (ventoy_get_fs_type(fs->name) >= ventoy_fs_max) + { + browser_ssprintf(mbuf, "menuentry \"%s\" --class=vtoydisk {\n" + " echo \"unsupported file system type!\" \n" + " ventoy_pause\n" + "}\n", + title); + } + else + { + browser_ssprintf(mbuf, "menuentry \"%s\" --class=vtoydisk {\n" + " vt_browser_dir %s,%d 0x%lx /\n" + "}\n", + title, disk->name, partition->number + 1, (ulong)fs); + } + + ventoy_browser_mbuf_extend(mbuf); + + return 0; +} + + +static int ventoy_browser_iterate_disk(const char *name, void *data) +{ + grub_disk_t disk; + grub_uint32_t sig; + grub_uint32_t selfsig; + + grub_memcpy(&selfsig, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4); + + if (name[0] != 'h') + { + return 0; + } + + disk = grub_disk_open(name); + if (disk) + { + grub_disk_read(disk, 0, 0x1b8, 4, &sig); + + /* skip ventoy device self */ + if (sig != selfsig) + { + grub_partition_iterate(disk, ventoy_browser_iterate_partition, data); + } + + grub_disk_close(disk); + } + + return 0; +} + +static int ventoy_browser_iterate_dir(const char *filename, const struct grub_dirhook_info *info, void *data) +{ + int type; + int len; + browser_node *node; + + (void)data; + + len = grub_strlen(filename); + + if (info->dir) + { + if ((len == 1 && filename[0] == '.') || + (len == 2 && filename[0] == '.' && filename[1] == '.')) + { + return 0; + } + + if (!ventoy_img_name_valid(filename, len)) + { + return 0; + } + + if (filename[0] == '$') + { + if (0 == grub_strncmp(filename, "$RECYCLE.BIN", 12) || + 0 == grub_strncasecmp(filename, "$Extend", 7)) + { + return 0; + } + } + + node = grub_zalloc(sizeof(browser_node)); + if (!node) + { + return 0; + } + + node->dir = 1; + grub_strncpy(node->filename, filename, sizeof(node->filename)); + grub_snprintf(node->menuentry, sizeof(node->menuentry), + "menuentry \"%-10s [%s]\" --class=vtoydir {\n" + " vt_browser_dir %s 0x%lx \"%s/%s\"\n" + "}\n", + "DIR", filename, g_menu_device, (ulong)g_menu_fs, g_menu_path_buf, filename); + } + else + { + grub_uint64_t fsize; + grub_file_t file = NULL; + + if (ventoy_browser_check_filename(filename, len, &type) == 0) + { + return 0; + } + + fsize = info->size; + if (fsize == 0) + { + file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(%s)%s/%s", g_menu_device, g_menu_path_buf, filename); + if (!file) + { + return 0; + } + + fsize = file->size; + grub_file_close(file); + } + + if (fsize < VTOY_FILT_MIN_FILE_SIZE) + { + return 0; + } + + node = grub_zalloc(sizeof(browser_node)); + if (!node) + { + return 0; + } + + node->dir = 0; + grub_strncpy(node->filename, filename, sizeof(node->filename)); + grub_snprintf(node->menuentry, sizeof(node->menuentry), + "menuentry \"%-10s %s\" --class=%s {\n" + " vt_set_fake_vlnk \"(%s)%s/%s\" %s %llu\n" + " %s_common_menuentry\n" + " vt_reset_fake_vlnk\n" + "}\n", + grub_get_human_size(fsize, GRUB_HUMAN_SIZE_SHORT), filename, g_menu_class[type], + g_menu_device, g_menu_path_buf, filename, g_menu_prefix[type], (ulonglong)fsize, + g_menu_prefix[type]); + + } + + node->prev = NULL; + node->next = g_browser_list; + if (g_browser_list) + { + g_browser_list->prev = node; + } + g_browser_list = node; + + return 0; +} + +grub_err_t ventoy_cmd_browser_dir(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int i; + grub_fs_t fs; + grub_device_t dev; + char cfgfile[64]; + browser_node *node; + browser_mbuf mbuf; + + (void)ctxt; + (void)argc; + + if (!ventoy_browser_mbuf_alloc(&mbuf)) + { + return 1; + } + + fs = (grub_fs_t)grub_strtoul(args[1], NULL, 16); + if (!fs) + { + debug("Invalid fs %s\n", args[1]); + return 1; + } + + dev = grub_device_open(args[0]); + if (!dev) + { + debug("Failed to open device %s\n", args[0]); + return 1; + } + + g_menu_fs = fs; + g_menu_device = args[0]; + g_browser_list = NULL; + + if (args[2][0] == '/' && args[2][1] == 0) + { + g_menu_path_len = 0; + g_menu_path_buf[0] = 0; + fs->fs_dir(dev, "/", ventoy_browser_iterate_dir, NULL); + } + else + { + g_menu_path_len = grub_snprintf(g_menu_path_buf, sizeof(g_menu_path_buf), "%s", args[2]); + fs->fs_dir(dev, g_menu_path_buf, ventoy_browser_iterate_dir, NULL); + } + grub_device_close(dev); + + browser_ssprintf(&mbuf, "menuentry \"%-10s [../]\" --class=\"vtoyret\" VTOY_RET {\n " + " echo 'return ...' \n}\n", "<--"); + + for (i = 1; i >= 0; i--) + { + while (1) + { + node = ventoy_browser_find_top_node(i); + if (node) + { + grub_printf("Find Node <%s>\n", node->filename); + browser_ssprintf(&mbuf, "%s", node->menuentry); + if (node->prev) + { + node->prev->next = node->next; + } + if (node->next) + { + node->next->prev = node->prev; + } + + if (node == g_browser_list) + { + g_browser_list = node->next; + } + grub_free(node); + } + else + { + break; + } + } + } + g_browser_list = NULL; + + grub_snprintf(cfgfile, sizeof(cfgfile), "configfile mem:0x%lx:size:%d", (ulong)mbuf.buf, mbuf.pos); + grub_script_execute_sourcecode(cfgfile); + + ventoy_browser_mbuf_free(&mbuf); + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + +grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **args) +{ + char cfgfile[64]; + browser_mbuf mbuf; + + (void)ctxt; + (void)argc; + (void)args; + + if (!ventoy_browser_mbuf_alloc(&mbuf)) + { + return 1; + } + + browser_ssprintf(&mbuf, "menuentry \"%-10s [Return]\" --class=\"vtoyret\" VTOY_RET {\n " + " echo 'return ...' \n}\n", "<--"); + + grub_disk_dev_iterate(ventoy_browser_iterate_disk, &mbuf); + + grub_snprintf(cfgfile, sizeof(cfgfile), "configfile mem:0x%lx:size:%d", (ulong)mbuf.buf, mbuf.pos); + grub_script_execute_sourcecode(cfgfile); + + ventoy_browser_mbuf_free(&mbuf); + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c index 2fb78c30..161ad7c8 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c @@ -134,14 +134,14 @@ static ventoy_video_mode *g_video_mode_list = NULL; static int g_enumerate_time_checked = 0; static grub_uint64_t g_enumerate_start_time_ms; static grub_uint64_t g_enumerate_finish_time_ms; -static int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT] = {0}; +int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT] = {0}; static int g_pager_flag = 0; static char g_old_pager[32]; static const char *g_vtoy_winpeshl_ini = "[LaunchApps]\r\nvtoyjump.exe"; -static const char *g_menu_class[] = +const char *g_menu_class[img_type_max] = { "vtoyiso", "vtoywim", "vtoyefi", "vtoyimg", "vtoyvhd", "vtoyvtoy" }; @@ -158,7 +158,7 @@ static char g_json_case_mis_path[32]; static ventoy_vlnk_part *g_vlnk_part_list = NULL; -static int ventoy_get_fs_type(const char *fs) +int ventoy_get_fs_type(const char *fs) { if (NULL == fs) { @@ -686,10 +686,10 @@ grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ... { va_list ap; grub_file_t file; - char fullpath[256] = {0}; + char fullpath[512] = {0}; va_start (ap, fmt); - grub_vsnprintf(fullpath, 255, fmt, ap); + grub_vsnprintf(fullpath, 511, fmt, ap); va_end (ap); file = grub_file_open(fullpath, type); @@ -707,13 +707,13 @@ int ventoy_is_dir_exist(const char *fmt, ...) va_list ap; int len; char *pos = NULL; - char buf[256] = {0}; + char buf[512] = {0}; grub_snprintf(buf, sizeof(buf), "%s", "[ -d \""); pos = buf + 6; va_start (ap, fmt); - len = grub_vsnprintf(pos, 255, fmt, ap); + len = grub_vsnprintf(pos, 511, fmt, ap); va_end (ap); grub_strncpy(pos + len, "\" ]", 3); @@ -1582,7 +1582,7 @@ void ventoy_swap_img(img_info *img1, img_info *img2) grub_memcpy(img2, &g_img_swap_tmp, sizeof(img_info)); } -static 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)namelen; @@ -2564,6 +2564,40 @@ static grub_err_t ventoy_cmd_ext_select_img_path(grub_extcmd_context_t ctxt, int VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +static char g_fake_vlnk_src[512]; +static char g_fake_vlnk_dst[512]; +static grub_uint64_t g_fake_vlnk_size; +static grub_err_t ventoy_cmd_set_fake_vlnk(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + (void)argc; + (void)args; + + g_fake_vlnk_size = (grub_uint64_t)grub_strtoull(args[2], NULL, 10); + + grub_strncpy(g_fake_vlnk_dst, args[0], sizeof(g_fake_vlnk_dst)); + grub_snprintf(g_fake_vlnk_src, sizeof(g_fake_vlnk_src), "%s/________VENTOYVLNK.vlnk.%s", g_iso_path, args[1]); + + grub_file_vtoy_vlnk(g_fake_vlnk_src, g_fake_vlnk_dst); + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + +static grub_err_t ventoy_cmd_reset_fake_vlnk(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + (void)argc; + (void)args; + + g_fake_vlnk_src[0] = 0; + g_fake_vlnk_dst[0] = 0; + g_fake_vlnk_size = 0; + grub_file_vtoy_vlnk(NULL, NULL); + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + + static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int argc, char **args) { char value[32]; @@ -2578,6 +2612,18 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s {var}", cmd_raw_name); } + if (g_fake_vlnk_src[0] && g_fake_vlnk_dst[0]) + { + grub_env_set(args[0], grub_strchr(g_fake_vlnk_src, '/')); + if (argc > 1) + { + grub_snprintf(value, sizeof(value), "%llu", (ulonglong)(g_fake_vlnk_size)); + grub_env_set(args[1], value); + } + + goto end; + } + id = grub_env_get("chosen"); pos = grub_strstr(id, "VID_"); @@ -2603,6 +2649,7 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg grub_env_set(args[1], value); } +end: g_svd_replace_offset = 0; VENTOY_CMD_RETURN(GRUB_ERR_NONE); @@ -5468,6 +5515,8 @@ int ventoy_env_init(void) static cmd_para ventoy_cmds[] = { + { "vt_browser_disk", ventoy_cmd_browser_disk, 0, NULL, "", "", NULL }, + { "vt_browser_dir", ventoy_cmd_browser_dir, 0, NULL, "", "", NULL }, { "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL }, { "vt_mod", ventoy_cmd_mod, 0, NULL, "{Int} {Int} {Var}", "mod integer variable", NULL }, { "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL }, @@ -5608,6 +5657,8 @@ static cmd_para ventoy_cmds[] = { "vt_vlnk_dump_part", grub_cmd_vlnk_dump_part, 0, NULL, "", "", NULL }, { "vt_is_vlnk_name", grub_cmd_is_vlnk_name, 0, NULL, "", "", NULL }, { "vt_get_vlnk_dst", grub_cmd_get_vlnk_dst, 0, NULL, "", "", NULL }, + { "vt_set_fake_vlnk", ventoy_cmd_set_fake_vlnk, 0, NULL, "", "", NULL }, + { "vt_reset_fake_vlnk", ventoy_cmd_reset_fake_vlnk, 0, NULL, "", "", NULL }, }; int ventoy_register_all_cmd(void) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index 69d34400..f00ce37e 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -35,6 +35,7 @@ #define VTOY_SIZE_4MB (4 * 1024 * 1024) #define VTOY_SIZE_512KB (512 * 1024) #define VTOY_SIZE_1KB 1024 +#define VTOY_SIZE_32KB (32 * 1024) #define JSON_SUCCESS 0 #define JSON_FAILED 1 @@ -315,6 +316,9 @@ void ventoy_debug(const char *fmt, ...); #define vtoy_ssprintf(buf, pos, fmt, ...) \ pos += grub_snprintf(buf + pos, VTOY_MAX_SCRIPT_BUF - pos, fmt, __VA_ARGS__) +#define browser_ssprintf(mbuf, fmt, args...) \ + (mbuf)->pos += grub_snprintf((mbuf)->buf + (mbuf)->pos, (mbuf)->max - (mbuf)->pos, fmt, ##args) + #define FLAG_HEADER_RESERVED 0x00000001 #define FLAG_HEADER_COMPRESSION 0x00000002 #define FLAG_HEADER_READONLY 0x00000004 @@ -1166,8 +1170,34 @@ typedef struct ventoy_vlnk_part struct ventoy_vlnk_part *next; }ventoy_vlnk_part; + +typedef struct browser_mbuf +{ + int max; + int pos; + char *buf; +}browser_mbuf; + +typedef struct browser_node +{ + int dir; + char menuentry[1024]; + char filename[512]; + struct browser_node *prev; + struct browser_node *next; +}browser_node; + +extern int g_sort_case_sensitive; +extern int g_wimboot_enable; +extern int g_filt_dot_underscore_file; +extern int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT]; +extern const char *g_menu_class[img_type_max]; extern char g_iso_path[256]; int ventoy_add_vlnk_file(char *dir, const char *name); +grub_err_t ventoy_cmd_browser_dir(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_img_name_valid(const char *filename, grub_size_t namelen); #endif /* __VENTOY_DEF_H__ */ diff --git a/GRUB2/MOD_SRC/grub-2.04/include/grub/file.h b/GRUB2/MOD_SRC/grub-2.04/include/grub/file.h index 2d64b590..21af4e04 100644 --- a/GRUB2/MOD_SRC/grub-2.04/include/grub/file.h +++ b/GRUB2/MOD_SRC/grub-2.04/include/grub/file.h @@ -218,6 +218,7 @@ grub_err_t EXPORT_FUNC(grub_file_close) (grub_file_t file); int EXPORT_FUNC(grub_file_is_vlnk_suffix)(const char *name, int len); int EXPORT_FUNC(grub_file_add_vlnk)(const char *src, const char *dst); +int EXPORT_FUNC(grub_file_vtoy_vlnk)(const char *src, const char *dst); const char * EXPORT_FUNC(grub_file_get_vlnk)(const char *name, int *vlnk); /* Return value of grub_file_size() in case file size is unknown. */ diff --git a/INSTALL/grub/debug.cfg b/INSTALL/grub/debug.cfg index 9ccf3387..6b8f8c2b 100644 --- a/INSTALL/grub/debug.cfg +++ b/INSTALL/grub/debug.cfg @@ -1,4 +1,5 @@ +source $prefix/power.cfg source $prefix/keyboard.cfg submenu "Resolution Configuration" --class=debug_resolution --class=F5tool { diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 1059f846..1107c78e 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -65,10 +65,6 @@ function ventoy_vcfg_proc { fi } -function ventoy_power { - configfile $prefix/power.cfg -} - function ventoy_diagnosis { vt_enum_video_mode configfile $prefix/debug.cfg @@ -2073,7 +2069,7 @@ function img_unsupport_menuentry { ############################################################# ############################################################# -set VENTOY_VERSION="1.0.66" +set VENTOY_VERSION="1.0.67" #ACPI not compatible with Window7/8, so disable by default set VTOY_PARAM_NO_ACPI=1 @@ -2081,7 +2077,7 @@ set VTOY_PARAM_NO_ACPI=1 # Default menu display mode, you can change it as you want. # 0: List mode # 1: TreeView mode -set VTOY_DEFAULT_MENU_MODE=1 +set VTOY_DEFAULT_MENU_MODE=0 set VTOY_MEM_DISK_STR="[Memdisk]" set VTOY_ISO_RAW_STR="Compatible Mode" @@ -2089,7 +2085,7 @@ set VTOY_GRUB2_MODE_STR="GRUB2 Mode" set VTOY_WIMBOOT_MODE_STR="WIMBOOT Mode" set VTOY_ISO_UEFI_DRV_STR="UEFI FS" -set VTOY_F2_CMD="ventoy_power" +set VTOY_F2_CMD="vt_browser_disk" set VTOY_F4_CMD="ventoy_localboot" set VTOY_F5_CMD="ventoy_diagnosis" set VTOY_F6_CMD="ventoy_ext_menu" @@ -2187,10 +2183,10 @@ fi if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then set VTOY_F3_CMD="vt_dynamic_menu 1 1" - set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Tools F6:ExMenu" + set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Browser F3:TreeView F4:Localboot F5:Tools F6:ExMenu" else set VTOY_F3_CMD="vt_dynamic_menu 1 0" - set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Tools F6:ExMenu" + set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Browser F3:ListView F4:Localboot F5:Tools F6:ExMenu" fi terminal_output console @@ -2310,9 +2306,7 @@ if [ -n "$VTOY_DEFAULT_IMAGE" ]; then export timeout export default - if [ "$vtHotkey" = "F2" ]; then - ventoy_power - elif [ "$vtHotkey" = "F4" ]; then + if [ "$vtHotkey" = "F4" ]; then ventoy_localboot elif [ "$vtHotkey" = "F5" ]; then ventoy_diagnosis diff --git a/INSTALL/grub/help/de_DE.txt b/INSTALL/grub/help/de_DE.txt index a04d1034..e36f1143 100644 --- a/INSTALL/grub/help/de_DE.txt +++ b/INSTALL/grub/help/de_DE.txt @@ -1,6 +1,6 @@ h - Zeigt dieses Hilfe Menu F1 - Memdisk Modus (Nur für kleine WinPE/LiveCD ISO/IMG) -F2 - Neustarten/Herunterfahren +F2 - Browse and boot files in local disk F3 - Menu wechsel zwischen Baum <-> Listen Ansicht F4 - Windows/Linux vom lokalem Datenträger starten F5 - Dienstprogramme diff --git a/INSTALL/grub/help/en_US.txt b/INSTALL/grub/help/en_US.txt index f75c8109..e9fd7438 100644 --- a/INSTALL/grub/help/en_US.txt +++ b/INSTALL/grub/help/en_US.txt @@ -1,6 +1,6 @@ h - Display this help information F1 - Memdisk Mode (Only for small WinPE/LiveCD ISO/IMG) -F2 - Reboot/Power off +F2 - Browse and boot files in local disk F3 - Switch menu mode between Treeview <-> ListView F4 - Boot Windows/Linux in local disk F5 - Utilities diff --git a/INSTALL/grub/help/fr_FR.txt b/INSTALL/grub/help/fr_FR.txt index ece0d282..ac61e1fc 100644 --- a/INSTALL/grub/help/fr_FR.txt +++ b/INSTALL/grub/help/fr_FR.txt @@ -1,6 +1,6 @@ h - Afficher cette aide F1 - Mode Memdisk (Seulement pour WinPE/LiveCD ISO/IMG) -F2 - Redémarrer/arrêter +F2 - Browse and boot files in local disk F3 - Basculer l'affichage 'Vue en arbre' <-> 'Vue en liste' F4 - Démarrer le système Windows/Linux local F5 - Utilitaires diff --git a/INSTALL/grub/help/hr_HR.txt b/INSTALL/grub/help/hr_HR.txt index 04bd1ada..33eb810d 100644 --- a/INSTALL/grub/help/hr_HR.txt +++ b/INSTALL/grub/help/hr_HR.txt @@ -1,6 +1,6 @@ h - Prikazuje ove informacije F1 - Memdisk način rada (samo za male WinPE/LiveCD imidž fajlove) -F2 - Ponovno pokretanje/isključivanje +F2 - Browse and boot files in local disk F3 - Mijenja meni između TreeView <-> ListView F4 - Pokreće Windows/Linux na lokalnom disku F5 - Postavke diff --git a/INSTALL/grub/help/id_ID.txt b/INSTALL/grub/help/id_ID.txt index 879e0e90..34962959 100644 --- a/INSTALL/grub/help/id_ID.txt +++ b/INSTALL/grub/help/id_ID.txt @@ -1,6 +1,6 @@ h - Tampilkan bantuan informasi ini F1 - Mode Memdisk (Hanya untuk ukuran WinPE/LiveCD ISO/IMG yang kecil) -F2 - Mulai ulang/Matikan +F2 - Browse and boot files in local disk F3 - Beralih mode menu antara Treeview <-> ListView F4 - Jalankan (boot) Windows/Linux pada disk lokal F5 - Alat Utilitas diff --git a/INSTALL/grub/help/ja_JP.txt b/INSTALL/grub/help/ja_JP.txt index c7febd52..4f78dc4d 100644 --- a/INSTALL/grub/help/ja_JP.txt +++ b/INSTALL/grub/help/ja_JP.txt @@ -1,6 +1,6 @@ h - この画面を表示する F1 - 主記憶装置上に記憶域を作成する(容量の小さなWinPE・LiveCD専用) -F2 - 再起動・電源断 +F2 - Browse and boot files in local disk F3 - 表示形式を切り替える(一覧 ↔ 階層) F4 - 手元の記憶装置にあるOSを起動する F5 - 諸機能 diff --git a/INSTALL/grub/help/pt_PT.txt b/INSTALL/grub/help/pt_PT.txt index ee8f8f9e..93edece3 100644 --- a/INSTALL/grub/help/pt_PT.txt +++ b/INSTALL/grub/help/pt_PT.txt @@ -1,6 +1,6 @@ h - Mostra esta informação de ajuda F1 - Modo Memdisk (Apenas para pequenos WinPE/LiveCD ISO/IMG) -F2 - Reiniciar/Desligar +F2 - Browse and boot files in local disk F3 - Alternar o modo menu entre Vista de árvore <-> Vista de lista F4 - Arrancar o Windows/Linux em disco local F5 - Utilitários diff --git a/INSTALL/grub/help/sr_CY.txt b/INSTALL/grub/help/sr_CY.txt index b9fde242..73d2acf1 100644 --- a/INSTALL/grub/help/sr_CY.txt +++ b/INSTALL/grub/help/sr_CY.txt @@ -1,6 +1,6 @@ h - Приказује ове информације F1 - Memdisk начин рада (само за мале WinPE/LiveCD имиџ фајлове) -F2 - Поновно покретање/искључивање +F2 - Browse and boot files in local disk F3 - Мијења мени између TreeView <-> ListView F4 - Покреће Windows/Linux на локалном диску F5 - Поставке diff --git a/INSTALL/grub/help/sr_SR.txt b/INSTALL/grub/help/sr_SR.txt index faf445e0..8eeeef4f 100644 --- a/INSTALL/grub/help/sr_SR.txt +++ b/INSTALL/grub/help/sr_SR.txt @@ -1,6 +1,6 @@ h - Prikazuje ove informacije F1 - Memdisk način rada (samo za male WinPE/LiveCD imidž fajlove) -F2 - Ponovno pokretanje/isključivanje +F2 - Browse and boot files in local disk F3 - Mijenja meni između TreeView <-> ListView F4 - Pokreće Windows/Linux na lokalnom disku F5 - Postavke diff --git a/INSTALL/grub/help/tr_TR.txt b/INSTALL/grub/help/tr_TR.txt index d57d709e..8e5e4068 100644 --- a/INSTALL/grub/help/tr_TR.txt +++ b/INSTALL/grub/help/tr_TR.txt @@ -1,6 +1,6 @@ h - Yardım bilgilerini göster F1 - Memdisk Modu başlatır(Yalnızca küçük WinPE/LiveCD ISO/IMG ler için bu modu kullanabilirsiniz) -F2 - Bilgisayarı Yeniden Başlat/Kapat +F2 - Browse and boot files in local disk F3 - Ventoy Menü modu olarak,Klasör görünümü(Treeview) ile Liste görünümü(ListView) arasında geçiş yapmayı sağlar. F4 - Bilgisayarınızda yüklü olan Windows yada Linux işletim sistemini, sabit diskten başlatır. F5 - Ventoy Araçlar menüsü diff --git a/INSTALL/grub/help/zh_CN.txt b/INSTALL/grub/help/zh_CN.txt index 49a2ec14..e580e16c 100644 --- a/INSTALL/grub/help/zh_CN.txt +++ b/INSTALL/grub/help/zh_CN.txt @@ -1,6 +1,6 @@ h - 显示本帮助信息 F1 - 把文件加载到内存启动(只适用于文件很小的 WinPE/LiveCD等) -F2 - 电源操作 (重启、关机) +F2 - 浏览并启动本地硬盘中的镜像文件 F3 - 菜单显示模式切换。可在列表模式和目录模式之间自由切换。 F4 - 启动本地硬盘上的 Windows/Linux 等系统。 F5 - 各类工具 diff --git a/INSTALL/grub/power.cfg b/INSTALL/grub/power.cfg index ede844c2..2b3bb358 100644 --- a/INSTALL/grub/power.cfg +++ b/INSTALL/grub/power.cfg @@ -1,15 +1,17 @@ -menuentry Reboot --class=power_reboot { - echo -e '\n\nSystem is rebooting ... \n' - sleep 1 - reboot -} +submenu "Power" --class=debug_power --class=F5tool { + menuentry Reboot --class=debug_reboot --class=debug_power --class=F5tool { + echo -e '\n\nSystem is rebooting ... \n' + sleep 1 + reboot + } -menuentry Halt --class=power_halt { - echo -e '\n\nSystem is halting ... \n' - sleep 1 - halt -} + menuentry Halt --class=debug_halt --class=debug_power --class=F5tool { + echo -e '\n\nSystem is halting ... \n' + sleep 1 + halt + } -menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET { - echo 'Return ...' + menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET { + echo 'Return ...' + } } diff --git a/INSTALL/ventoy/vtoyjump32.exe b/INSTALL/ventoy/vtoyjump32.exe index 960c02537b95729d72cb7772de3d51f2c15d599e..d1dd1004ee1f47b60bdad8ba6d0c293cad04b41f 100644 GIT binary patch delta 14855 zcmeHud0Z676YunZg0cvTASwbX-io_Bd(X@s3W5i^2Dv;C&rFChnt-BF7e!QDNzhhT zVPxkw`Ng2=x0`?6{4w|_Y zl#6?vQz2u{ODc^`6^q9geHJzy(G8o69*1{oMsp=at$JQU^w327uvdQQcL}cfoOAuf zCkl7=TPUHdRXoq6f#}N2+9c<}hqgKcN>4#Tt!+o-i0+)byp5 zgI8!xwC|oGi&jAN;(>UNu8ck%i$Bu$q}RscwfZ`G(IC9Y(3kEo2p1bF>7oJH#+v9R zakz{PYCCd(Yvl!L*>Yc#nNwDA><;_~8`$16j-qlZf^*9u%CH2eaV8yn=jF6L$Jy+mHym} zzp{Kx>o?=TeoN`)CcLFz7dqX9tNZEN$xSX<_KPBV>e?Ks%=uAbunD*8@1UDlU=ca| zNB=wYBp#oS>PhQ){32>l`(`|us|@DaHr*>f=7mS4U@akYZQ$_6=r+iNXGC|U3pspO zsvL&OG!Cam2hpdD_*t}uF8mBf4p>hA!xx<#;Dcx*k1xb%=vXao8as-f&fy8MJ?Nes z{yespHnDitz=O1h4)-0DN59eIql4DcKWcEo;P2?IIvg}4N_JiCUJ`MK4o@Cpq$72B z$B-YxhiNIQwg>os&KsYM)rmrIDY$6HPsE$O<3)uQZ;OkeMGdZxJ7Vjjp{Tm%!p)<= zGU_g2@dPv3tHw$T@)6@2LE3W(_WJqtD%`%1YfN)GomIJ0{&hMb zzEDCoJgimGPZLK_F;&seCsDCc;!e;ur@}u!m++=j@SjIIg$HT^Y?-~CfzzhJI=b4d zf*C9;P>4A%URAnuNeAPTfvf@rx?l9sDNAQAwp%>eex820pAll*Ybj1K=TpVOZbk6< zp$hu(ofX46N1eGNtsLXbpBO<^=GtC5ofc;x2ZPyf#tRdVgAO|+7Vq5Kehamr_fmatQQ!eFInE}2%N7uhJ4A@i#o<2oM!B3jrmxGng;=sAfxzN-!gh$P z7i`G9Lu9szLKg5;$Dk;uVRHcn0ix2y_cxIh{$w zg#^$nQTU3;+7CPs&)lBc07ojJt|2{FSzp?~LGp6_^nO!ySI4O=bj16(#YWjH{i07=g*3wC>0-*}m-vCZW%@3?;Zjay|ABEYicdko+_EDX z!0Q+NXQD8Nbh>y`(jGd=;P}Y+$S$p<%Z&v>OBB`vpZgpcEdQ^~XOnhcpPwWVxn*wW z&uAxnMMP)1M7x!6{0)}qBvg==QLdJ{06`?xAy9RV3#QEGy<31LehW{NjZDfe4csb` zq{S*$fHOc4z%lW@AMCjM-^2SYoIrX~Wgz*t8z8xH89Mw44i*7qSJ0R$_4Ah~#Ol7J z7YEH%(G6t3LvSWL34${;P~xT=_+)$p8i9X}k2IEBg)Feaf9Z5DQqqZ7&qcSo2AcvR zfdGb+(gUklj1xyB*?#Ed_UDB}(Vf?&Nibz&Q{Dc4q_KS^X4CSO41PubocmsKT0dEt@7LrH2cbaG!)WO}&9Z5b>adcEQggBwV?M=OhgG3Mb{+*Kkcjlov@pY8sS#cSu`x4(WpXpS+~RW( zl3RAv`xI<3Pk6W*{i4poUY0>!Jbx9>Pios%39cp0#4k4t90V3JoV2dHii?tx>7Q?4 z-(MdCb0+^BAPyr3dP5s3Mo44$75BjZq}PLLM1;0ivGyc-R{LP}JC*|kex ztrS8s>GQ>9{9Q^E{lRtIWTc|KwE8VCyO!^EZ7zh4BbNdo*Z=Ve9zHU5{1Vb-|0OUh zxd8~fNOcpbl9XR4Bh>;@UE&Yb8d9AP)g(bA#Tih{sp!r;%XQ8hFP$o&D^SbcdUEG%C zv_Ktv(fhQ8+LjG9(RL1BOzoH|2ZES%PMVFRr(_A}9k>t#4;S}-PntYkYwPk5;x$7^ zw{YktOoNitD*n`o%#Um{osdo1sdISf*!FGWL4-ZdJ3rnN1mzEO*4BZ?3!8EF*ip8< zz-JX-b#7dKgHS?xzI3@SxOflY9w7{Lsgb`hA`4PLfvSW-$)(CFJ_;v&Wp(|9a3G4| zE=IBYGjhum%!HBnxic_>ER^K(BY+5!vS|vBOzTF2!{(&%UQqq^!lYmU1uMrJBf?U)afN=>K@<)pmm;^>J5kk6aYS6TJ&a4 zPg-^k26P3Zc6+hPRy(2f=Vl6`dYKeYg$8J@eGc1Q=nfwhY9EtQ1}QxxrIn;~3rcq9 z&-rG`8@fJP=6e4I^{0S0Zm_=OnvzLBDX-mzv$MbQIUNLnEGRWkE)Kzc=XVNUL+YLC zE;D6yH{foQX#W%JTRA{R<(|o$oFpE@)8}_ZYP@EC7;@l}`LkptfpB0_(2Ej{m|rkh zHtrqa5nj2VuYW}t#M`(AdxPI$kKtDF5Wc#=fHH84obG-_@L9*+;EwZR369R`*vj4u zGzb-chL=DRTX7%G%29S7*Nvi5zyWvHd5H{k%L^8JOE0*VjjC&%D4Gd_7+iEECxh<3 zxf%>et};239>U$mKG!?f>9?v3`nMJrw|uLyFP^%nZ<`?!AsEK0tInD9n#wj&nc;91 zJh*7A&vp2AkOh(}RUFY+W28n+p{80(ju8#b3&9_`M}SpCxvg z`5mDWA6oJl?ZjW@^@k5+VqQ1dE#J4?X}JATC%TB++kf!++oy5dIoN5BM5Q=#S$o-L zpt{HEiW8Q_)6^OK^|BCI=XdnoMOT2H5WLY$Iq&^b1$ix%8F;dm&bjZA^TPX+o=>(r zBUX{t0(;d_(wbB2`H3v&o`*-ZGa|S52Iv-%-<`C>doNTAICuzvWgGD9FS^me8}YU; zBFO8^7a?7UB*sO@tyyYt-z8OS4`?vl8e49E7=`8p`#6)|+tCB!;o=tei^4Qj{fh&M;4sZw1u&IbXJpuW(7Q)Yf1EoP&Peb84-f}HyPgmad6y0_Q? z+$=?G4quNXLNifD2r!6|ydf%jS;ZGHQp%R7zagGagoo9s=HTU2>)Iq&=?Qj_g!k^u6I$o7f(b>Xejn`y|nxc@Nlg=02oIhh!K^ zJOCZ4qF+PQaM~-yRJe?m!+y`<3;(rHbVd`gH%NsKf#Q64yY^umQ7dIkx%e4qU;7#K zgbvQYa}a#f(Kb(_+}Rjcr%wh`RG%E4(4Y&f84?SjDMe`JNtKCaXazaYdwzWcxL|r4 zaeR?_l?=7b1<5Hn+wVcj3R&1gc%=^^pVicO4Mm2fa(7`#A*Xzv``Qz|3K9`hP> zk>%*9OmGOAG?KP*&zvg%*t}@(%x@FLdfem7z0qdks82h%BAqy>ISHtC-)a$3=%Ldx zI_1opLS=-AN+pSX~4#%xKh(=<1{Y(^yXRrSe zy~N2I!qGK6YeP4*4{zD9r+ruW>_Rg9beWJw2L1%RgL#&h`B1FF?{5ric^IM@k(>+k z@^oKu33hDkjbNr5?SGxpik3$4J~O$lfT&fgS?Cg9Rd z`RIE*Xmc0T7Ejw86#O}inj(&c`-Us{)zOU8UM0@J8#ix7L$PJcdUOEa-Lf(`I zKuf$P1-v6hC?y*biEyhRB%oz5iB9#JUtxuIUlz1A#W;x@GaVgWA%!c@2XQ?1=Z3--R zSyyBgCqM_LtXw#Hzzi2!_$s@ND3X%%+?nwpu~F5Z@s=F{XeK_iLvM4c!E(NY$(d4{ zY=EhF3k^iIYH;}z{;(_bY8gB;dcu&N(4Im9cA`LNV#HI>HDwzqH?BEo10VXJFHzA5 zYNZh0O0;Lnk`l#7FrO6rP?`Ptvy%%l+lccU@JBn_p-FhjPQJ?*@IfJ`ESzn~kcl}` z*~~U%`Xq_DQP2wx60by&$G`3D1r8jvt3OJ`BX>ohU$AW#$0+`2^mMWKF@*bSXDtRr z>~m!>vOk!lZLTvjP;CB=tpGpXwOy71%5bdPB~Q;GE}g zGKYxwe}{^$Q|5=_O(^9B*NwNs&sPFrgb&zK+yvgrs8AVGYUfEP)>mV)#dKCqi1**T>Ha=IwkM=bFoltB9$>kL zH+~(VlytoY7enc~G0Vd(I$Uh|pQ1hAbz6#`emypHZ9N)|1u2cfVf$};;4w`*Zd2ji1_yP#(H(Oy%hFgQ*UMSVQkbaB!%M0&oL z0De#roLZZKWA~+o&0;_VY#8yDN-Bg1{%1jQD@fpgI0~QM_itzw;UQ=5XtEBlP#Gk1 zI3V?eqwwDT_ANU129})XC?hc4Lkz;rzM0i(eJ>ZuZ=oNA1|Zw<%5M}%k1N07y1mvD zE#OBQzuadq31KTat^0%jn?VXUL+v6cagV|<)C&(R3=8i0u15j%ND^8@U`P}LaCTu3 z^1_b7!M!_>gAu-bd4p?_9~;aN56Gu1_)#@g%z#@y3B~c`Pt3+G4uql)i~1axfQs_J z-AN;Pk@`>^lD+@)TbKR4=<~zyEEtOarz{vckSrKD3aX)84`_YGl?7jMWx-cmS+Gln0Iz9)EI>A337`P5 z2C(OfD+`9A-B|(8bAUU5hAWT-PeNhSh-aoj0B3IJjd=+1I_J$B2y-flYWF-R41XzqRG{xJ!ReC>hG2#7F{@(Pot0U=!)SPH5ad= zf})Qv#dwC55Y1aY{GT-!Pf1z@;%hZL+J*zJ^+CI_8WrNU z*XIWWKZL#h70eF8hZO!rN726P6A@Ze)aqsr8jZ%>t;=XGZgHEJZ7h8|g9w~-duP{z zY76xpdDQvXn?g=UJ1^x_db0m~^5@vp^2DSQYe@T=qKG@~o1jZZJON+&xfA-Q=*iDzUOt-rjlu6YK2fVjf8pn~U46da*GPR2 z_xPoy139^bI@fG*egpHB(LBn5h)NPQXFH8-SUzVDFcGQ9zOItwtr#q z_f6p+%gA1T@s_lp_=Okx6w$gij;YPi1lrujakUv*K;B8sQU9=;M8iH{^Z(wKp81k< zD;!6fBMUm_c-0)WZMJ2Z%WCHx9ej{Zwi2ptvn4pj`Ji3_J%9omHSt};9mggg6zMJ6 zp+P4GIKmoax?;3_c@m+2J30wF%ha~_lL(hvZ1fW*5tl5IMLe4ts z17TW)^Ig-r<7g3tG_9w*s~h0$o?d51auAv>3x7xXx%gTTYKl+`$DKClTV!^85sZSs zB0GXnw)YqFKr6Wj^J|MDW%*EZ%LynJ+Mj@MH_?GW|7t$Kc`p@r78+O3Q%H+Lm7tFdA*uRW*6kB2}8Qp zrKIA_eCYaz0&qzg_*hF8oUJ?rS0Ii0gtL%1WjaKFQVgIry$9 z)u$a$a&%2HeMB%}SM-^zdKzJY`zIylIr?;iZJH@jq!oNsoZSuGp-0OGLvG(B>URtE zJRUx;n4wVBBo>}|BS>iolpaVWE0lx;U>PB?B*U|h)OR$Lwn!{#P--TXCPL}yh~ko- zNbMtgJ?`z47C2t05l`P4RIJmWhfO12_P0<&qAb)7zzu*d+Cm)z)Bv;tEL2;-EWlJi z{{fCcJo>f6krZOLI{*9_pCzGe^~~1dPD1H47B*32ahwrZJkTh|7Z%jPhfi#5s3oTOvL}qjGmcze4+UcVNvdcw|I8OCP z_2FzhaS`$Kd%#{^H^p`N$n+OGyXgBI7oyOX&a>G>rdHD1lLWU)g`mp2lVAKu$Tm1WAbPS>U#k=E>3i-$e zHZtI1aVUDy41H64Cm9X&L}`w$W6&*JMw@MGE+c9QUa|o?Sqc=S4&X z0lEYF0g?ez01E)C0b2oI1Ihr`0V3cjfWCyNh--*~e|bll0V4pD0W$y#04pvb8?_M% zg@8)Hb--i58-NTH=mao;fI)zffONn-z%oEE@FZSA)LG!U4!93^3h)M61V9Cd0;~bv zG;RMit^n!*O=}Pp z4&VSI0Sf@D0bc_S11bPl0CxZl02-8O1t5QmU}ZNCf=32`{GEb#jk_!n+>cSa&D6yc zX6mz(W@?KJ?pKgkHU5=PNdSvp~eDLXq;S+>O6Fv+dHaNUXe?xeeOyH#kjQe29q>14f zAG;f8Oq!bU@vQKPgdI4Fx9vsOydBwx(6o?jNX_8VL%kOt75~o>liL2XfAopiw1Z!D zJ2lZEJB*@y8Y(F&{0!Wp+Mwkf10B;2qhR{TO2^W}DAa>rZFYQk7V2+VYCj+j;51Ktp5}*A#qwp#a?7Pzwvy1VH{8^(b{K*;udfvp5D9!^E$(vN%SS zKp`u@P2t;G9Cla}ziypfGKid%P8Ml$9`ic7`F*>&hD&PsA%tB(@_%^KVJK%!N0jg% zG!e>6fJU8nc_0xhhdmTN4N>>by`z-^4gQre*y{hsi~qOr!XGU5U-6=tFGbkva0N2^ zc0JR>LjB)SJoz$8Z3c09U*+pmU5mStnvx$I&Vvs>At>`OL)Gjb{1IPOdCAa|D2 z@PqhdeiEO@ui*WRql{CHImV^Nea155MdM#aUsGRGis^mR$EKC0O{SZspG;3o&rMVs zMHPV0c*tAI`^t6l0rHXZH2G}#3i)37G5JOLZTZh~r0Aef*%W%k07blFt^zC8Do!hE z6^|8>N=_N8OjBknH!I7O^~z>U1fymKGV#o0=0j!6-b6rneif)2V(0!ttshh7`q+71rr8}Z~ zrfaDmqEFGM>OauW($CXl{Th9V{)GOl{-XZA{*j(GG&ckpdKe-N(S{L*6vO+5j|~e9 ziw)I=TZVrOZwy{+d$tFwV58W9>}VVNAv=v-$L?g0u;|g9ZY#%O_o6Jq;W^*~* z5^ft;$ejW++~j`b?sJd0Ke=a|7azi#_$WSwU&rs`Pw-dxNBk?EGB!2(82ybFW3~|+ zj~GuFuNZF_Um0bl2PW9q(A4diQMm;FF%}5;xqXl`8xh@-pMyJ zwl)SELyY0Z2xE6+Z=>9(F%B@rnI@P%aw$*%J^?a+mDkJP$U7)FF#C9$VxOX^YN5(c z?ND!2m#M4NJGCF{1%n6Mi`BEga2_zz&U`Ok&Z~GGKaO9_Z|C>&h5SLjgfHdG_zJ$7 zZ}oQArN&jpLSwP96r8id_>0lcWHH5>hM26T5vF9*Xj7VLqG`YBpsB=EYAQ2Pn<>h6 z6Ey0kFe?TthASp0K2pq3oKTc2&MUl>GG&0Wt#Yn%zw(f>T1hcY85z@x31&i>E=+HR zVGN9giDiZ{Nz7R0edbee%=ye>W;wHt*~1)TzGrHfI_A8}R~@VlRp+RS)!(aMsS`DO zHIub#wQ)ME+pW8=i?Zp*=%<1MZPM@1@6(^w*XZx+>-2x?n}89P8nzn(x!&AFZWgzg zE8vcC{rC_0Tt1&)!+*n{;UDt#{7YE)7DmqazHy_m#`wrM)3nEQ#Y7c?>0n|V|_35%qrU;)fClY)n?TJ)px2hs*9=zsy|dtbyLkD z*abFSsjggCqr0Vht<&mLEVoYmHTTHu6<)-_le~3qyQN)B4lDCsb$Q5!{ z{+@h}VzpwM;#)Kp23>Ojp0n&q1P8gK17?KbUE?M-bv-FDppU8#N>?1P@{81@r3 zi!EeJ+1G4)n9+x@MGtewxmFM<$ME}k4`VN*-uR1&xj^*Ik4uQYsV_}XUp7J^EZ;j-a|;a5Y0 z;hDjkZN&z&4BMX_!j534ur@ZAwX-WAMs8+zu>08}h?FPUN^qkc(G-ZOGdUZ#kXy>F;2hirZaZiDn)`+; z0o#>x--B0P=k9V3xLPU5zUDmnX1pKY2K=-W-;?jlt9hR9$H($kK7k*_Pv8Z9DnEn& zjGqr@)lzS)w72V+c9IQxJ%u#%<*bII@4oLT@DYA;Q=W{l>pra{v}uhpkPl*!N+ z>iZcIVeyL%HHIgKeQYsny8_Fng@dJ*^W%f~Mf^to0{qSin@Wn+A&O?oxl9hToB4*h z01@qD^=|Dx?E&o}?Gf#9?MdxvZJa(?uY)tgz?#_s>|xmP=V8YaV|>dMbEVu>&K1Dd z!4}`mAA*&6$OpkG(b3q)s5Y`TV~lZ#akw!N-0)k7+|S^=@-#IwwSqN?FwHmFO*>45 zWUu?f^%7oT@?`lWc?PV*F8O}>QTbW-WG(zfXT&kKy#YW~ehDwjHZv6W9+Rx~*b2feZe?Qrv286So`u=Pt+c3%~>R@>lr= zzNxVvOz5$3lWCXfTQKJ{6BX`S(Wdg&kOys-JLT;`vFSENzT%SNzQPQ6!X z>aAB)gBsq-u1X`EX%mT^|v>Zxj=I$d3&u2KK3UZUx(4bgSdb=CFK zDRgQbt203i7^oYn8=*_qrRv5*#xw! zcbzhCJLT7O?7GEqELH!jq-f-f;6u{V8g6$h7feQpZqK`UId&1)hmeCShN?GdhQR!}BJdLbq#C(;CQT znxfpHyj{4GK8$Gd-NFHmyBukJ3;!*9K`)$+pEf&1m!{#}%~kZWG+fy{oz|q`;m&92 zsi}p&^0AKoHJ?+I5W$k zU$~hNopf1hMqe)M-O3fw?I+{-)-&milM1i5Uh72f-HNBS|D#i8Sr|1W?oZc@$a2fe z+?cwFuAeu_2O6Q=jwh`GJjeS5?Klok@wr2H9*g_==FscM;2XYLdcqj&;+N2-r~s6U zsmnSiS6`A;N=_2rjxL<#_XVOA8w;QNcWg$_K3v$UYXzd048@PS<@wr%*w=H>{u>e} z+}#^S3B|2?QR2XO{7v^LpOB#xwJ6CZ(F8|Wsc@uaFRHY+jS^cA#ea6+&~d^r5K?oL z>`q>!yxZkiTbe8{`}N;8+n_-XrLp3nS-7xA4`Zi9V9TonGH956K2-E}Cw95Rp|G6?(i%%HEu z;)0%LIzJZw)^h`0GZ4>L%%-OeT&DD-)q`s= z_=Cz!t75QOJ%YZ`AFo%3(+krIe^Wak+R_jIu1TPaVsKdKpY+-OSgWd}i#1_W=*vdD zHSBYG#s=)sYY~0bfH(CDq`x!Z@?QFOQw?@mmMbE9Z9g1I>PsWU1OsjtZlxnlU_>6j z2)|2z%i&8AUFjJdeizZVeIJgjRSs)yo8pug_0FMGh&@8qs^D-^WE*|puBLrL@vwfU>EE=tP5%ga8%@1Q#3x!jvA>a?qQ%?# z-}C<_l%lG-fd6NGa86wrCwQFz7ft<@c(ZJX_(dq*5)(xShvKI(M}sGWjOymX?PI_) z;yz(mBa$Rs9;jd$TGrmw0d%EXkSHfn-3L0{h zT0fHXjLR-|T`--T;Y=cL6v$hYM`p^)j)iAz3Y9nPsTlN_FuMV7c0BM}veOC2u%}tY zEl)w%rYy}lnQJyrOmWsRtJpE?x#O4B!YU%s`JSyKS#87QuL<$(U1{=6!%7Go$TfQ= z9zDo&0BBvBo$=3A#tji{B?}6nm zk+KEp8+hcr%n>v08_j$nkeA{6f#}Bu$=IW03M4E z@eXi5+jUD#oUoP9!|&KKY?c*dH}mp{13z{%Sm zX17uHom4fLIIYD$%=V(%-}O{+?AsC$WlM7sDv2&l1nM*lzx|6OKIyUO-TvKDSWfvdiVU%m+ z%Qzu|3{SJq0R!c|C@S?6ft2yWc<8hHSben8DH@$VqtWYsu9OtaF0OaS)ONxoBD8~D zXuS&IZ*8_}Z(%X%akBSRy9oP9v-W2qz%kPxYXP&nF1SRF4ypea8XWFfuR+E?&RxR) zrGe{$&xnX}B77YPx2zz}T(8KFufR#3LYMu_dP`&7BnmmVEy+m7;xMW#vW6VPvdGu) zgrXKYC^1IT6)s*peV7mO#>%0DprJ;d-hhw&A4O=LP9N0F|U` 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 diff --git a/INSTALL/ventoy/vtoyjump64.exe b/INSTALL/ventoy/vtoyjump64.exe index 82a42ae94244735979694f25fd5a2e0933fbb409..95cf823c4d714cf468ea3b878cfd4ad45df91d30 100644 GIT binary patch delta 24800 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 diff --git a/Plugson/src/Web/ventoy_http.c b/Plugson/src/Web/ventoy_http.c index c24096d2..be24e375 100644 --- a/Plugson/src/Web/ventoy_http.c +++ b/Plugson/src/Web/ventoy_http.c @@ -485,9 +485,7 @@ void ventoy_data_default_control(data_control *data) { memset(data, 0, sizeof(data_control)); - data->default_menu_mode = 1; data->filter_dot_underscore = 1; - data->treeview_style = 1; data->max_search_level = -1; data->menu_timeout = 0; diff --git a/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe b/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe index 2ef8e217a685f7fffd0c61f16bc6c9a3c8796856..930dd2908d1ce77e0d6fb9ec54c2b5a3800db8d4 100644 GIT binary patch delta 22244 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 WCE|HRMTBFdOXPa<&@(olx%@wAYl7DR delta 22251 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 p8=?P$v`NlZxyv1tA{|By@injm& diff --git a/vtoyjump/vtoyjump/vtoyjump.c b/vtoyjump/vtoyjump/vtoyjump.c index c2ab0a12..07c5307f 100644 --- a/vtoyjump/vtoyjump/vtoyjump.c +++ b/vtoyjump/vtoyjump/vtoyjump.c @@ -1418,6 +1418,40 @@ End: return Ret; } +static BOOL CheckVentoyDisk(DWORD DiskNum) +{ + DWORD dwSize = 0; + CHAR PhyPath[128]; + UINT8 SectorBuf[512]; + HANDLE Handle; + UINT8 check[8] = { 0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44 }; + + sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskNum); + Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); + if (Handle == INVALID_HANDLE_VALUE) + { + Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError()); + return FALSE; + } + + if (!ReadFile(Handle, SectorBuf, sizeof(SectorBuf), &dwSize, NULL)) + { + Log("ReadFile failed, dwSize:%u error:%u", dwSize, GetLastError()); + CloseHandle(Handle); + return FALSE; + } + + CloseHandle(Handle); + + if (memcmp(SectorBuf + 0x190, check, 8) == 0) + { + return TRUE; + } + + return FALSE; +} + + static int VentoyHook(ventoy_os_param *param) { int i; @@ -1429,6 +1463,7 @@ static int VentoyHook(ventoy_os_param *param) CHAR VtoyLetter; DWORD Drives; DWORD NewDrives; + DWORD VtoyDiskNum; UINT32 DiskSig; UINT32 VtoySig; DISK_EXTENT DiskExtent; @@ -1457,6 +1492,8 @@ static int VentoyHook(ventoy_os_param *param) if (IsFileExist("%s", IsoPath)) { Log("File exist under %C:", Letter); + memset(UUID, 0, sizeof(UUID)); + memset(&DiskExtent, 0, sizeof(DiskExtent)); if (GetPhyDiskUUID(Letter, UUID, NULL, &DiskExtent) == 0) { if (memcmp(UUID, param->vtoy_disk_guid, 16) == 0) @@ -1510,6 +1547,9 @@ static int VentoyHook(ventoy_os_param *param) { if (Drives & 0x01) { + memset(UUID, 0, sizeof(UUID)); + memset(&VtoyDiskExtent, 0, sizeof(VtoyDiskExtent)); + DiskSig = 0; if (GetPhyDiskUUID(VtoyLetter, UUID, &DiskSig, &VtoyDiskExtent) == 0) { Log("DiskSig=%08X PartStart=%lld", DiskSig, VtoyDiskExtent.StartingOffset.QuadPart); @@ -1543,11 +1583,25 @@ static int VentoyHook(ventoy_os_param *param) Log("Failed to find ventoy disk"); return 1; } + + VtoyDiskNum = VtoyDiskExtent.DiskNumber; } else { VtoyLetter = Letter; Log("No vlnk mode %C", Letter); + + VtoyDiskNum = DiskExtent.DiskNumber; + } + + if (CheckVentoyDisk(VtoyDiskNum)) + { + Log("Disk check OK %C: %u", VtoyLetter, VtoyDiskNum); + } + else + { + Log("Failed to check ventoy disk %u", VtoyDiskNum); + return 1; } Drives = GetLogicalDrives(); @@ -1588,7 +1642,7 @@ static int VentoyHook(ventoy_os_param *param) } // for protect - rc = DeleteVentoyPart2MountPoint(VtoyDiskExtent.DiskNumber); + rc = DeleteVentoyPart2MountPoint(VtoyDiskNum); Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED"); if (g_windows_data.auto_install_script[0]) @@ -1615,7 +1669,7 @@ static int VentoyHook(ventoy_os_param *param) if (IsFileExist("%s", IsoPath)) { Log("decompress injection archive %s...", IsoPath); - DecompressInjectionArchive(IsoPath, VtoyDiskExtent.DiskNumber); + DecompressInjectionArchive(IsoPath, VtoyDiskNum); if (IsFileExist("%s", AUTO_RUN_BAT)) { diff --git a/vtoyjump/vtoyjump/vtoyjump.h b/vtoyjump/vtoyjump/vtoyjump.h index ef0d2153..3a8fcb61 100644 --- a/vtoyjump/vtoyjump/vtoyjump.h +++ b/vtoyjump/vtoyjump/vtoyjump.h @@ -62,7 +62,9 @@ typedef struct ventoy_os_param UINT64 vtoy_reserved[4]; // Internal use by ventoy - UINT8 reserved[31]; + UINT8 vtoy_disk_signature[4]; + + UINT8 reserved[27]; }ventoy_os_param; typedef struct ventoy_windows_data