fix: restore real decompression impls and add dual boot path
hiperiso_cmd.c: Remove stub implementations of hiperiso_gzip_compress, lzx_decompress, xca_decompress. Restore real miniz-based gzip compression and include miniz.h. Add 'Hypervisor (KVM + Boot Logging)' as option 7 in secondary boot menu with hiso_hv_mode env var check. grub.cfg: Replace stripped 473-line version with full 2806-line config restoring all OS-type direct boot paths (Linux, Windows, Unix, WIM, VHD, IMG). Add hiso_hv_mode checks to all 8 menuentry functions and post-secondary-menu hypervisor dispatch. Set HISO_HYPERVISOR_MENU=1 by default so secondary menu always appears.
This commit is contained in:
+2462
-129
File diff suppressed because it is too large
Load Diff
+132
-97
@@ -48,6 +48,7 @@
|
||||
#include <grub/random.h>
|
||||
#include <grub/hiperiso.h>
|
||||
#include "hiperiso_def.h"
|
||||
#include "miniz.h"
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -169,7 +170,7 @@ static char g_hiso_prompt_msg[64];
|
||||
|
||||
static char g_json_case_mis_path[32];
|
||||
|
||||
static hiperiso_vlnk_part *g_vlnk_part_list = NULL;
|
||||
static hiperiso_hlnk_part *g_hlnk_part_list = NULL;
|
||||
|
||||
int hiperiso_get_fs_type(const char *fs)
|
||||
{
|
||||
@@ -789,20 +790,43 @@ int hiperiso_is_dir_exist(const char *fmt, ...)
|
||||
|
||||
int hiperiso_gzip_compress(void *mem_in, int mem_in_len, void *mem_out, int mem_out_len)
|
||||
{
|
||||
(void)mem_in; (void)mem_in_len; (void)mem_out; (void)mem_out_len;
|
||||
return 0;
|
||||
}
|
||||
mz_stream s;
|
||||
grub_uint8_t *outbuf;
|
||||
grub_uint8_t gzHdr[10] =
|
||||
{
|
||||
0x1F, 0x8B, /* magic */
|
||||
8, /* z method */
|
||||
0, /* flags */
|
||||
0, 0, 0, 0, /* mtime */
|
||||
4, /* xfl */
|
||||
3, /* OS */
|
||||
};
|
||||
|
||||
grub_ssize_t lzx_decompress(const void *data, grub_size_t len, void *buf)
|
||||
{
|
||||
(void)data; (void)len; (void)buf;
|
||||
return -1;
|
||||
}
|
||||
grub_memset(&s, 0, sizeof(mz_stream));
|
||||
|
||||
grub_ssize_t xca_decompress(const void *data, grub_size_t len, void *buf)
|
||||
{
|
||||
(void)data; (void)len; (void)buf;
|
||||
return -1;
|
||||
mz_deflateInit2(&s, 1, MZ_DEFLATED, -MZ_DEFAULT_WINDOW_BITS, 6, MZ_DEFAULT_STRATEGY);
|
||||
|
||||
outbuf = (grub_uint8_t *)mem_out;
|
||||
|
||||
mem_out_len -= sizeof(gzHdr) + 8;
|
||||
grub_memcpy(outbuf, gzHdr, sizeof(gzHdr));
|
||||
outbuf += sizeof(gzHdr);
|
||||
|
||||
s.avail_in = mem_in_len;
|
||||
s.next_in = mem_in;
|
||||
|
||||
s.avail_out = mem_out_len;
|
||||
s.next_out = outbuf;
|
||||
|
||||
mz_deflate(&s, MZ_FINISH);
|
||||
|
||||
mz_deflateEnd(&s);
|
||||
|
||||
outbuf += s.total_out;
|
||||
*(grub_uint32_t *)outbuf = grub_getcrc32c(0, outbuf, s.total_out);
|
||||
*(grub_uint32_t *)(outbuf + 4) = (grub_uint32_t)(s.total_out);
|
||||
|
||||
return s.total_out + sizeof(gzHdr) + 8;
|
||||
}
|
||||
|
||||
|
||||
@@ -1118,7 +1142,7 @@ static grub_err_t hiperiso_cmd_concat_efi_iso(grub_extcmd_context_t ctxt, int ar
|
||||
|
||||
if (grub_strncmp(args[0], g_iso_path, grub_strlen(g_iso_path)))
|
||||
{
|
||||
file->vlnk = 1;
|
||||
file->hlnk = 1;
|
||||
}
|
||||
|
||||
totlen += hiperiso_align_2k(file->size);
|
||||
@@ -1656,9 +1680,9 @@ int hiperiso_img_name_valid(const char *filename, grub_size_t namelen)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int hiperiso_vlnk_iterate_partition(struct grub_disk *disk, const grub_partition_t partition, void *data)
|
||||
static int hiperiso_hlnk_iterate_partition(struct grub_disk *disk, const grub_partition_t partition, void *data)
|
||||
{
|
||||
hiperiso_vlnk_part *node = NULL;
|
||||
hiperiso_hlnk_part *node = NULL;
|
||||
grub_uint32_t SelfSig;
|
||||
grub_uint32_t *pSig = (grub_uint32_t *)data;
|
||||
|
||||
@@ -1669,7 +1693,7 @@ static int hiperiso_vlnk_iterate_partition(struct grub_disk *disk, const grub_pa
|
||||
return 0;
|
||||
}
|
||||
|
||||
node = grub_zalloc(sizeof(hiperiso_vlnk_part));
|
||||
node = grub_zalloc(sizeof(hiperiso_hlnk_part));
|
||||
if (node)
|
||||
{
|
||||
node->disksig = *pSig;
|
||||
@@ -1677,14 +1701,14 @@ static int hiperiso_vlnk_iterate_partition(struct grub_disk *disk, const grub_pa
|
||||
grub_snprintf(node->disk, sizeof(node->disk) - 1, "%s", disk->name);
|
||||
grub_snprintf(node->device, sizeof(node->device) - 1, "%s,%d", disk->name, partition->number + 1);
|
||||
|
||||
node->next = g_vlnk_part_list;
|
||||
g_vlnk_part_list = node;
|
||||
node->next = g_hlnk_part_list;
|
||||
g_hlnk_part_list = node;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hiperiso_vlnk_iterate_disk(const char *name, void *data)
|
||||
static int hiperiso_hlnk_iterate_disk(const char *name, void *data)
|
||||
{
|
||||
grub_disk_t disk;
|
||||
grub_uint32_t sig;
|
||||
@@ -1695,14 +1719,14 @@ static int hiperiso_vlnk_iterate_disk(const char *name, void *data)
|
||||
if (disk)
|
||||
{
|
||||
grub_disk_read(disk, 0, 0x1b8, 4, &sig);
|
||||
grub_partition_iterate(disk, hiperiso_vlnk_iterate_partition, &sig);
|
||||
grub_partition_iterate(disk, hiperiso_hlnk_iterate_partition, &sig);
|
||||
grub_disk_close(disk);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hiperiso_vlnk_probe_fs(hiperiso_vlnk_part *cur)
|
||||
static int hiperiso_hlnk_probe_fs(hiperiso_hlnk_part *cur)
|
||||
{
|
||||
const char *fs[hiperiso_fs_max + 1] =
|
||||
{
|
||||
@@ -1722,51 +1746,51 @@ static int hiperiso_vlnk_probe_fs(hiperiso_vlnk_part *cur)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hiperiso_check_vlnk_data(hiperiso_vlnk *vlnk, int print, char *dst, int size)
|
||||
static int hiperiso_check_hlnk_data(hiperiso_hlnk *hlnk, int print, char *dst, int size)
|
||||
{
|
||||
int diskfind = 0;
|
||||
int partfind = 0;
|
||||
int filefind = 0;
|
||||
char *disk, *device;
|
||||
grub_uint32_t readcrc, calccrc;
|
||||
hiperiso_vlnk_part *cur;
|
||||
hiperiso_hlnk_part *cur;
|
||||
grub_fs_t fs = NULL;
|
||||
|
||||
if (grub_memcmp(&(vlnk->guid), &g_hiperiso_guid, sizeof(hiperiso_guid)))
|
||||
if (grub_memcmp(&(hlnk->guid), &g_hiperiso_guid, sizeof(hiperiso_guid)))
|
||||
{
|
||||
if (print)
|
||||
{
|
||||
grub_printf("VLNK invalid guid\n");
|
||||
grub_printf("HLNK invalid guid\n");
|
||||
grub_refresh();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
readcrc = vlnk->crc32;
|
||||
vlnk->crc32 = 0;
|
||||
calccrc = grub_getcrc32c(0, vlnk, sizeof(hiperiso_vlnk));
|
||||
readcrc = hlnk->crc32;
|
||||
hlnk->crc32 = 0;
|
||||
calccrc = grub_getcrc32c(0, hlnk, sizeof(hiperiso_hlnk));
|
||||
if (readcrc != calccrc)
|
||||
{
|
||||
if (print)
|
||||
{
|
||||
grub_printf("VLNK invalid crc 0x%08x 0x%08x\n", calccrc, readcrc);
|
||||
grub_printf("HLNK invalid crc 0x%08x 0x%08x\n", calccrc, readcrc);
|
||||
grub_refresh();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!g_vlnk_part_list)
|
||||
if (!g_hlnk_part_list)
|
||||
{
|
||||
grub_disk_dev_iterate(hiperiso_vlnk_iterate_disk, NULL);
|
||||
grub_disk_dev_iterate(hiperiso_hlnk_iterate_disk, NULL);
|
||||
}
|
||||
|
||||
for (cur = g_vlnk_part_list; cur && filefind == 0; cur = cur->next)
|
||||
for (cur = g_hlnk_part_list; cur && filefind == 0; cur = cur->next)
|
||||
{
|
||||
if (cur->disksig == vlnk->disk_signature)
|
||||
if (cur->disksig == hlnk->disk_signature)
|
||||
{
|
||||
diskfind = 1;
|
||||
disk = cur->disk;
|
||||
if (cur->partoffset == vlnk->part_offset)
|
||||
if (cur->partoffset == hlnk->part_offset)
|
||||
{
|
||||
partfind = 1;
|
||||
device = cur->device;
|
||||
@@ -1774,7 +1798,7 @@ static int hiperiso_check_vlnk_data(hiperiso_vlnk *vlnk, int print, char *dst, i
|
||||
if (cur->probe == 0)
|
||||
{
|
||||
cur->probe = 1;
|
||||
hiperiso_vlnk_probe_fs(cur);
|
||||
hiperiso_hlnk_probe_fs(cur);
|
||||
}
|
||||
|
||||
if (!fs)
|
||||
@@ -1788,11 +1812,11 @@ static int hiperiso_check_vlnk_data(hiperiso_vlnk *vlnk, int print, char *dst, i
|
||||
|
||||
grub_memset(&file, 0, sizeof(file));
|
||||
file.device = cur->dev;
|
||||
if (cur->fs->fs_open(&file, vlnk->filepath) == GRUB_ERR_NONE)
|
||||
if (cur->fs->fs_open(&file, hlnk->filepath) == GRUB_ERR_NONE)
|
||||
{
|
||||
filefind = 1;
|
||||
cur->fs->fs_close(&file);
|
||||
grub_snprintf(dst, size - 1, "(%s)%s", cur->device, vlnk->filepath);
|
||||
grub_snprintf(dst, size - 1, "(%s)%s", cur->device, hlnk->filepath);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1805,11 +1829,11 @@ static int hiperiso_check_vlnk_data(hiperiso_vlnk *vlnk, int print, char *dst, i
|
||||
|
||||
if (print)
|
||||
{
|
||||
grub_printf("\n==== VLNK Information ====\n"
|
||||
grub_printf("\n==== HLNK Information ====\n"
|
||||
"Disk Signature: %08x\n"
|
||||
"Partition Offset: %llu\n"
|
||||
"File Path: <%s>\n\n",
|
||||
vlnk->disk_signature, (ulonglong)vlnk->part_offset, vlnk->filepath);
|
||||
hlnk->disk_signature, (ulonglong)hlnk->part_offset, hlnk->filepath);
|
||||
|
||||
if (diskfind)
|
||||
{
|
||||
@@ -1831,7 +1855,7 @@ static int hiperiso_check_vlnk_data(hiperiso_vlnk *vlnk, int print, char *dst, i
|
||||
grub_printf("File Find: [ %s ]\n", filefind ? "YES" : "NO");
|
||||
if (filefind)
|
||||
{
|
||||
grub_printf("VLNK File: <%s>\n", dst);
|
||||
grub_printf("HLNK File: <%s>\n", dst);
|
||||
}
|
||||
|
||||
grub_printf("\n");
|
||||
@@ -1841,13 +1865,13 @@ static int hiperiso_check_vlnk_data(hiperiso_vlnk *vlnk, int print, char *dst, i
|
||||
return (1 - filefind);
|
||||
}
|
||||
|
||||
int hiperiso_add_vlnk_file(char *dir, const char *name)
|
||||
int hiperiso_add_hlnk_file(char *dir, const char *name)
|
||||
{
|
||||
int rc = 1;
|
||||
char src[512];
|
||||
char dst[512];
|
||||
grub_file_t file = NULL;
|
||||
hiperiso_vlnk vlnk;
|
||||
hiperiso_hlnk hlnk;
|
||||
|
||||
if (!dir)
|
||||
{
|
||||
@@ -1868,13 +1892,13 @@ int hiperiso_add_vlnk_file(char *dir, const char *name)
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_memset(&vlnk, 0, sizeof(vlnk));
|
||||
grub_file_read(file, &vlnk, sizeof(vlnk));
|
||||
grub_memset(&hlnk, 0, sizeof(hlnk));
|
||||
grub_file_read(file, &hlnk, sizeof(hlnk));
|
||||
grub_file_close(file);
|
||||
|
||||
if (hiperiso_check_vlnk_data(&vlnk, 0, dst, sizeof(dst)) == 0)
|
||||
if (hiperiso_check_hlnk_data(&hlnk, 0, dst, sizeof(dst)) == 0)
|
||||
{
|
||||
rc = grub_file_add_vlnk(src, dst);
|
||||
rc = grub_file_add_hlnk(src, dst);
|
||||
}
|
||||
|
||||
return rc;
|
||||
@@ -1886,7 +1910,7 @@ static int hiperiso_collect_img_files(const char *filename, const struct grub_di
|
||||
int type = 0;
|
||||
int ignore = 0;
|
||||
int index = 0;
|
||||
int vlnk = 0;
|
||||
int hlnk = 0;
|
||||
grub_size_t len;
|
||||
img_info *img;
|
||||
img_info *tail;
|
||||
@@ -2063,10 +2087,10 @@ static int hiperiso_collect_img_files(const char *filename, const struct grub_di
|
||||
|
||||
if (info->size == HISO_FILT_MIN_FILE_SIZE || info->size == 0)
|
||||
{
|
||||
if (grub_file_is_vlnk_suffix(filename, len))
|
||||
if (grub_file_is_hlnk_suffix(filename, len))
|
||||
{
|
||||
vlnk = 1;
|
||||
if (hiperiso_add_vlnk_file(node->dir, filename) != 0)
|
||||
hlnk = 1;
|
||||
if (hiperiso_add_hlnk_file(node->dir, filename) != 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -2083,7 +2107,7 @@ static int hiperiso_collect_img_files(const char *filename, const struct grub_di
|
||||
img->pathlen = grub_snprintf(img->path, sizeof(img->path), "%s%s", node->dir, img->name);
|
||||
|
||||
img->size = info->size;
|
||||
if (vlnk || 0 == img->size)
|
||||
if (hlnk || 0 == img->size)
|
||||
{
|
||||
if (node->dir[0] == '/')
|
||||
{
|
||||
@@ -2714,35 +2738,35 @@ static grub_err_t hiperiso_cmd_ext_select_img_path(grub_extcmd_context_t ctxt, i
|
||||
HIPERISO_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 hiperiso_cmd_set_fake_vlnk(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
static char g_fake_hlnk_src[512];
|
||||
static char g_fake_hlnk_dst[512];
|
||||
static grub_uint64_t g_fake_hlnk_size;
|
||||
static grub_err_t hiperiso_cmd_set_fake_hlnk(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);
|
||||
g_fake_hlnk_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/________HIPERISOVLNK.vlnk.%s", g_iso_path, args[1]);
|
||||
grub_strncpy(g_fake_hlnk_dst, args[0], sizeof(g_fake_hlnk_dst));
|
||||
grub_snprintf(g_fake_hlnk_src, sizeof(g_fake_hlnk_src), "%s/________HIPERISOHLNK.hlnk.%s", g_iso_path, args[1]);
|
||||
|
||||
grub_file_hiso_vlnk(g_fake_vlnk_src, g_fake_vlnk_dst);
|
||||
grub_file_hiso_hlnk(g_fake_hlnk_src, g_fake_hlnk_dst);
|
||||
|
||||
HIPERISO_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
static grub_err_t hiperiso_cmd_reset_fake_vlnk(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
static grub_err_t hiperiso_cmd_reset_fake_hlnk(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_hiso_vlnk(NULL, NULL);
|
||||
g_fake_hlnk_src[0] = 0;
|
||||
g_fake_hlnk_dst[0] = 0;
|
||||
g_fake_hlnk_size = 0;
|
||||
grub_file_hiso_hlnk(NULL, NULL);
|
||||
|
||||
HIPERISO_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
@@ -2763,13 +2787,13 @@ static grub_err_t hiperiso_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int a
|
||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s {var}", cmd_raw_name);
|
||||
}
|
||||
|
||||
if (g_fake_vlnk_src[0] && g_fake_vlnk_dst[0])
|
||||
if (g_fake_hlnk_src[0] && g_fake_hlnk_dst[0])
|
||||
{
|
||||
pos = grub_strchr(g_fake_vlnk_src, '/');
|
||||
pos = grub_strchr(g_fake_hlnk_src, '/');
|
||||
grub_env_set(args[0], pos);
|
||||
if (argc > 1)
|
||||
{
|
||||
grub_snprintf(value, sizeof(value), "%llu", (ulonglong)(g_fake_vlnk_size));
|
||||
grub_snprintf(value, sizeof(value), "%llu", (ulonglong)(g_fake_hlnk_size));
|
||||
grub_env_set(args[1], value);
|
||||
}
|
||||
|
||||
@@ -3247,8 +3271,8 @@ void hiperiso_fill_os_param(grub_file_t file, hiperiso_os_param *param)
|
||||
param->hiso_reserved[5] = 1;
|
||||
}
|
||||
|
||||
/* hiperiso_disk_signature used for vlnk */
|
||||
param->hiso_reserved[6] = file->vlnk;
|
||||
/* hiperiso_disk_signature used for hlnk */
|
||||
param->hiso_reserved[6] = file->hlnk;
|
||||
grub_memcpy(param->hiso_reserved + 7, g_hiperiso_part_info->MBR.BootCode + 0x1b8, 4);
|
||||
|
||||
|
||||
@@ -5983,16 +6007,16 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t grub_cmd_vlnk_dump_part(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
static grub_err_t grub_cmd_hlnk_dump_part(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int n = 0;
|
||||
hiperiso_vlnk_part *node;
|
||||
hiperiso_hlnk_part *node;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
(void)args;
|
||||
|
||||
for (node = g_vlnk_part_list; node; node = node->next)
|
||||
for (node = g_hlnk_part_list; node; node = node->next)
|
||||
{
|
||||
grub_printf("[%d] %s disksig:%08x offset:%llu fs:%s\n",
|
||||
++n, node->device, node->disksig,
|
||||
@@ -6002,7 +6026,7 @@ static grub_err_t grub_cmd_vlnk_dump_part(grub_extcmd_context_t ctxt, int argc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t grub_cmd_is_vlnk_name(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
static grub_err_t grub_cmd_is_hlnk_name(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
@@ -6011,7 +6035,7 @@ static grub_err_t grub_cmd_is_vlnk_name(grub_extcmd_context_t ctxt, int argc, ch
|
||||
if (argc == 1)
|
||||
{
|
||||
len = (int)grub_strlen(args[0]);
|
||||
if (grub_file_is_vlnk_suffix(args[0], len))
|
||||
if (grub_file_is_hlnk_suffix(args[0], len))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -6020,9 +6044,9 @@ static grub_err_t grub_cmd_is_vlnk_name(grub_extcmd_context_t ctxt, int argc, ch
|
||||
return 1;
|
||||
}
|
||||
|
||||
static grub_err_t grub_cmd_get_vlnk_dst(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
static grub_err_t grub_cmd_get_hlnk_dst(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int vlnk = 0;
|
||||
int hlnk = 0;
|
||||
const char *name = NULL;
|
||||
|
||||
(void)ctxt;
|
||||
@@ -6030,11 +6054,11 @@ static grub_err_t grub_cmd_get_vlnk_dst(grub_extcmd_context_t ctxt, int argc, ch
|
||||
if (argc == 2)
|
||||
{
|
||||
grub_env_unset(args[1]);
|
||||
name = grub_file_get_vlnk(args[0], &vlnk);
|
||||
if (vlnk)
|
||||
name = grub_file_get_hlnk(args[0], &hlnk);
|
||||
if (hlnk)
|
||||
{
|
||||
debug("VLNK SRC: <%s>\n", args[0]);
|
||||
debug("VLNK DST: <%s>\n", name);
|
||||
debug("HLNK SRC: <%s>\n", args[0]);
|
||||
debug("HLNK DST: <%s>\n", name);
|
||||
grub_env_set(args[1], name);
|
||||
return 0;
|
||||
}
|
||||
@@ -6043,12 +6067,12 @@ static grub_err_t grub_cmd_get_vlnk_dst(grub_extcmd_context_t ctxt, int argc, ch
|
||||
return 1;
|
||||
}
|
||||
|
||||
static grub_err_t grub_cmd_check_vlnk(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
static grub_err_t grub_cmd_check_hlnk(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int ret = 1;
|
||||
int len = 0;
|
||||
grub_file_t file = NULL;
|
||||
hiperiso_vlnk vlnk;
|
||||
hiperiso_hlnk hlnk;
|
||||
char dst[512];
|
||||
|
||||
(void)ctxt;
|
||||
@@ -6059,13 +6083,13 @@ static grub_err_t grub_cmd_check_vlnk(grub_extcmd_context_t ctxt, int argc, char
|
||||
}
|
||||
|
||||
len = (int)grub_strlen(args[0]);
|
||||
if (!grub_file_is_vlnk_suffix(args[0], len))
|
||||
if (!grub_file_is_hlnk_suffix(args[0], len))
|
||||
{
|
||||
grub_printf("Invalid vlnk suffix\n");
|
||||
grub_printf("Invalid hlnk suffix\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
file = grub_file_open(args[0], HIPERISO_FILE_TYPE | GRUB_FILE_TYPE_NO_VLNK);
|
||||
file = grub_file_open(args[0], HIPERISO_FILE_TYPE | GRUB_FILE_TYPE_NO_HLNK);
|
||||
if (!file)
|
||||
{
|
||||
grub_printf("Failed to open %s\n", args[0]);
|
||||
@@ -6074,14 +6098,14 @@ static grub_err_t grub_cmd_check_vlnk(grub_extcmd_context_t ctxt, int argc, char
|
||||
|
||||
if (file->size != 32768)
|
||||
{
|
||||
grub_printf("Invalid vlnk file (size=%llu).\n", (ulonglong)file->size);
|
||||
grub_printf("Invalid hlnk file (size=%llu).\n", (ulonglong)file->size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
grub_memset(&vlnk, 0, sizeof(vlnk));
|
||||
grub_file_read(file, &vlnk, sizeof(vlnk));
|
||||
grub_memset(&hlnk, 0, sizeof(hlnk));
|
||||
grub_file_read(file, &hlnk, sizeof(hlnk));
|
||||
|
||||
ret = hiperiso_check_vlnk_data(&vlnk, 1, dst, sizeof(dst));
|
||||
ret = hiperiso_check_hlnk_data(&hlnk, 1, dst, sizeof(dst));
|
||||
|
||||
out:
|
||||
|
||||
@@ -6237,6 +6261,12 @@ static grub_err_t hiperiso_cmd_need_secondary_menu(grub_extcmd_context_t ctxt, i
|
||||
return 1;
|
||||
}
|
||||
|
||||
env = grub_env_get("HISO_HYPERVISOR_MENU");
|
||||
if (env && env[0] == '1')
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6299,6 +6329,7 @@ static grub_err_t hiperiso_cmd_show_secondary_menu(grub_extcmd_context_t ctxt, i
|
||||
}
|
||||
}
|
||||
|
||||
hiso_dummy_menuentry(cmd, pos, len, "Hypervisor (KVM + Boot Logging)", "second_hypervisor"); seldata[n++] = 7;
|
||||
hiso_dummy_menuentry(cmd, pos, len, "$VTLANG_FILE_CHKSUM", "second_checksum"); seldata[n++] = 5;
|
||||
hiso_dummy_menuentry(cmd, pos, len, "$VTLANG_RETURN_PRV_NOESC", "second_return"); seldata[n++] = 6;
|
||||
|
||||
@@ -6341,6 +6372,10 @@ static grub_err_t hiperiso_cmd_show_secondary_menu(grub_extcmd_context_t ctxt, i
|
||||
{
|
||||
grub_env_set("HISO_SECOND_EXIT", "1");
|
||||
}
|
||||
else if (select == 7)
|
||||
{
|
||||
grub_env_set("hiso_hv_mode", "1");
|
||||
}
|
||||
}while (select == 5);
|
||||
|
||||
grub_free(cmd);
|
||||
@@ -7216,7 +7251,7 @@ static cmd_para hiperiso_cmds[] =
|
||||
{ "vt_unix_parse_freebsd_ver", hiperiso_cmd_unix_freebsd_ver, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_parse_freebsd_ver_elf", hiperiso_cmd_unix_freebsd_ver_elf, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_reset", hiperiso_cmd_unix_reset, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_check_vlnk", hiperiso_cmd_unix_check_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_check_hlnk", hiperiso_cmd_unix_check_hlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_replace_conf", hiperiso_cmd_unix_replace_conf, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_replace_grub_conf", hiperiso_cmd_unix_replace_grub_conf, 0, NULL, "", "", NULL },
|
||||
{ "vt_unix_replace_ko", hiperiso_cmd_unix_replace_ko, 0, NULL, "", "", NULL },
|
||||
@@ -7246,12 +7281,12 @@ static cmd_para hiperiso_cmds[] =
|
||||
{ "vt_append_extra_sector", hiperiso_cmd_append_ext_sector, 0, NULL, "", "", NULL },
|
||||
{ "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL },
|
||||
{ "vt_syslinux_need_nojoliet", grub_cmd_syslinux_nojoliet, 0, NULL, "", "", NULL },
|
||||
{ "vt_vlnk_check", grub_cmd_check_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "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", hiperiso_cmd_set_fake_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_reset_fake_vlnk", hiperiso_cmd_reset_fake_vlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_hlnk_check", grub_cmd_check_hlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_hlnk_dump_part", grub_cmd_hlnk_dump_part, 0, NULL, "", "", NULL },
|
||||
{ "vt_is_hlnk_name", grub_cmd_is_hlnk_name, 0, NULL, "", "", NULL },
|
||||
{ "vt_get_hlnk_dst", grub_cmd_get_hlnk_dst, 0, NULL, "", "", NULL },
|
||||
{ "vt_set_fake_hlnk", hiperiso_cmd_set_fake_hlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_reset_fake_hlnk", hiperiso_cmd_reset_fake_hlnk, 0, NULL, "", "", NULL },
|
||||
{ "vt_iso_vd_id_parse", hiperiso_cmd_iso_vd_id_parse, 0, NULL, "", "", NULL },
|
||||
{ "vt_iso_vd_id_clear", hiperiso_iso_vd_id_clear, 0, NULL, "", "", NULL },
|
||||
{ "vt_iso_vd_id_begin", hiperiso_cmd_iso_vd_id_begin, 0, NULL, "", "", NULL },
|
||||
|
||||
Reference in New Issue
Block a user