mirror of https://github.com/ventoy/Ventoy.git
1.0.29 release
This commit is contained in:
parent
8c192a1807
commit
d8fbd79dda
|
@ -0,0 +1,353 @@
|
|||
/* search.c - search devices based on a file or a filesystem label */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2005,2007,2008,2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB 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.
|
||||
*
|
||||
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/device.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/search.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/partition.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static int g_no_vtoyefi_part = 0;
|
||||
static char g_vtoyefi_dosname[64];
|
||||
static char g_vtoyefi_gptname[64];
|
||||
|
||||
struct cache_entry
|
||||
{
|
||||
struct cache_entry *next;
|
||||
char *key;
|
||||
char *value;
|
||||
};
|
||||
|
||||
static struct cache_entry *cache;
|
||||
|
||||
/* Context for FUNC_NAME. */
|
||||
struct search_ctx
|
||||
{
|
||||
const char *key;
|
||||
const char *var;
|
||||
int no_floppy;
|
||||
char **hints;
|
||||
unsigned nhints;
|
||||
int count;
|
||||
int is_cache;
|
||||
};
|
||||
|
||||
/* Helper for FUNC_NAME. */
|
||||
static int
|
||||
iterate_device (const char *name, void *data)
|
||||
{
|
||||
struct search_ctx *ctx = data;
|
||||
int found = 0;
|
||||
|
||||
/* Skip floppy drives when requested. */
|
||||
if (ctx->no_floppy &&
|
||||
name[0] == 'f' && name[1] == 'd' && name[2] >= '0' && name[2] <= '9')
|
||||
return 1;
|
||||
|
||||
if (g_no_vtoyefi_part && (grub_strcmp(name, g_vtoyefi_dosname) == 0 || grub_strcmp(name, g_vtoyefi_gptname) == 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef DO_SEARCH_FS_UUID
|
||||
#define compare_fn grub_strcasecmp
|
||||
#else
|
||||
#define compare_fn grub_strcmp
|
||||
#endif
|
||||
|
||||
#ifdef DO_SEARCH_FILE
|
||||
{
|
||||
char *buf;
|
||||
grub_file_t file;
|
||||
|
||||
buf = grub_xasprintf ("(%s)%s", name, ctx->key);
|
||||
if (! buf)
|
||||
return 1;
|
||||
|
||||
file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
if (file)
|
||||
{
|
||||
found = 1;
|
||||
grub_file_close (file);
|
||||
}
|
||||
grub_free (buf);
|
||||
}
|
||||
#else
|
||||
{
|
||||
/* SEARCH_FS_UUID or SEARCH_LABEL */
|
||||
grub_device_t dev;
|
||||
grub_fs_t fs;
|
||||
char *quid;
|
||||
|
||||
dev = grub_device_open (name);
|
||||
if (dev)
|
||||
{
|
||||
fs = grub_fs_probe (dev);
|
||||
|
||||
#ifdef DO_SEARCH_FS_UUID
|
||||
#define read_fn fs_uuid
|
||||
#else
|
||||
#define read_fn fs_label
|
||||
#endif
|
||||
|
||||
if (fs && fs->read_fn)
|
||||
{
|
||||
fs->read_fn (dev, &quid);
|
||||
|
||||
if (grub_errno == GRUB_ERR_NONE && quid)
|
||||
{
|
||||
if (compare_fn (quid, ctx->key) == 0)
|
||||
found = 1;
|
||||
|
||||
grub_free (quid);
|
||||
}
|
||||
}
|
||||
|
||||
grub_device_close (dev);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!ctx->is_cache && found && ctx->count == 0)
|
||||
{
|
||||
struct cache_entry *cache_ent;
|
||||
cache_ent = grub_malloc (sizeof (*cache_ent));
|
||||
if (cache_ent)
|
||||
{
|
||||
cache_ent->key = grub_strdup (ctx->key);
|
||||
cache_ent->value = grub_strdup (name);
|
||||
if (cache_ent->value && cache_ent->key)
|
||||
{
|
||||
cache_ent->next = cache;
|
||||
cache = cache_ent;
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_free (cache_ent->value);
|
||||
grub_free (cache_ent->key);
|
||||
grub_free (cache_ent);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
if (found)
|
||||
{
|
||||
ctx->count++;
|
||||
if (ctx->var)
|
||||
grub_env_set (ctx->var, name);
|
||||
else
|
||||
grub_printf (" %s", name);
|
||||
}
|
||||
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
return (found && ctx->var);
|
||||
}
|
||||
|
||||
/* Helper for FUNC_NAME. */
|
||||
static int
|
||||
part_hook (grub_disk_t disk, const grub_partition_t partition, void *data)
|
||||
{
|
||||
struct search_ctx *ctx = data;
|
||||
char *partition_name, *devname;
|
||||
int ret;
|
||||
|
||||
partition_name = grub_partition_get_name (partition);
|
||||
if (! partition_name)
|
||||
return 1;
|
||||
|
||||
devname = grub_xasprintf ("%s,%s", disk->name, partition_name);
|
||||
grub_free (partition_name);
|
||||
if (!devname)
|
||||
return 1;
|
||||
ret = iterate_device (devname, ctx);
|
||||
grub_free (devname);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Helper for FUNC_NAME. */
|
||||
static void
|
||||
try (struct search_ctx *ctx)
|
||||
{
|
||||
unsigned i;
|
||||
struct cache_entry **prev;
|
||||
struct cache_entry *cache_ent;
|
||||
|
||||
for (prev = &cache, cache_ent = *prev; cache_ent;
|
||||
prev = &cache_ent->next, cache_ent = *prev)
|
||||
if (compare_fn (cache_ent->key, ctx->key) == 0)
|
||||
break;
|
||||
if (cache_ent)
|
||||
{
|
||||
ctx->is_cache = 1;
|
||||
if (iterate_device (cache_ent->value, ctx))
|
||||
{
|
||||
ctx->is_cache = 0;
|
||||
return;
|
||||
}
|
||||
ctx->is_cache = 0;
|
||||
/* Cache entry was outdated. Remove it. */
|
||||
if (!ctx->count)
|
||||
{
|
||||
*prev = cache_ent->next;
|
||||
grub_free (cache_ent->key);
|
||||
grub_free (cache_ent->value);
|
||||
grub_free (cache_ent);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ctx->nhints; i++)
|
||||
{
|
||||
char *end;
|
||||
if (!ctx->hints[i][0])
|
||||
continue;
|
||||
end = ctx->hints[i] + grub_strlen (ctx->hints[i]) - 1;
|
||||
if (*end == ',')
|
||||
*end = 0;
|
||||
if (iterate_device (ctx->hints[i], ctx))
|
||||
{
|
||||
if (!*end)
|
||||
*end = ',';
|
||||
return;
|
||||
}
|
||||
if (!*end)
|
||||
{
|
||||
grub_device_t dev;
|
||||
int ret;
|
||||
dev = grub_device_open (ctx->hints[i]);
|
||||
if (!dev)
|
||||
{
|
||||
if (!*end)
|
||||
*end = ',';
|
||||
continue;
|
||||
}
|
||||
if (!dev->disk)
|
||||
{
|
||||
grub_device_close (dev);
|
||||
if (!*end)
|
||||
*end = ',';
|
||||
continue;
|
||||
}
|
||||
ret = grub_partition_iterate (dev->disk, part_hook, ctx);
|
||||
if (!*end)
|
||||
*end = ',';
|
||||
grub_device_close (dev);
|
||||
if (ret)
|
||||
return;
|
||||
}
|
||||
}
|
||||
grub_device_iterate (iterate_device, ctx);
|
||||
}
|
||||
|
||||
void
|
||||
FUNC_NAME (const char *key, const char *var, int no_floppy,
|
||||
char **hints, unsigned nhints)
|
||||
{
|
||||
struct search_ctx ctx = {
|
||||
.key = key,
|
||||
.var = var,
|
||||
.no_floppy = no_floppy,
|
||||
.hints = hints,
|
||||
.nhints = nhints,
|
||||
.count = 0,
|
||||
.is_cache = 0
|
||||
};
|
||||
grub_fs_autoload_hook_t saved_autoload;
|
||||
|
||||
g_no_vtoyefi_part = 0;
|
||||
if (grub_env_get("VTOY_SEARCH_NO_VTOYEFI"))
|
||||
{
|
||||
grub_snprintf(g_vtoyefi_dosname, sizeof(g_vtoyefi_dosname), "%s,msdos2", grub_env_get("vtoydev"));
|
||||
grub_snprintf(g_vtoyefi_gptname, sizeof(g_vtoyefi_gptname), "%s,gpt2", grub_env_get("vtoydev"));
|
||||
g_no_vtoyefi_part = 1;
|
||||
}
|
||||
|
||||
/* First try without autoloading if we're setting variable. */
|
||||
if (var)
|
||||
{
|
||||
saved_autoload = grub_fs_autoload_hook;
|
||||
grub_fs_autoload_hook = 0;
|
||||
try (&ctx);
|
||||
|
||||
/* Restore autoload hook. */
|
||||
grub_fs_autoload_hook = saved_autoload;
|
||||
|
||||
/* Retry with autoload if nothing found. */
|
||||
if (grub_errno == GRUB_ERR_NONE && ctx.count == 0)
|
||||
try (&ctx);
|
||||
}
|
||||
else
|
||||
try (&ctx);
|
||||
|
||||
if (grub_errno == GRUB_ERR_NONE && ctx.count == 0)
|
||||
grub_error (GRUB_ERR_FILE_NOT_FOUND, "no such device: %s", key);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_do_search (grub_command_t cmd __attribute__ ((unused)), int argc,
|
||||
char **args)
|
||||
{
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
|
||||
FUNC_NAME (args[0], argc == 1 ? 0 : args[1], 0, (args + 2),
|
||||
argc > 2 ? argc - 2 : 0);
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_command_t cmd;
|
||||
|
||||
#ifdef DO_SEARCH_FILE
|
||||
GRUB_MOD_INIT(search_fs_file)
|
||||
#elif defined (DO_SEARCH_FS_UUID)
|
||||
GRUB_MOD_INIT(search_fs_uuid)
|
||||
#else
|
||||
GRUB_MOD_INIT(search_label)
|
||||
#endif
|
||||
{
|
||||
cmd =
|
||||
grub_register_command (COMMAND_NAME, grub_cmd_do_search,
|
||||
N_("NAME [VARIABLE] [HINTS]"),
|
||||
HELP_MESSAGE);
|
||||
}
|
||||
|
||||
#ifdef DO_SEARCH_FILE
|
||||
GRUB_MOD_FINI(search_fs_file)
|
||||
#elif defined (DO_SEARCH_FS_UUID)
|
||||
GRUB_MOD_FINI(search_fs_uuid)
|
||||
#else
|
||||
GRUB_MOD_FINI(search_label)
|
||||
#endif
|
||||
{
|
||||
grub_unregister_command (cmd);
|
||||
}
|
|
@ -1111,26 +1111,13 @@ void ventoy_swap_img(img_info *img1, img_info *img2)
|
|||
|
||||
static int ventoy_img_name_valid(const char *filename, grub_size_t namelen)
|
||||
{
|
||||
grub_size_t i;
|
||||
(void)namelen;
|
||||
|
||||
if (g_filt_dot_underscore_file && filename[0] == '.' && filename[1] == '_')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < namelen; i++)
|
||||
{
|
||||
if (filename[i] == ' ' || filename[i] == '\t')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((grub_uint8_t)(filename[i]) >= 127)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1150,7 +1137,7 @@ static int ventoy_check_ignore_flag(const char *filename, const struct grub_dirh
|
|||
|
||||
static int ventoy_colect_img_files(const char *filename, const struct grub_dirhook_info *info, void *data)
|
||||
{
|
||||
int i = 0;
|
||||
//int i = 0;
|
||||
int type = 0;
|
||||
int ignore = 0;
|
||||
int index = 0;
|
||||
|
@ -1297,15 +1284,6 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
|
|||
img->plugin_list_index = index;
|
||||
grub_snprintf(img->name, sizeof(img->name), "%s", filename);
|
||||
|
||||
for (i = 0; i < (int)len; i++)
|
||||
{
|
||||
if (filename[i] == ' ' || filename[i] == '\t' || (0 == grub_isprint(filename[i])))
|
||||
{
|
||||
img->name[i] = '*';
|
||||
img->unsupport = 1;
|
||||
}
|
||||
}
|
||||
|
||||
img->pathlen = grub_snprintf(img->path, sizeof(img->path), "%s%s", node->dir, img->name);
|
||||
|
||||
img->size = info->size;
|
||||
|
@ -4001,6 +3979,7 @@ static cmd_para ventoy_cmds[] =
|
|||
{ "vt_windows_locate_wim_patch", ventoy_cmd_locate_wim_patch, 0, NULL, "", "", NULL },
|
||||
{ "vt_windows_count_wim_patch", ventoy_cmd_wim_patch_count, 0, NULL, "", "", NULL },
|
||||
{ "vt_dump_wim_patch", ventoy_cmd_dump_wim_patch, 0, NULL, "", "", NULL },
|
||||
{ "vt_wim_check_bootable", ventoy_cmd_wim_check_bootable, 0, NULL, "", "", NULL },
|
||||
{ "vt_wim_chain_data", ventoy_cmd_wim_chain_data, 0, NULL, "", "", NULL },
|
||||
|
||||
{ "vt_add_replace_file", ventoy_cmd_add_replace_file, 0, NULL, "", "", NULL },
|
||||
|
|
|
@ -508,6 +508,7 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
|
|||
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
|
||||
VTOY_JSON *vtoy_json_find_item
|
||||
|
@ -731,6 +732,24 @@ typedef struct install_template
|
|||
struct install_template *next;
|
||||
}install_template;
|
||||
|
||||
typedef struct dudfile
|
||||
{
|
||||
int size;
|
||||
char *buf;
|
||||
}dudfile;
|
||||
|
||||
typedef struct dud
|
||||
{
|
||||
int pathlen;
|
||||
char isopath[256];
|
||||
|
||||
int dudnum;
|
||||
file_fullpath *dudpath;
|
||||
dudfile *files;
|
||||
|
||||
struct dud *next;
|
||||
}dud;
|
||||
|
||||
typedef struct persistence_config
|
||||
{
|
||||
int pathlen;
|
||||
|
@ -855,6 +874,8 @@ 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);
|
||||
dud * ventoy_plugin_find_dud(const char *iso);
|
||||
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_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||
void ventoy_plugin_dump_persistence(void);
|
||||
|
|
|
@ -1044,11 +1044,15 @@ grub_err_t ventoy_cmd_cpio_busybox_64(grub_extcmd_context_t ctxt, int argc, char
|
|||
|
||||
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i;
|
||||
int rc;
|
||||
char *pos = NULL;
|
||||
char *template_file = NULL;
|
||||
char *template_buf = NULL;
|
||||
char *persistent_buf = NULL;
|
||||
char *injection_buf = NULL;
|
||||
dud *dudnode = NULL;
|
||||
char tmpname[128];
|
||||
const char *injection_file = NULL;
|
||||
grub_uint8_t *buf = NULL;
|
||||
grub_uint32_t mod;
|
||||
|
@ -1059,6 +1063,7 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||
grub_uint32_t template_size = 0;
|
||||
grub_uint32_t persistent_size = 0;
|
||||
grub_uint32_t injection_size = 0;
|
||||
grub_uint32_t dud_size = 0;
|
||||
grub_file_t file;
|
||||
grub_file_t tmpfile;
|
||||
ventoy_img_chunk_list chunk_list;
|
||||
|
@ -1152,11 +1157,30 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||
debug("injection not configed %s\n", args[1]);
|
||||
}
|
||||
|
||||
g_ventoy_cpio_buf = grub_malloc(file->size + 4096 + template_size + persistent_size + injection_size + img_chunk_size);
|
||||
dudnode = ventoy_plugin_find_dud(args[1]);
|
||||
if (dudnode)
|
||||
{
|
||||
debug("dud file: <%d>\n", dudnode->dudnum);
|
||||
ventoy_plugin_load_dud(dudnode, args[2]);
|
||||
for (i = 0; i < dudnode->dudnum; i++)
|
||||
{
|
||||
if (dudnode->files[i].size > 0)
|
||||
{
|
||||
dud_size += dudnode->files[i].size + sizeof(cpio_newc_header);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("dud not configed %s\n", args[1]);
|
||||
}
|
||||
|
||||
g_ventoy_cpio_buf = grub_malloc(file->size + 40960 + template_size +
|
||||
persistent_size + injection_size + dud_size + img_chunk_size);
|
||||
if (NULL == g_ventoy_cpio_buf)
|
||||
{
|
||||
grub_file_close(file);
|
||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't alloc memory %llu\n", file->size + 4096 + img_chunk_size);
|
||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't alloc memory %llu\n", file->size);
|
||||
}
|
||||
|
||||
grub_file_read(file, g_ventoy_cpio_buf, file->size);
|
||||
|
@ -1198,6 +1222,18 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||
injection_buf = NULL;
|
||||
}
|
||||
|
||||
if (dud_size > 0)
|
||||
{
|
||||
for (i = 0; i < dudnode->dudnum; i++)
|
||||
{
|
||||
pos = grub_strrchr(dudnode->dudpath[i].path, '.');
|
||||
grub_snprintf(tmpname, sizeof(tmpname), "ventoy/ventoy_dud%d%s", i, (pos ? pos : ".iso"));
|
||||
dud_size = dudnode->files[i].size;
|
||||
headlen = ventoy_cpio_newc_fill_head(buf, dud_size, dudnode->files[i].buf, tmpname);
|
||||
buf += headlen + ventoy_align(dud_size, 4);
|
||||
}
|
||||
}
|
||||
|
||||
/* step2: insert os param to cpio */
|
||||
headlen = ventoy_cpio_newc_fill_head(buf, 0, NULL, "ventoy/ventoy_os_param");
|
||||
padlen = sizeof(ventoy_os_param);
|
||||
|
|
|
@ -41,6 +41,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
|||
|
||||
static char g_iso_disk_name[128];
|
||||
static install_template *g_install_template_head = NULL;
|
||||
static dud *g_dud_head = NULL;
|
||||
static persistence_config *g_persistence_head = NULL;
|
||||
static menu_alias *g_menu_alias_head = NULL;
|
||||
static menu_class *g_menu_class_head = NULL;
|
||||
|
@ -590,6 +591,110 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_dud_check(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
int pathnum = 0;
|
||||
const char *iso = NULL;
|
||||
VTOY_JSON *pNode = NULL;
|
||||
|
||||
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||
{
|
||||
grub_printf("Not array type %d\n", json->enDataType);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||
{
|
||||
if (pNode->enDataType != JSON_TYPE_OBJECT)
|
||||
{
|
||||
grub_printf("NOT object type\n");
|
||||
}
|
||||
|
||||
iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
||||
if (iso)
|
||||
{
|
||||
if (0 == ventoy_plugin_check_path(isodisk, iso))
|
||||
{
|
||||
grub_printf("image: %s [OK]\n", iso);
|
||||
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "dud", &pathnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("image: %s [FAIL]\n", iso);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("image not found\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_dud_entry(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
int pathnum = 0;
|
||||
const char *iso = NULL;
|
||||
VTOY_JSON *pNode = NULL;
|
||||
dud *node = NULL;
|
||||
dud *next = NULL;
|
||||
file_fullpath *dudpath = NULL;
|
||||
|
||||
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||
{
|
||||
debug("Not array %d\n", json->enDataType);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (g_dud_head)
|
||||
{
|
||||
for (node = g_dud_head; node; node = next)
|
||||
{
|
||||
next = node->next;
|
||||
grub_check_free(node->dudpath);
|
||||
grub_free(node);
|
||||
}
|
||||
|
||||
g_dud_head = NULL;
|
||||
}
|
||||
|
||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||
{
|
||||
iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
||||
if (iso && iso[0] == '/')
|
||||
{
|
||||
if (0 == ventoy_plugin_parse_fullpath(pNode->pstChild, isodisk, "dud", &dudpath, &pathnum))
|
||||
{
|
||||
node = grub_zalloc(sizeof(dud));
|
||||
if (node)
|
||||
{
|
||||
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", iso);
|
||||
node->dudpath = dudpath;
|
||||
node->dudnum = pathnum;
|
||||
node->files = grub_zalloc(sizeof(dudfile) * pathnum);
|
||||
|
||||
if (node->files)
|
||||
{
|
||||
if (g_dud_head)
|
||||
{
|
||||
node->next = g_dud_head;
|
||||
}
|
||||
|
||||
g_dud_head = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_free(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
|
||||
{
|
||||
int autosel = 0;
|
||||
|
@ -1333,6 +1438,7 @@ static plugin_entry g_plugin_entries[] =
|
|||
{ "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 },
|
||||
{ "dud", ventoy_plugin_dud_entry, ventoy_plugin_dud_check },
|
||||
};
|
||||
|
||||
static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
|
||||
|
@ -1761,6 +1867,59 @@ conf_replace * ventoy_plugin_find_conf_replace(const char *iso)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
dud * ventoy_plugin_find_dud(const char *iso)
|
||||
{
|
||||
int len;
|
||||
dud *node;
|
||||
|
||||
if (!g_dud_head)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = (int)grub_strlen(iso);
|
||||
for (node = g_dud_head; node; node = node->next)
|
||||
{
|
||||
if (node->pathlen == len && grub_strncmp(iso, node->isopath, len) == 0)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int ventoy_plugin_load_dud(dud *node, const char *isopart)
|
||||
{
|
||||
int i;
|
||||
char *buf;
|
||||
grub_file_t file;
|
||||
|
||||
for (i = 0; i < node->dudnum; i++)
|
||||
{
|
||||
if (node->files[i].size > 0)
|
||||
{
|
||||
debug("file %d has been loaded\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", isopart, node->dudpath[i].path);
|
||||
if (file)
|
||||
{
|
||||
buf = grub_malloc(file->size);
|
||||
if (buf)
|
||||
{
|
||||
grub_file_read(file, buf, file->size);
|
||||
node->files[i].size = (int)file->size;
|
||||
node->files[i].buf = buf;
|
||||
}
|
||||
grub_file_close(file);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i = 0;
|
||||
|
@ -1782,6 +1941,7 @@ grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, ch
|
|||
if (!file)
|
||||
{
|
||||
grub_printf("Plugin json file /ventoy/ventoy.json does NOT exist.\n");
|
||||
grub_printf("Attention: directory name and filename are both case-sensitive.\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
|
|
@ -1542,6 +1542,41 @@ static int ventoy_get_wim_chunklist(const char *filename, ventoy_img_chunk_list
|
|||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_uint32_t boot_index;
|
||||
grub_file_t file = NULL;
|
||||
wim_header *wimhdr = NULL;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
wimhdr = grub_zalloc(sizeof(wim_header));
|
||||
if (!wimhdr)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
|
||||
if (!file)
|
||||
{
|
||||
grub_free(wimhdr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_file_read(file, wimhdr, sizeof(wim_header));
|
||||
grub_file_close(file);
|
||||
boot_index = wimhdr->boot_index;
|
||||
grub_free(wimhdr);
|
||||
|
||||
if (boot_index == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_uint32_t i = 0;
|
||||
|
|
|
@ -42,10 +42,17 @@ fi
|
|||
|
||||
echo "VTKS=$VTKS" >> $VTLOG
|
||||
|
||||
if ls $VTOY_PATH | $GREP -q 'ventoy_dud[0-9]'; then
|
||||
for vtDud in $(ls $VTOY_PATH/ventoy_dud*); do
|
||||
vtInstDD="$vtInstDD inst.dd=file:$vtDud"
|
||||
done
|
||||
fi
|
||||
echo "vtInstDD=$vtInstDD" >> $VTLOG
|
||||
|
||||
if $GREP -q 'root=live' /proc/cmdline; then
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE root=live:/dev/dm-0 $VTKS#" -i /lib/dracut-lib.sh
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE root=live:/dev/dm-0 $VTKS $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
else
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE inst.stage2=hd:/dev/dm-0 $VTKS#" -i /lib/dracut-lib.sh
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE inst.stage2=hd:/dev/dm-0 $VTKS $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
fi
|
||||
|
||||
ventoy_set_inotify_script rhel7/ventoy-inotifyd-hook.sh
|
||||
|
|
|
@ -26,6 +26,32 @@ if [ -f $VTOY_PATH/autoinstall ]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
if $BUSYBOX_PATH/ls $VTOY_PATH | $GREP -q 'ventoy_dud[0-9]'; then
|
||||
if [ -f /linuxrc.config ]; then
|
||||
vtKerVer=$($BUSYBOX_PATH/uname -r)
|
||||
ventoy_check_insmod /modules/loop.ko
|
||||
ventoy_check_insmod /modules/squashfs.ko
|
||||
|
||||
ventoy_check_mount /parts/00_lib /modules
|
||||
ventoy_check_insmod /modules/lib/modules/$vtKerVer/initrd/isofs.ko
|
||||
$BUSYBOX_PATH/umount /modules
|
||||
|
||||
for vtDud in $($BUSYBOX_PATH/ls $VTOY_PATH/ventoy_dud*); do
|
||||
$BUSYBOX_PATH/mkdir -p ${vtDud%.*}_mnt
|
||||
if $BUSYBOX_PATH/mount $vtDud ${vtDud%.*}_mnt > /dev/null 2>&1; then
|
||||
$BUSYBOX_PATH/cp -a ${vtDud%.*}_mnt ${vtDud%.*}_data
|
||||
$BUSYBOX_PATH/umount ${vtDud%.*}_mnt
|
||||
echo "dud: file://${vtDud%.*}_data" >> /linuxrc.config
|
||||
else
|
||||
echo "mount $vtDud failed" >> $VTLOG
|
||||
fi
|
||||
done
|
||||
|
||||
$BUSYBOX_PATH/rmmod isofs >> $VTLOG 2>&1
|
||||
$BUSYBOX_PATH/rmmod squashfs >> $VTLOG 2>&1
|
||||
$BUSYBOX_PATH/rmmod loop >> $VTLOG 2>&1
|
||||
fi
|
||||
fi
|
||||
|
||||
#echo "Exec: /bin/sh $VTOY_PATH/hook/suse/cdrom-hook.sh" >> /info-ventoy
|
||||
#echo "install: hd:/?device=/dev/mapper/ventoy" >> /info-ventoy
|
||||
|
|
|
@ -110,4 +110,14 @@ ventoy_set_loop_inotify_script() {
|
|||
echo $VTOY_PATH/loop/$1 > $VTOY_PATH/inotifyd-loop-script.txt
|
||||
}
|
||||
|
||||
ventoy_check_insmod() {
|
||||
if [ -e $1 ]; then
|
||||
$BUSYBOX_PATH/insmod $1
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_check_mount() {
|
||||
if [ -e $1 ]; then
|
||||
$BUSYBOX_PATH/mount $1 $2
|
||||
fi
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -94,6 +94,15 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||
unset pager
|
||||
}
|
||||
|
||||
menuentry 'Check dud plugin configuration' --class=debug_dud {
|
||||
set pager=1
|
||||
vt_check_plugin_json $vt_plugin_path dud $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 ...'
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ function ventoy_gui_console {
|
|||
|
||||
function ventoy_acpi_param {
|
||||
if [ "$VTOY_PARAM_NO_ACPI" != "1" ]; then
|
||||
vt_acpi_param $1 $2
|
||||
vt_acpi_param "$1" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -283,7 +283,7 @@ function distro_specify_initrd_file_phase2 {
|
|||
|
||||
function ventoy_get_ghostbsd_ver {
|
||||
|
||||
# vt_parse_iso_create_date $1/${chosen_path} vt_create_date
|
||||
# vt_parse_iso_create_date "$1/${chosen_path}" vt_create_date
|
||||
# if regexp "^202005" "$vt_create_date"; then
|
||||
# set vt_freebsd_ver=12.x
|
||||
# fi
|
||||
|
@ -322,11 +322,11 @@ function ventoy_freebsd_proc {
|
|||
set vtFreeBsdDistro=FreeBSD
|
||||
|
||||
if vt_strstr "$vt_volume_id" "GHOSTBSD"; then
|
||||
ventoy_get_ghostbsd_ver $1 ${chosen_path}
|
||||
ventoy_get_ghostbsd_ver "$1" "${chosen_path}"
|
||||
elif vt_strstr "$vt_volume_id" "FREENAS"; then
|
||||
ventoy_get_freenas_ver $1 ${chosen_path}
|
||||
ventoy_get_freenas_ver "$1" "${chosen_path}"
|
||||
elif vt_strstr "$vt_volume_id" "FURYBSD"; then
|
||||
ventoy_get_furybsd_ver $1 ${chosen_path}
|
||||
ventoy_get_furybsd_ver "$1" "${chosen_path}"
|
||||
elif regexp "^13_[0-9]" "$vt_volume_id"; then
|
||||
set vt_freebsd_ver=13.x
|
||||
elif regexp "^12_[0-9]" "$vt_volume_id"; then
|
||||
|
@ -338,7 +338,7 @@ function ventoy_freebsd_proc {
|
|||
elif regexp "^9_[0-9]" "$vt_volume_id"; then
|
||||
set vt_freebsd_ver=9.x
|
||||
elif [ -d (loop)/usr/midnightbsd-dist ]; then
|
||||
ventoy_get_midnightbsd_ver $1 ${chosen_path}
|
||||
ventoy_get_midnightbsd_ver "$1" "${chosen_path}"
|
||||
set vtFreeBsdDistro=MidnightBSD
|
||||
elif [ -e (loop)/bin/freebsd-version ]; then
|
||||
vt_unix_parse_freebsd_ver (loop)/bin/freebsd-version vt_userland_ver
|
||||
|
@ -399,7 +399,7 @@ function ventoy_freebsd_proc {
|
|||
fi
|
||||
|
||||
vt_unix_replace_ko $vt_unix_mod_path (vtunix)/ventoy_unix/$vtFreeBsdDistro/geom_ventoy_ko/$vt_freebsd_ver/$vt_freebsd_bit/geom_ventoy.ko.xz
|
||||
vt_unix_replace_conf FreeBSD ${1}${chosen_path}
|
||||
vt_unix_replace_conf FreeBSD "${1}${chosen_path}"
|
||||
}
|
||||
|
||||
function ventoy_unix_comm_proc {
|
||||
|
@ -409,7 +409,7 @@ function ventoy_unix_comm_proc {
|
|||
loopback vtunix $vtoy_efi_part/ventoy/ventoy_unix.cpio
|
||||
|
||||
if [ "$vt_unix_type" = "FreeBSD" ]; then
|
||||
ventoy_freebsd_proc $1 ${chosen_path}
|
||||
ventoy_freebsd_proc "$1" "${chosen_path}"
|
||||
elif [ "$vt_unix_type" = "NetBSD" ]; then
|
||||
echo "NetBSD not supported"
|
||||
|
||||
|
@ -422,7 +422,7 @@ function ventoy_unix_comm_proc {
|
|||
fi
|
||||
fi
|
||||
|
||||
vt_unix_chain_data ${1}${chosen_path}
|
||||
vt_unix_chain_data "${1}${chosen_path}"
|
||||
ventoy_debug_pause
|
||||
}
|
||||
|
||||
|
@ -435,7 +435,7 @@ function uefi_windows_menu_func {
|
|||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||
loopback -d loop
|
||||
vt_iso9660_nojoliet 1
|
||||
loopback loop $1$2
|
||||
loopback loop "$1$2"
|
||||
fi
|
||||
|
||||
for file in "efi/microsoft/boot/bcd"; do
|
||||
|
@ -451,7 +451,7 @@ function uefi_windows_menu_func {
|
|||
locate_wim
|
||||
fi
|
||||
|
||||
vt_windows_chain_data ${1}${chosen_path}
|
||||
vt_windows_chain_data "${1}${chosen_path}"
|
||||
ventoy_debug_pause
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
|
@ -472,10 +472,10 @@ function uefi_linux_menu_func {
|
|||
if [ "$ventoy_fs_probe" = "udf" ]; then
|
||||
loopback -d loop
|
||||
set ventoy_fs_probe=iso9660
|
||||
loopback loop $1$2
|
||||
loopback loop "$1$2"
|
||||
fi
|
||||
|
||||
vt_load_cpio ${vtoy_path}/ventoy.cpio $2 $1 "busybox=$ventoy_busybox_ver"
|
||||
vt_load_cpio ${vtoy_path}/ventoy.cpio "$2" "$1" "busybox=$ventoy_busybox_ver"
|
||||
|
||||
vt_linux_clear_initrd
|
||||
|
||||
|
@ -561,7 +561,7 @@ function uefi_linux_menu_func {
|
|||
|
||||
fi
|
||||
|
||||
vt_linux_chain_data ${1}${chosen_path}
|
||||
vt_linux_chain_data "${1}${chosen_path}"
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
|
||||
|
@ -575,7 +575,7 @@ function uefi_linux_menu_func {
|
|||
}
|
||||
|
||||
function uefi_unix_menu_func {
|
||||
ventoy_unix_comm_proc $1 ${chosen_path}
|
||||
ventoy_unix_comm_proc $1 "${chosen_path}"
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
|
||||
|
@ -603,18 +603,18 @@ function uefi_iso_menu_func {
|
|||
unset LoadIsoEfiDriver
|
||||
fi
|
||||
|
||||
set chosen_path=$2
|
||||
vt_select_auto_install ${chosen_path}
|
||||
vt_select_persistence ${chosen_path}
|
||||
set chosen_path="$2"
|
||||
vt_select_auto_install "${chosen_path}"
|
||||
vt_select_persistence "${chosen_path}"
|
||||
|
||||
if vt_is_udf ${1}${chosen_path}; then
|
||||
if vt_is_udf "${1}${chosen_path}"; then
|
||||
set ventoy_fs_probe=udf
|
||||
else
|
||||
set ventoy_fs_probe=iso9660
|
||||
vt_iso9660_nojoliet 0
|
||||
fi
|
||||
|
||||
loopback loop ${1}${chosen_path}
|
||||
loopback loop "${1}${chosen_path}"
|
||||
get_os_type (loop)
|
||||
|
||||
if [ -d (loop)/EFI ]; then
|
||||
|
@ -634,19 +634,19 @@ function uefi_iso_menu_func {
|
|||
vt_check_compatible (loop)
|
||||
fi
|
||||
|
||||
vt_img_sector ${1}${chosen_path}
|
||||
vt_img_sector "${1}${chosen_path}"
|
||||
|
||||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||
vt_select_conf_replace ${1} ${chosen_path}
|
||||
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}
|
||||
uefi_windows_menu_func "$1" "${chosen_path}"
|
||||
elif [ "$vtoy_os" = "Unix" ]; then
|
||||
uefi_unix_menu_func $1 ${chosen_path}
|
||||
uefi_unix_menu_func "$1" "${chosen_path}"
|
||||
else
|
||||
uefi_linux_menu_func $1 ${chosen_path}
|
||||
uefi_linux_menu_func "$1" "${chosen_path}"
|
||||
fi
|
||||
|
||||
ventoy_gui_console
|
||||
|
@ -654,7 +654,7 @@ function uefi_iso_menu_func {
|
|||
|
||||
function uefi_iso_memdisk {
|
||||
echo 'Loading ISO file to memory ...'
|
||||
vt_load_img_memdisk ${1}${2} vtoy_iso_buf
|
||||
vt_load_img_memdisk "${1}${2}" vtoy_iso_buf
|
||||
|
||||
ventoy_cli_console
|
||||
chainloader ${vtoy_path}/ventoy_x64.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
|
||||
|
@ -672,7 +672,7 @@ function legacy_windows_menu_func {
|
|||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||
loopback -d loop
|
||||
vt_iso9660_nojoliet 1
|
||||
loopback loop $1$2
|
||||
loopback loop "$1$2"
|
||||
fi
|
||||
|
||||
for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD"; do
|
||||
|
@ -690,7 +690,7 @@ function legacy_windows_menu_func {
|
|||
locate_wim
|
||||
fi
|
||||
|
||||
vt_windows_chain_data ${1}${chosen_path}
|
||||
vt_windows_chain_data "${1}${chosen_path}"
|
||||
ventoy_debug_pause
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
|
@ -709,10 +709,10 @@ function legacy_linux_menu_func {
|
|||
if [ "$ventoy_fs_probe" = "udf" ]; then
|
||||
loopback -d loop
|
||||
set ventoy_fs_probe=iso9660
|
||||
loopback loop $1$2
|
||||
loopback loop "$1$2"
|
||||
fi
|
||||
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio $2 $1 "busybox=$ventoy_busybox_ver"
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "$2" "$1" "busybox=$ventoy_busybox_ver"
|
||||
|
||||
vt_linux_clear_initrd
|
||||
|
||||
|
@ -755,7 +755,7 @@ function legacy_linux_menu_func {
|
|||
locate_initrd
|
||||
fi
|
||||
|
||||
vt_linux_chain_data ${1}${chosen_path}
|
||||
vt_linux_chain_data "${1}${chosen_path}"
|
||||
ventoy_debug_pause
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
|
@ -770,7 +770,7 @@ function legacy_linux_menu_func {
|
|||
|
||||
|
||||
function legacy_unix_menu_func {
|
||||
ventoy_unix_comm_proc $1 ${chosen_path}
|
||||
ventoy_unix_comm_proc $1 "${chosen_path}"
|
||||
|
||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||
#ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
|
||||
|
@ -789,18 +789,19 @@ function legacy_iso_menu_func {
|
|||
loopback -d loop
|
||||
fi
|
||||
|
||||
set chosen_path=$2
|
||||
vt_select_auto_install ${chosen_path}
|
||||
vt_select_persistence ${chosen_path}
|
||||
set chosen_path="$2"
|
||||
|
||||
if vt_is_udf ${1}${chosen_path}; then
|
||||
vt_select_auto_install "${chosen_path}"
|
||||
vt_select_persistence "${chosen_path}"
|
||||
|
||||
if vt_is_udf "${1}${chosen_path}"; then
|
||||
set ventoy_fs_probe=udf
|
||||
else
|
||||
set ventoy_fs_probe=iso9660
|
||||
vt_iso9660_nojoliet 0
|
||||
fi
|
||||
|
||||
loopback loop ${1}${chosen_path}
|
||||
loopback loop "${1}${chosen_path}"
|
||||
|
||||
get_os_type (loop)
|
||||
|
||||
|
@ -813,19 +814,19 @@ function legacy_iso_menu_func {
|
|||
vt_check_compatible (loop)
|
||||
fi
|
||||
|
||||
vt_img_sector ${1}${chosen_path}
|
||||
vt_img_sector "${1}${chosen_path}"
|
||||
|
||||
if [ "$ventoy_fs_probe" = "iso9660" ]; then
|
||||
vt_select_conf_replace ${1} ${chosen_path}
|
||||
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}
|
||||
legacy_windows_menu_func "$1" "${chosen_path}"
|
||||
elif [ "$vtoy_os" = "Unix" ]; then
|
||||
legacy_unix_menu_func $1 ${chosen_path}
|
||||
legacy_unix_menu_func "$1" "${chosen_path}"
|
||||
else
|
||||
legacy_linux_menu_func $1 ${chosen_path}
|
||||
legacy_linux_menu_func "$1" "${chosen_path}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -833,7 +834,7 @@ function legacy_iso_memdisk {
|
|||
|
||||
linux16 $vtoy_path/memdisk iso raw
|
||||
echo "Loading ISO file to memory ..."
|
||||
initrd16 ${1}${2}
|
||||
initrd16 "${1}${2}"
|
||||
boot
|
||||
}
|
||||
|
||||
|
@ -843,11 +844,11 @@ function iso_endless_os_proc {
|
|||
loopback -d loop
|
||||
fi
|
||||
|
||||
loopback loop ${1}${2}
|
||||
vt_img_sector ${1}${2}
|
||||
loopback loop "${1}${2}"
|
||||
vt_img_sector "${1}${2}"
|
||||
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio $2 $1 "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio $1 $2 noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "$2" "$1" "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio "$1" "$2" noinit
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -873,7 +874,7 @@ function ventoy_iso_busybox_ver {
|
|||
|
||||
#special process for deepin-live iso
|
||||
if [ "$vt_chosen_size" = "403701760" ]; then
|
||||
if vt_str_str $vt_chosen_path "/deepin-live"; then
|
||||
if vt_str_str "$vt_chosen_path" "/deepin-live"; then
|
||||
set ventoy_busybox_ver=64
|
||||
fi
|
||||
elif vt_str_begin $vt_volume_id "PHOTON_"; then
|
||||
|
@ -889,28 +890,28 @@ function iso_common_menuentry {
|
|||
unset vt_volume_id
|
||||
|
||||
vt_chosen_img_path vt_chosen_path vt_chosen_size
|
||||
vt_parse_iso_volume ${vtoy_iso_part}${vt_chosen_path} vt_system_id vt_volume_id
|
||||
vt_parse_iso_volume "${vtoy_iso_part}${vt_chosen_path}" vt_system_id vt_volume_id
|
||||
|
||||
ventoy_iso_busybox_ver
|
||||
|
||||
#special process for Endless OS
|
||||
if vt_str_begin $vt_volume_id "Endless-OS"; then
|
||||
iso_endless_os_proc $vtoy_iso_part $vt_chosen_path
|
||||
iso_endless_os_proc $vtoy_iso_part "$vt_chosen_path"
|
||||
elif vt_str_begin $vt_volume_id "TENS-Public"; then
|
||||
set vtcompat=1
|
||||
fi
|
||||
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
if vt_check_mode 0; then
|
||||
legacy_iso_memdisk $vtoy_iso_part $vt_chosen_path
|
||||
legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
|
||||
else
|
||||
legacy_iso_menu_func $vtoy_iso_part $vt_chosen_path
|
||||
legacy_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
|
||||
fi
|
||||
else
|
||||
if vt_check_mode 0; then
|
||||
uefi_iso_memdisk $vtoy_iso_part $vt_chosen_path
|
||||
uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
|
||||
else
|
||||
uefi_iso_menu_func $vtoy_iso_part $vt_chosen_path
|
||||
uefi_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
@ -923,9 +924,9 @@ function miso_common_menuentry {
|
|||
ventoy_debug_pause
|
||||
|
||||
if [ "$grub_platform" = "pc" ]; then
|
||||
legacy_iso_memdisk $vtoy_iso_part $vt_chosen_path
|
||||
legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
|
||||
else
|
||||
uefi_iso_memdisk $vtoy_iso_part $vt_chosen_path
|
||||
uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -947,7 +948,12 @@ function iso_unsupport_menuentry {
|
|||
|
||||
function wim_common_menuentry {
|
||||
vt_chosen_img_path vt_chosen_path vt_chosen_size
|
||||
vt_wim_chain_data ${vtoy_iso_part}${vt_chosen_path}
|
||||
if vt_wim_check_bootable "${vtoy_iso_part}${vt_chosen_path}"; then
|
||||
vt_wim_chain_data "${vtoy_iso_part}${vt_chosen_path}"
|
||||
else
|
||||
echo -e "\n This is NOT a bootable WIM file. \n"
|
||||
echo -e " 这不是一个可启动的 WIM 文件。\n"
|
||||
fi
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -973,7 +979,7 @@ function wim_unsupport_menuentry {
|
|||
function efi_common_menuentry {
|
||||
vt_chosen_img_path vt_chosen_path vt_chosen_size
|
||||
|
||||
vt_concat_efi_iso ${vtoy_iso_part}${vt_chosen_path} vtoy_iso_buf
|
||||
vt_concat_efi_iso "${vtoy_iso_part}${vt_chosen_path}" vtoy_iso_buf
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -985,7 +991,7 @@ function efi_common_menuentry {
|
|||
|
||||
if [ -n "$vtoy_dotefi_retry" ]; then
|
||||
unset vtoy_dotefi_retry
|
||||
chainloader ${vtoy_iso_part}${vt_chosen_path}
|
||||
chainloader "${vtoy_iso_part}${vt_chosen_path}"
|
||||
boot
|
||||
fi
|
||||
|
||||
|
@ -1009,7 +1015,7 @@ function vhd_common_menuentry {
|
|||
fi
|
||||
|
||||
vt_chosen_img_path vt_chosen_path vt_chosen_size
|
||||
vt_patch_vhdboot $vt_chosen_path
|
||||
vt_patch_vhdboot "$vt_chosen_path"
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -1038,7 +1044,7 @@ function vtoyboot_common_func {
|
|||
set AltBootPart=0
|
||||
set vtoysupport=0
|
||||
|
||||
vt_get_vtoy_type ${1} vtoytype parttype AltBootPart
|
||||
vt_get_vtoy_type "${1}" vtoytype parttype AltBootPart
|
||||
|
||||
if vt_str_begin $vtoytype vhd; then
|
||||
set vtoysupport=1
|
||||
|
@ -1063,8 +1069,8 @@ function vtoyboot_common_func {
|
|||
fi
|
||||
fi
|
||||
|
||||
vt_img_sector ${1}
|
||||
vt_raw_chain_data ${1}
|
||||
vt_img_sector "${1}"
|
||||
vt_raw_chain_data "${1}"
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -1092,7 +1098,7 @@ function vtoyboot_common_func {
|
|||
|
||||
function vtoy_common_menuentry {
|
||||
vt_chosen_img_path vt_chosen_path vt_chosen_size
|
||||
vtoyboot_common_func ${vtoy_iso_part}${vt_chosen_path}
|
||||
vtoyboot_common_func "${vtoy_iso_part}${vt_chosen_path}"
|
||||
}
|
||||
|
||||
function vtoy_unsupport_menuentry {
|
||||
|
@ -1107,8 +1113,8 @@ function vtoy_unsupport_menuentry {
|
|||
|
||||
|
||||
function ventoy_img_easyos {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
loopback easysfs (vtimghd,1)/easy.sfs
|
||||
vt_get_lib_module_ver (easysfs) /lib/modules/ vt_module_ver
|
||||
|
@ -1133,8 +1139,8 @@ function ventoy_img_easyos {
|
|||
}
|
||||
|
||||
function ventoy_img_volumio {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -1151,8 +1157,8 @@ function ventoy_img_volumio {
|
|||
function ventoy_img_openelec {
|
||||
elec_ver=$1
|
||||
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
loopback vtloopex $vtoy_efi_part/ventoy/vtloopex.cpio
|
||||
vt_img_extra_initrd_append (vtloopex)/$elec_ver/vtloopex.tar.xz
|
||||
|
@ -1173,8 +1179,8 @@ function ventoy_img_openelec {
|
|||
|
||||
|
||||
function ventoy_img_freedombox {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
vt_get_lib_module_ver (vtimghd,1) /lib/modules/ vt_module_ver
|
||||
if [ -n "$vt_module_ver" ]; then
|
||||
|
@ -1194,8 +1200,8 @@ function ventoy_img_freedombox {
|
|||
}
|
||||
|
||||
function ventoy_img_paldo {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -1216,8 +1222,8 @@ function ventoy_img_paldo {
|
|||
}
|
||||
|
||||
function ventoy_img_ubos {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
vt_get_lib_module_ver (vtimghd,3) /lib/modules/ vt_module_ver
|
||||
if [ -n "$vt_module_ver" ]; then
|
||||
|
@ -1240,8 +1246,8 @@ function ventoy_img_ubos {
|
|||
}
|
||||
|
||||
function ventoy_img_recalbox {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -1257,8 +1263,8 @@ function ventoy_img_recalbox {
|
|||
}
|
||||
|
||||
function ventoy_img_batocera {
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio ${vt_chosen_path} ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} ${vt_chosen_path} noinit
|
||||
vt_load_cpio $vtoy_path/ventoy.cpio "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
|
||||
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
|
||||
|
||||
ventoy_debug_pause
|
||||
|
||||
|
@ -1295,8 +1301,8 @@ function img_common_menuentry {
|
|||
loopback -d vtimghd
|
||||
fi
|
||||
|
||||
loopback vtimghd ${vtoy_iso_part}${vt_chosen_path}
|
||||
vt_img_sector ${vtoy_iso_part}${vt_chosen_path}
|
||||
loopback vtimghd "${vtoy_iso_part}${vt_chosen_path}"
|
||||
vt_img_sector "${vtoy_iso_part}${vt_chosen_path}"
|
||||
|
||||
vt_img_part_info (vtimghd)
|
||||
|
||||
|
@ -1340,7 +1346,7 @@ function img_common_menuentry {
|
|||
ventoy_img_memtest86
|
||||
fi
|
||||
else
|
||||
vt_linux_chain_data ${vtoy_iso_part}${vt_chosen_path}
|
||||
vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}"
|
||||
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}
|
||||
|
@ -1369,7 +1375,7 @@ function img_unsupport_menuentry {
|
|||
#############################################################
|
||||
#############################################################
|
||||
|
||||
set VENTOY_VERSION="1.0.28"
|
||||
set VENTOY_VERSION="1.0.29"
|
||||
|
||||
#ACPI not compatible with Window7/8, so disable by default
|
||||
set VTOY_PARAM_NO_ACPI=1
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -93,11 +93,14 @@ else
|
|||
}
|
||||
|
||||
menuentry 'Search and boot BOOTX64.EFI' --class=boot_uefi {
|
||||
set VTOY_SEARCH_NO_VTOYEFI=1
|
||||
if search -n -s -f /efi/boot/bootx64.efi; then
|
||||
unset VTOY_SEARCH_NO_VTOYEFI
|
||||
terminal_output console
|
||||
chainloader /efi/boot/bootx64.efi
|
||||
boot
|
||||
else
|
||||
unset VTOY_SEARCH_NO_VTOYEFI
|
||||
echo "BOOTX64.EFI NOT found ..."
|
||||
fi
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -9,6 +9,7 @@ print_usage() {
|
|||
echo ' -i install ventoy to sdX (fail if disk already installed with ventoy)'
|
||||
echo ' -I force install ventoy to sdX (no matter installed or not)'
|
||||
echo ' -u update ventoy in sdX'
|
||||
echo ' -l list Ventoy information in sdX'
|
||||
echo ''
|
||||
echo ' OPTION: (optional)'
|
||||
echo ' -r SIZE_MB preserve some space at the bottom of the disk (only for install)'
|
||||
|
@ -29,6 +30,8 @@ while [ -n "$1" ]; do
|
|||
FORCE="Y"
|
||||
elif [ "$1" = "-u" ]; then
|
||||
MODE="update"
|
||||
elif [ "$1" = "-l" ]; then
|
||||
MODE="list"
|
||||
elif [ "$1" = "-s" ]; then
|
||||
SECUREBOOT="YES"
|
||||
elif [ "$1" = "-g" ]; then
|
||||
|
@ -42,7 +45,7 @@ while [ -n "$1" ]; do
|
|||
RESERVE_SIZE_MB=$1
|
||||
elif [ "$1" = "-V" ] || [ "$1" = "--version" ]; then
|
||||
exit 0
|
||||
elif [ "$1" == "-h" ] || [ "$1" = "--help" ]; then
|
||||
elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
|
||||
print_usage
|
||||
exit 0
|
||||
else
|
||||
|
@ -76,7 +79,7 @@ if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
if [ -n "$RESERVE_SPACE" ]; then
|
||||
if [ -n "$RESERVE_SPACE" -a "$MODE" = "install" ]; then
|
||||
if echo $RESERVE_SIZE_MB | grep -q '^[0-9][0-9]*$'; then
|
||||
vtdebug "User will reserve $RESERVE_SIZE_MB MB disk space"
|
||||
else
|
||||
|
@ -104,6 +107,36 @@ else
|
|||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$MODE" = "list" ]; then
|
||||
version=$(get_disk_ventoy_version $DISK)
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Ventoy Version in Disk: $version"
|
||||
|
||||
vtPart1Type=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
if [ "$vtPart1Type" = "EE" ]; then
|
||||
echo "Disk Partition Style : GPT"
|
||||
else
|
||||
echo "Disk Partition Style : MBR"
|
||||
fi
|
||||
|
||||
vtPART2=$(get_disk_part_name $DISK 2)
|
||||
rm -rf ./tmpmntp2 && mkdir ./tmpmntp2
|
||||
mount $vtPART2 ./tmpmntp2 > /dev/null 2>&1
|
||||
|
||||
if [ -e ./tmpmntp2/EFI/BOOT/MokManager.efi ]; then
|
||||
echo "Secure Boot Support : YES"
|
||||
else
|
||||
echo "Secure Boot Support : NO"
|
||||
fi
|
||||
umount ./tmpmntp2 > /dev/null 2>&1
|
||||
rm -rf ./tmpmntp2
|
||||
else
|
||||
echo "Ventoy Version: NA"
|
||||
fi
|
||||
echo ""
|
||||
exit 0
|
||||
fi
|
||||
|
||||
#check mountpoint
|
||||
grep "^$DISK" /proc/mounts | while read mtline; do
|
||||
mtpnt=$(echo $mtline | awk '{print $2}')
|
||||
|
@ -345,7 +378,7 @@ else
|
|||
SHORT_PART2=${PART2#/dev/}
|
||||
part2_start=$(cat /sys/class/block/$SHORT_PART2/start)
|
||||
|
||||
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
|
||||
if [ "$PART1_TYPE" = "EE" ]; then
|
||||
vtdebug "This is GPT partition style ..."
|
||||
|
@ -355,8 +388,8 @@ else
|
|||
vtdebug "This is MBR partition style ..."
|
||||
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
|
||||
|
||||
PART1_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=446 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
PART2_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=462 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
PART1_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=446 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
PART2_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=462 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
|
||||
vtdebug "PART1_ACTIVE=$PART1_ACTIVE PART2_ACTIVE=$PART2_ACTIVE"
|
||||
if [ "$PART1_ACTIVE" = "00" ] && [ "$PART2_ACTIVE" = "80" ]; then
|
||||
|
|
|
@ -128,8 +128,8 @@ is_disk_contains_ventoy() {
|
|||
return
|
||||
fi
|
||||
|
||||
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
|
||||
# if [ "$PART1_TYPE" != "EE" ]; then
|
||||
# if [ "$PART2_TYPE" != "EF" ]; then
|
||||
|
@ -139,7 +139,7 @@ is_disk_contains_ventoy() {
|
|||
# fi
|
||||
# fi
|
||||
|
||||
# PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
# PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
|
||||
# if [ "$PART1_TYPE" != "07" ]; then
|
||||
# vtdebug "part1 type is $PART2_TYPE not 07"
|
||||
# ventoy_false
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -287,18 +287,52 @@ End:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int IsUTF8Encode(const char *src)
|
||||
{
|
||||
int i;
|
||||
const UCHAR *Byte = (const UCHAR *)src;
|
||||
|
||||
for (i = 0; i < MAX_PATH && Byte[i]; i++)
|
||||
{
|
||||
if (Byte[i] > 127)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int Utf8ToUtf16(const char* src, WCHAR * dst)
|
||||
{
|
||||
int size = MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, 0);
|
||||
return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, size + 1);
|
||||
}
|
||||
|
||||
static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...)
|
||||
{
|
||||
va_list Arg;
|
||||
HANDLE hFile;
|
||||
DWORD Attr;
|
||||
CHAR FilePath[MAX_PATH];
|
||||
int UTF8 = 0;
|
||||
CHAR FilePathA[MAX_PATH];
|
||||
WCHAR FilePathW[MAX_PATH];
|
||||
|
||||
va_start(Arg, Fmt);
|
||||
vsnprintf_s(FilePath, sizeof(FilePath), sizeof(FilePath), Fmt, Arg);
|
||||
vsnprintf_s(FilePathA, sizeof(FilePathA), sizeof(FilePathA), Fmt, Arg);
|
||||
va_end(Arg);
|
||||
|
||||
hFile = CreateFileA(FilePath, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||
UTF8 = IsUTF8Encode(FilePathA);
|
||||
|
||||
if (UTF8)
|
||||
{
|
||||
Utf8ToUtf16(FilePathA, FilePathW);
|
||||
hFile = CreateFileW(FilePathW, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
hFile = CreateFileA(FilePathA, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||
}
|
||||
if (INVALID_HANDLE_VALUE == hFile)
|
||||
{
|
||||
return FALSE;
|
||||
|
@ -306,7 +340,14 @@ static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...)
|
|||
|
||||
CloseHandle(hFile);
|
||||
|
||||
Attr = GetFileAttributesA(FilePath);
|
||||
if (UTF8)
|
||||
{
|
||||
Attr = GetFileAttributesW(FilePathW);
|
||||
}
|
||||
else
|
||||
{
|
||||
Attr = GetFileAttributesA(FilePathA);
|
||||
}
|
||||
|
||||
if (Dir)
|
||||
{
|
||||
|
@ -395,7 +436,14 @@ int VentoyMountISOByAPI(const char *IsoPath)
|
|||
|
||||
Log("VentoyMountISOByAPI <%s>", IsoPath);
|
||||
|
||||
if (IsUTF8Encode(IsoPath))
|
||||
{
|
||||
MultiByteToWideChar(CP_UTF8, 0, IsoPath, (int)strlen(IsoPath), wFilePath, (int)(sizeof(wFilePath) / sizeof(WCHAR)));
|
||||
}
|
||||
else
|
||||
{
|
||||
MultiByteToWideChar(CP_ACP, 0, IsoPath, (int)strlen(IsoPath), wFilePath, (int)(sizeof(wFilePath) / sizeof(WCHAR)));
|
||||
}
|
||||
|
||||
memset(&StorageType, 0, sizeof(StorageType));
|
||||
memset(&OpenParameters, 0, sizeof(OpenParameters));
|
||||
|
@ -570,6 +618,7 @@ int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
|
|||
DWORD dwBytes;
|
||||
HANDLE hDrive;
|
||||
CHAR PhyPath[MAX_PATH];
|
||||
WCHAR PhyPathW[MAX_PATH];
|
||||
STARTUPINFOA Si;
|
||||
PROCESS_INFORMATION Pi;
|
||||
GET_LENGTH_INFORMATION LengthInfo;
|
||||
|
@ -577,7 +626,16 @@ int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
|
|||
Log("VentoyMountISOByImdisk %s", IsoPath);
|
||||
|
||||
sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", PhyDrive);
|
||||
if (IsUTF8Encode(PhyPath))
|
||||
{
|
||||
Utf8ToUtf16(PhyPath, PhyPathW);
|
||||
hDrive = CreateFileW(PhyPathW, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
hDrive = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
|
||||
}
|
||||
|
||||
if (hDrive == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());
|
||||
|
@ -942,6 +1000,11 @@ static int VentoyHook(ventoy_os_param *param)
|
|||
|
||||
Log("Logical Drives=0x%x Path:<%s>", Drives, param->vtoy_img_path);
|
||||
|
||||
if (IsUTF8Encode(param->vtoy_img_path))
|
||||
{
|
||||
Log("This file is UTF8 encoding\n");
|
||||
}
|
||||
|
||||
while (Drives)
|
||||
{
|
||||
if (Drives & 0x01)
|
||||
|
|
Loading…
Reference in New Issue