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:
2026-06-30 19:53:23 +03:00
parent 10fffdaf78
commit 2750e0bf78
2 changed files with 2594 additions and 226 deletions
+2462 -129
View File
File diff suppressed because it is too large Load Diff
+132 -97
View File
@@ -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 },