]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
1.0.66 release v1.0.66
authorlongpanda <admin@ventoy.net>
Sun, 13 Feb 2022 09:00:39 +0000 (17:00 +0800)
committerlongpanda <admin@ventoy.net>
Sun, 13 Feb 2022 09:00:39 +0000 (17:00 +0800)
287 files changed:
.github/ISSUE_TEMPLATE/issue_template.yml
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/file.c
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/fs.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_vhd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
GRUB2/MOD_SRC/grub-2.04/include/grub/file.h
GRUB2/MOD_SRC/grub-2.04/include/grub/fs.h
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
IMG/cpio/ventoy/hook/ventoy-hook-lib.sh
IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh
IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh
INSTALL/README
INSTALL/grub/arm64-efi/affs.mod
INSTALL/grub/arm64-efi/afs.mod
INSTALL/grub/arm64-efi/bfs.mod
INSTALL/grub/arm64-efi/btrfs.mod
INSTALL/grub/arm64-efi/cbfs.mod
INSTALL/grub/arm64-efi/cmp.mod
INSTALL/grub/arm64-efi/cpio.mod
INSTALL/grub/arm64-efi/cpio_be.mod
INSTALL/grub/arm64-efi/f2fs.mod
INSTALL/grub/arm64-efi/fdt.mod
INSTALL/grub/arm64-efi/hexdump.mod
INSTALL/grub/arm64-efi/hfs.mod
INSTALL/grub/arm64-efi/jfs.mod
INSTALL/grub/arm64-efi/loadenv.mod
INSTALL/grub/arm64-efi/macho.mod
INSTALL/grub/arm64-efi/minix.mod
INSTALL/grub/arm64-efi/minix2.mod
INSTALL/grub/arm64-efi/minix2_be.mod
INSTALL/grub/arm64-efi/minix3.mod
INSTALL/grub/arm64-efi/minix3_be.mod
INSTALL/grub/arm64-efi/minix_be.mod
INSTALL/grub/arm64-efi/moddep.lst
INSTALL/grub/arm64-efi/nilfs2.mod
INSTALL/grub/arm64-efi/normal.mod
INSTALL/grub/arm64-efi/odc.mod
INSTALL/grub/arm64-efi/offsetio.mod
INSTALL/grub/arm64-efi/pgp.mod
INSTALL/grub/arm64-efi/procfs.mod
INSTALL/grub/arm64-efi/progress.mod
INSTALL/grub/arm64-efi/reiserfs.mod
INSTALL/grub/arm64-efi/romfs.mod
INSTALL/grub/arm64-efi/sfs.mod
INSTALL/grub/arm64-efi/testload.mod
INSTALL/grub/arm64-efi/tga.mod
INSTALL/grub/arm64-efi/ufs1.mod
INSTALL/grub/arm64-efi/ufs1_be.mod
INSTALL/grub/arm64-efi/ufs2.mod
INSTALL/grub/arm64-efi/verifiers.mod
INSTALL/grub/arm64-efi/xen_boot.mod
INSTALL/grub/arm64-efi/zfs.mod
INSTALL/grub/grub.cfg
INSTALL/grub/i386-efi/affs.mod
INSTALL/grub/i386-efi/afs.mod
INSTALL/grub/i386-efi/aout.mod
INSTALL/grub/i386-efi/bfs.mod
INSTALL/grub/i386-efi/bsd.mod
INSTALL/grub/i386-efi/btrfs.mod
INSTALL/grub/i386-efi/cbfs.mod
INSTALL/grub/i386-efi/cmp.mod
INSTALL/grub/i386-efi/cpio.mod
INSTALL/grub/i386-efi/cpio_be.mod
INSTALL/grub/i386-efi/f2fs.mod
INSTALL/grub/i386-efi/hexdump.mod
INSTALL/grub/i386-efi/hfs.mod
INSTALL/grub/i386-efi/jfs.mod
INSTALL/grub/i386-efi/linux16.mod
INSTALL/grub/i386-efi/loadbios.mod
INSTALL/grub/i386-efi/loadenv.mod
INSTALL/grub/i386-efi/macho.mod
INSTALL/grub/i386-efi/minix.mod
INSTALL/grub/i386-efi/minix2.mod
INSTALL/grub/i386-efi/minix2_be.mod
INSTALL/grub/i386-efi/minix3.mod
INSTALL/grub/i386-efi/minix3_be.mod
INSTALL/grub/i386-efi/minix_be.mod
INSTALL/grub/i386-efi/moddep.lst
INSTALL/grub/i386-efi/multiboot.mod
INSTALL/grub/i386-efi/multiboot2.mod
INSTALL/grub/i386-efi/nativedisk.mod
INSTALL/grub/i386-efi/nilfs2.mod
INSTALL/grub/i386-efi/normal.mod
INSTALL/grub/i386-efi/odc.mod
INSTALL/grub/i386-efi/offsetio.mod
INSTALL/grub/i386-efi/pgp.mod
INSTALL/grub/i386-efi/procfs.mod
INSTALL/grub/i386-efi/progress.mod
INSTALL/grub/i386-efi/reiserfs.mod
INSTALL/grub/i386-efi/romfs.mod
INSTALL/grub/i386-efi/sfs.mod
INSTALL/grub/i386-efi/testload.mod
INSTALL/grub/i386-efi/tga.mod
INSTALL/grub/i386-efi/ufs1.mod
INSTALL/grub/i386-efi/ufs1_be.mod
INSTALL/grub/i386-efi/ufs2.mod
INSTALL/grub/i386-efi/verifiers.mod
INSTALL/grub/i386-efi/xnu.mod
INSTALL/grub/i386-efi/zfs.mod
INSTALL/grub/i386-pc/acpi.mod
INSTALL/grub/i386-pc/affs.mod
INSTALL/grub/i386-pc/afs.mod
INSTALL/grub/i386-pc/aout.mod
INSTALL/grub/i386-pc/bfs.mod
INSTALL/grub/i386-pc/bitmap_scale.mod
INSTALL/grub/i386-pc/bsd.mod
INSTALL/grub/i386-pc/btrfs.mod
INSTALL/grub/i386-pc/bufio.mod
INSTALL/grub/i386-pc/cbfs.mod
INSTALL/grub/i386-pc/cmp.mod
INSTALL/grub/i386-pc/core.img
INSTALL/grub/i386-pc/cpio.mod
INSTALL/grub/i386-pc/cpio_be.mod
INSTALL/grub/i386-pc/efiemu.mod
INSTALL/grub/i386-pc/f2fs.mod
INSTALL/grub/i386-pc/freedos.mod
INSTALL/grub/i386-pc/hexdump.mod
INSTALL/grub/i386-pc/hfs.mod
INSTALL/grub/i386-pc/hfsplus.mod
INSTALL/grub/i386-pc/jfs.mod
INSTALL/grub/i386-pc/loadenv.mod
INSTALL/grub/i386-pc/macho.mod
INSTALL/grub/i386-pc/minix.mod
INSTALL/grub/i386-pc/minix2.mod
INSTALL/grub/i386-pc/minix2_be.mod
INSTALL/grub/i386-pc/minix3.mod
INSTALL/grub/i386-pc/minix3_be.mod
INSTALL/grub/i386-pc/minix_be.mod
INSTALL/grub/i386-pc/moddep.lst
INSTALL/grub/i386-pc/multiboot.mod
INSTALL/grub/i386-pc/multiboot2.mod
INSTALL/grub/i386-pc/nativedisk.mod
INSTALL/grub/i386-pc/net.mod
INSTALL/grub/i386-pc/nilfs2.mod
INSTALL/grub/i386-pc/odc.mod
INSTALL/grub/i386-pc/offsetio.mod
INSTALL/grub/i386-pc/pgp.mod
INSTALL/grub/i386-pc/plan9.mod
INSTALL/grub/i386-pc/procfs.mod
INSTALL/grub/i386-pc/progress.mod
INSTALL/grub/i386-pc/pxechain.mod
INSTALL/grub/i386-pc/reiserfs.mod
INSTALL/grub/i386-pc/romfs.mod
INSTALL/grub/i386-pc/sfs.mod
INSTALL/grub/i386-pc/testload.mod
INSTALL/grub/i386-pc/tga.mod
INSTALL/grub/i386-pc/ufs1.mod
INSTALL/grub/i386-pc/ufs1_be.mod
INSTALL/grub/i386-pc/ufs2.mod
INSTALL/grub/i386-pc/verifiers.mod
INSTALL/grub/i386-pc/xnu.mod
INSTALL/grub/i386-pc/zfs.mod
INSTALL/grub/mips64el-efi/affs.mod
INSTALL/grub/mips64el-efi/afs.mod
INSTALL/grub/mips64el-efi/bfs.mod
INSTALL/grub/mips64el-efi/btrfs.mod
INSTALL/grub/mips64el-efi/cbfs.mod
INSTALL/grub/mips64el-efi/cmp.mod
INSTALL/grub/mips64el-efi/cpio.mod
INSTALL/grub/mips64el-efi/cpio_be.mod
INSTALL/grub/mips64el-efi/f2fs.mod
INSTALL/grub/mips64el-efi/hexdump.mod
INSTALL/grub/mips64el-efi/hfs.mod
INSTALL/grub/mips64el-efi/jfs.mod
INSTALL/grub/mips64el-efi/loadenv.mod
INSTALL/grub/mips64el-efi/macho.mod
INSTALL/grub/mips64el-efi/minix.mod
INSTALL/grub/mips64el-efi/minix2.mod
INSTALL/grub/mips64el-efi/minix2_be.mod
INSTALL/grub/mips64el-efi/minix3.mod
INSTALL/grub/mips64el-efi/minix3_be.mod
INSTALL/grub/mips64el-efi/minix_be.mod
INSTALL/grub/mips64el-efi/moddep.lst
INSTALL/grub/mips64el-efi/nilfs2.mod
INSTALL/grub/mips64el-efi/normal.mod
INSTALL/grub/mips64el-efi/odc.mod
INSTALL/grub/mips64el-efi/offsetio.mod
INSTALL/grub/mips64el-efi/pgp.mod
INSTALL/grub/mips64el-efi/procfs.mod
INSTALL/grub/mips64el-efi/progress.mod
INSTALL/grub/mips64el-efi/reiserfs.mod
INSTALL/grub/mips64el-efi/romfs.mod
INSTALL/grub/mips64el-efi/sfs.mod
INSTALL/grub/mips64el-efi/testload.mod
INSTALL/grub/mips64el-efi/tga.mod
INSTALL/grub/mips64el-efi/ufs1.mod
INSTALL/grub/mips64el-efi/ufs1_be.mod
INSTALL/grub/mips64el-efi/ufs2.mod
INSTALL/grub/mips64el-efi/verifiers.mod
INSTALL/grub/mips64el-efi/zfs.mod
INSTALL/grub/x86_64-efi/affs.mod
INSTALL/grub/x86_64-efi/afs.mod
INSTALL/grub/x86_64-efi/aout.mod
INSTALL/grub/x86_64-efi/bfs.mod
INSTALL/grub/x86_64-efi/bsd.mod
INSTALL/grub/x86_64-efi/btrfs.mod
INSTALL/grub/x86_64-efi/cbfs.mod
INSTALL/grub/x86_64-efi/cmp.mod
INSTALL/grub/x86_64-efi/cpio.mod
INSTALL/grub/x86_64-efi/cpio_be.mod
INSTALL/grub/x86_64-efi/f2fs.mod
INSTALL/grub/x86_64-efi/hexdump.mod
INSTALL/grub/x86_64-efi/hfs.mod
INSTALL/grub/x86_64-efi/jfs.mod
INSTALL/grub/x86_64-efi/linux16.mod
INSTALL/grub/x86_64-efi/loadbios.mod
INSTALL/grub/x86_64-efi/loadenv.mod
INSTALL/grub/x86_64-efi/macho.mod
INSTALL/grub/x86_64-efi/minix.mod
INSTALL/grub/x86_64-efi/minix2.mod
INSTALL/grub/x86_64-efi/minix2_be.mod
INSTALL/grub/x86_64-efi/minix3.mod
INSTALL/grub/x86_64-efi/minix3_be.mod
INSTALL/grub/x86_64-efi/minix_be.mod
INSTALL/grub/x86_64-efi/moddep.lst
INSTALL/grub/x86_64-efi/multiboot.mod
INSTALL/grub/x86_64-efi/multiboot2.mod
INSTALL/grub/x86_64-efi/nativedisk.mod
INSTALL/grub/x86_64-efi/nilfs2.mod
INSTALL/grub/x86_64-efi/normal.mod
INSTALL/grub/x86_64-efi/odc.mod
INSTALL/grub/x86_64-efi/offsetio.mod
INSTALL/grub/x86_64-efi/pgp.mod
INSTALL/grub/x86_64-efi/procfs.mod
INSTALL/grub/x86_64-efi/progress.mod
INSTALL/grub/x86_64-efi/reiserfs.mod
INSTALL/grub/x86_64-efi/romfs.mod
INSTALL/grub/x86_64-efi/sfs.mod
INSTALL/grub/x86_64-efi/testload.mod
INSTALL/grub/x86_64-efi/tga.mod
INSTALL/grub/x86_64-efi/ufs1.mod
INSTALL/grub/x86_64-efi/ufs1_be.mod
INSTALL/grub/x86_64-efi/ufs2.mod
INSTALL/grub/x86_64-efi/verifiers.mod
INSTALL/grub/x86_64-efi/xnu.mod
INSTALL/grub/x86_64-efi/zfs.mod
INSTALL/ventoy/ventoy.cpio
INSTALL/ventoy/ventoy_aa64.efi
INSTALL/ventoy/ventoy_arm64.cpio
INSTALL/ventoy/ventoy_ia32.efi
INSTALL/ventoy/ventoy_mips64.cpio
INSTALL/ventoy/ventoy_unix.cpio
INSTALL/ventoy/ventoy_x64.efi
INSTALL/ventoy/ventoy_x86.cpio
INSTALL/ventoy/vtloopex.cpio
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump64.exe
INSTALL/ventoy/vtoyutil_aa64.efi
INSTALL/ventoy/vtoyutil_ia32.efi
INSTALL/ventoy/vtoyutil_x64.efi
INSTALL/ventoy_pack.sh
LANGUAGES/languages.json
Plugson/src/Web/ventoy_http.c
Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe
Vlnk/VentoyVlnk.sh [new file with mode: 0644]
Vlnk/build.sh [new file with mode: 0644]
Vlnk/pack.sh [new file with mode: 0644]
Vlnk/src/crc32.c [new file with mode: 0644]
Vlnk/src/main_linux.c [new file with mode: 0644]
Vlnk/src/main_windows.c [new file with mode: 0644]
Vlnk/src/vlnk.c [new file with mode: 0644]
Vlnk/src/vlnk.h [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk.sln [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/Vlnk32.manifest [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/Vlnk64.manifest [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/VlnkArm.manifest [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/VlnkArm64.manifest [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/vlnk.ico [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.aps [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.rc [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj.filters [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj.user [new file with mode: 0644]
Vlnk/vs/VentoyVlnk/VentoyVlnk/resource.h [new file with mode: 0644]
VtoyTool/vtoydm.c
VtoyTool/vtoydump.c
VtoyTool/vtoytool.h [new file with mode: 0644]
VtoyTool/vtoytool/00/vtoytool_32
VtoyTool/vtoytool/00/vtoytool_64
VtoyTool/vtoytool/00/vtoytool_aa64
VtoyTool/vtoytool/00/vtoytool_m64e
vtoyjump/vtoyjump/vtoyjump.c

index 85ed49e3ef9642ef44c4bcb32fb368243e2f8628..396c69d73005ef85dd8fa4b6b81a4ddc4479ab42 100644 (file)
@@ -21,7 +21,7 @@ body:
     attributes:
       label: Ventoy Version
       description: What version of ventoy are you running?
     attributes:
       label: Ventoy Version
       description: What version of ventoy are you running?
-      placeholder: 1.0.65
+      placeholder: 1.0.66
     validations:
       required: true
   - type: dropdown
     validations:
       required: true
   - type: dropdown
index 5d9972259e54d7d9448726ef00db294eef074ca0..67e6881a4b5566e1cc9bf4f018df730237063fd5 100644 (file)
@@ -229,12 +229,14 @@ static void EFIAPI ventoy_dump_chain(ventoy_chain_head *chain)
     debug("os_param->vtoy_img_size=<%llu>",    chain->os_param.vtoy_img_size);
     debug("os_param->vtoy_img_location_addr=<0x%llx>", chain->os_param.vtoy_img_location_addr);
     debug("os_param->vtoy_img_location_len=<%u>",    chain->os_param.vtoy_img_location_len);
     debug("os_param->vtoy_img_size=<%llu>",    chain->os_param.vtoy_img_size);
     debug("os_param->vtoy_img_location_addr=<0x%llx>", chain->os_param.vtoy_img_location_addr);
     debug("os_param->vtoy_img_location_len=<%u>",    chain->os_param.vtoy_img_location_len);
-    debug("os_param->vtoy_reserved=<%u %u %u %u %u>",    
+    debug("os_param->vtoy_reserved=<%u %u %u %u %u %u %u>",    
           g_os_param_reserved[0], 
           g_os_param_reserved[1], 
           g_os_param_reserved[2], 
           g_os_param_reserved[3],
           g_os_param_reserved[0], 
           g_os_param_reserved[1], 
           g_os_param_reserved[2], 
           g_os_param_reserved[3],
-          g_os_param_reserved[4]
+          g_os_param_reserved[4],
+          g_os_param_reserved[5],
+          g_os_param_reserved[6]
           );
 
     ventoy_debug_pause();
           );
 
     ventoy_debug_pause();
@@ -578,7 +580,7 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk(IN EFI_HANDLE ImageHandle)
         if (CompareMem(g_chain->os_param.vtoy_disk_guid, pBuffer + 0x180, 16) == 0)
         {
             pMBR = (MBR_HEAD *)pBuffer;
         if (CompareMem(g_chain->os_param.vtoy_disk_guid, pBuffer + 0x180, 16) == 0)
         {
             pMBR = (MBR_HEAD *)pBuffer;
-            if (pMBR->PartTbl[0].FsFlag != 0xEE)
+            if (g_os_param_reserved[6] == 0 && pMBR->PartTbl[0].FsFlag != 0xEE)
             {
                 if (pMBR->PartTbl[0].StartSectorId != 2048 ||
                     pMBR->PartTbl[1].SectorCount != 65536 ||
             {
                 if (pMBR->PartTbl[0].StartSectorId != 2048 ||
                     pMBR->PartTbl[1].SectorCount != 65536 ||
@@ -956,6 +958,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
         debug("memdisk mode iso_buf_size:%u", g_iso_buf_size);
 
         g_chain = chain;
         debug("memdisk mode iso_buf_size:%u", g_iso_buf_size);
 
         g_chain = chain;
+        g_os_param_reserved = (UINT8 *)(g_chain->os_param.vtoy_reserved);
         gMemdiskMode = TRUE;
     }
     else
         gMemdiskMode = TRUE;
     }
     else
index b4d5238c9d5ea3d5c65ff48bca90cbae83079d48..61e02614c01815e1977d6e0fd98d5c696ccb5ebf 100644 (file)
@@ -106,19 +106,109 @@ int ventoy_check_file_exist(const char * fmt, ...)
     }
 }
 
     }
 }
 
+typedef struct grub_vlnk
+{
+    int srclen;
+    char src[512];
+    char dst[512];
+    struct grub_vlnk *next;
+}grub_vlnk;
+
+static grub_vlnk *g_vlnk_list;
+
+int grub_file_is_vlnk_suffix(const char *name, int len)
+{
+    grub_uint32_t suffix;
+
+    if (len > 9)
+    {
+        suffix = *(grub_uint32_t *)(name + len - 4);
+        if (grub_strncmp(name + len - 9, ".vlnk.", 6) == 0)
+        {
+            /* .iso .wim .img .vhd .efi .dat */
+            if (suffix == 0x6F73692E || suffix == 0x6D69772E || 
+                suffix == 0x676D692E || suffix == 0x6468762E ||
+                suffix == 0x6966652E || suffix == 0x7461642E)
+            {
+                return 1;
+            }
+        }
+        else if (len > 10 && grub_strncmp(name + len - 10, ".vlnk.", 6) == 0)
+        {
+            /* vhdx vtoy */
+            if (suffix == 0x78646876 || suffix == 0x796F7476)
+            {
+                return 1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+int grub_file_add_vlnk(const char *src, const char *dst)
+{
+    grub_vlnk *node = NULL;
+    
+    if (src && dst)
+    {
+        node = grub_zalloc(sizeof(grub_vlnk));    
+        if (node)
+        {
+            node->srclen = (int)grub_strlen(src);
+            grub_strncpy(node->src, src, sizeof(node->src) - 1);
+            grub_strncpy(node->dst, dst, sizeof(node->dst) - 1);
+
+            node->next = g_vlnk_list;
+            g_vlnk_list = node;
+            return 0;            
+        }
+    }
+
+    return 1;
+}
+
+const char *grub_file_get_vlnk(const char *name, int *vlnk)
+{
+    int len;
+    grub_vlnk *node = g_vlnk_list;
+
+    len = grub_strlen(name);
+    if (!grub_file_is_vlnk_suffix(name, len))
+    {
+        return name;
+    }
+    
+    while (node)
+    {
+        if (node->srclen == len && grub_strcmp(name, node->src) == 0)
+        {
+            *vlnk = 1;
+            return node->dst;
+        }
+        node = node->next;
+    }
+
+    return name;
+}
+
 grub_file_t
 grub_file_open (const char *name, enum grub_file_type type)
 {
 grub_file_t
 grub_file_open (const char *name, enum grub_file_type type)
 {
+  int vlnk = 0;
   grub_device_t device = 0;
   grub_file_t file = 0, last_file = 0;
   char *device_name;
   const char *file_name;
   grub_file_filter_id_t filter;
 
   grub_device_t device = 0;
   grub_file_t file = 0, last_file = 0;
   char *device_name;
   const char *file_name;
   grub_file_filter_id_t filter;
 
-  /* <DESC> : mem:xxx:size:xxx format in chainloader */
-  if (grub_strncmp(name, GRUB_MEMFILE_MEM, grub_strlen(GRUB_MEMFILE_MEM)) == 0) {
+  /* <DESC> : mem:xxx:size:xxx format in chainloader grub_strlen(GRUB_MEMFILE_MEM) */
+  if (grub_strncmp(name, GRUB_MEMFILE_MEM, 4) == 0) {
       return grub_memfile_open(name);
       return grub_memfile_open(name);
-  }  
+  }
+
+  if (g_vlnk_list && (type & GRUB_FILE_TYPE_NO_VLNK) == 0)
+    name = grub_file_get_vlnk(name, &vlnk);
 
   device_name = grub_file_get_device_name (name);
   if (grub_errno)
 
   device_name = grub_file_get_device_name (name);
   if (grub_errno)
@@ -141,6 +231,7 @@ grub_file_open (const char *name, enum grub_file_type type)
     goto fail;
 
   file->device = device;
     goto fail;
 
   file->device = device;
+  file->vlnk = vlnk;
 
   /* In case of relative pathnames and non-Unix systems (like Windows)
    * name of host files may not start with `/'. Blocklists for host files
 
   /* In case of relative pathnames and non-Unix systems (like Windows)
    * name of host files may not start with `/'. Blocklists for host files
index 3052ae9e0179130f866cdf6a5071e8cf9ddeaba2..2736259e2664e8723648eb47d998dad687018005 100644 (file)
@@ -42,6 +42,44 @@ probe_dummy_iter (const char *filename __attribute__ ((unused)),
   return 1;
 }
 
   return 1;
 }
 
+grub_fs_t grub_fs_list_probe(grub_device_t device, const char **list)
+{
+    int i;
+    grub_fs_t p;
+
+    if (!device->disk)
+        return 0;
+
+    for (p = grub_fs_list; p; p = p->next) 
+    {
+        for (i = 0; list[i]; i++) 
+        {
+            if (grub_strcmp(p->name, list[i]) == 0)
+                break;
+        }
+
+        if (list[i] == NULL)
+            continue;
+        
+        grub_dprintf("fs", "Detecting %s...\n", p->name);
+
+           (p->fs_dir) (device, "/", probe_dummy_iter, NULL);
+           if (grub_errno == GRUB_ERR_NONE)
+               return p;
+
+        grub_error_push ();
+        grub_dprintf ("fs", "%s detection failed.\n", p->name);
+        grub_error_pop ();
+
+        if (grub_errno != GRUB_ERR_BAD_FS && grub_errno != GRUB_ERR_OUT_OF_RANGE) {
+            return 0;
+        }
+           grub_errno = GRUB_ERR_NONE;
+       }
+
+    return 0;
+}
+
 grub_fs_t
 grub_fs_probe (grub_device_t device)
 {
 grub_fs_t
 grub_fs_probe (grub_device_t device)
 {
index 158d1658de8936819314c5cdeaa4be7411a32dea..2fb78c30339e0ef5471f0ff1e1352808c08ed6b8 100644 (file)
@@ -102,6 +102,7 @@ ventoy_img_chunk_list g_img_chunk_list;
 int g_wimboot_enable = 0;
 ventoy_img_chunk_list g_wimiso_chunk_list;
 char *g_wimiso_path = NULL;
 int g_wimboot_enable = 0;
 ventoy_img_chunk_list g_wimiso_chunk_list;
 char *g_wimiso_path = NULL;
+grub_uint32_t g_wimiso_size = 0;
 
 int g_vhdboot_enable = 0;
 
 
 int g_vhdboot_enable = 0;
 
@@ -155,6 +156,8 @@ static char g_vtoy_prompt_msg[64];
 
 static char g_json_case_mis_path[32];
 
 
 static char g_json_case_mis_path[32];
 
+static ventoy_vlnk_part *g_vlnk_part_list = NULL;
+
 static int ventoy_get_fs_type(const char *fs)
 {
     if (NULL == fs)
 static int ventoy_get_fs_type(const char *fs)
 {
     if (NULL == fs)
@@ -699,32 +702,6 @@ grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...
     return file;
 }
 
     return file;
 }
 
-int ventoy_is_file_exist(const char *fmt, ...)
-{
-    va_list ap;
-    int len;
-    char *pos = NULL;
-    char buf[256] = {0};
-
-    grub_snprintf(buf, sizeof(buf), "%s", "[ -f \"");
-    pos = buf + 6;
-
-    va_start (ap, fmt);
-    len = grub_vsnprintf(pos, 255, fmt, ap);
-    va_end (ap);
-
-    grub_strncpy(pos + len, "\" ]", 3);
-
-    debug("script exec %s\n", buf);
-
-    if (0 == grub_script_execute_sourcecode(buf))
-    {
-        return 1;
-    }
-
-    return 0;
-}
-
 int ventoy_is_dir_exist(const char *fmt, ...)
 {
     va_list ap;
 int ventoy_is_dir_exist(const char *fmt, ...)
 {
     va_list ap;
@@ -1007,6 +984,7 @@ static grub_err_t ventoy_cmd_load_wimboot(grub_extcmd_context_t ctxt, int argc,
     (void)args;
 
     g_wimboot_enable = 0;
     (void)args;
 
     g_wimboot_enable = 0;
+    g_wimiso_size = 0;
     grub_check_free(g_wimiso_path);
     grub_check_free(g_wimiso_chunk_list.chunk);
 
     grub_check_free(g_wimiso_path);
     grub_check_free(g_wimiso_chunk_list.chunk);
 
@@ -1030,7 +1008,7 @@ static grub_err_t ventoy_cmd_load_wimboot(grub_extcmd_context_t ctxt, int argc,
 
     g_wimboot_enable = 1;
     g_wimiso_path = grub_strdup(args[0]);
 
     g_wimboot_enable = 1;
     g_wimiso_path = grub_strdup(args[0]);
-    
+    g_wimiso_size = (grub_uint32_t)(file->size);
     grub_file_close(file);
 
     return 0;
     grub_file_close(file);
 
     return 0;
@@ -1074,6 +1052,11 @@ static grub_err_t ventoy_cmd_concat_efi_iso(grub_extcmd_context_t ctxt, int argc
         return 1;
     }
 
         return 1;
     }
 
+    if (grub_strncmp(args[0], g_iso_path, grub_strlen(g_iso_path)))
+    {
+        file->vlnk = 1;
+    }
+
     totlen += ventoy_align_2k(file->size);
 
     dirent = (ventoy_iso9660_override *)(buf + offset);
     totlen += ventoy_align_2k(file->size);
 
     dirent = (ventoy_iso9660_override *)(buf + offset);
@@ -1611,12 +1594,231 @@ static int ventoy_img_name_valid(const char *filename, grub_size_t namelen)
     return 1;
 }
 
     return 1;
 }
 
+static int ventoy_vlnk_iterate_partition(struct grub_disk *disk, const grub_partition_t partition, void *data)
+{
+    ventoy_vlnk_part *node = NULL;
+    grub_uint32_t *pSig = (grub_uint32_t *)data;
+
+    node = grub_zalloc(sizeof(ventoy_vlnk_part));
+    if (node)
+    {
+        node->disksig = *pSig;
+        node->partoffset = (partition->start << GRUB_DISK_SECTOR_BITS);
+        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;
+    }
+
+    return 0;
+}
+
+static int ventoy_vlnk_iterate_disk(const char *name, void *data)
+{
+    grub_disk_t disk;
+    grub_uint32_t sig;
+
+    (void)data;
+
+    disk = grub_disk_open(name);
+    if (disk)
+    {
+        grub_disk_read(disk, 0, 0x1b8, 4, &sig);
+
+        /* skip ventoy device self */
+        if (sig != *(grub_uint32_t *)data)
+        {
+            grub_partition_iterate(disk, ventoy_vlnk_iterate_partition, &sig);
+        }
+        
+        grub_disk_close(disk);
+    }
+
+    return 0;
+}
+
+static int ventoy_vlnk_probe_fs(ventoy_vlnk_part *cur)
+{
+    const char *fs[ventoy_fs_max + 1] = 
+    {
+        "exfat", "ntfs", "ext2", "xfs", "udf", "fat", NULL
+    };
+
+    if (!cur->dev)
+    {
+        cur->dev = grub_device_open(cur->device);
+    }
+
+    if (cur->dev)
+    {
+        cur->fs = grub_fs_list_probe(cur->dev, fs);
+    }
+
+    return 0;
+}
+
+static int ventoy_check_vlnk_data(ventoy_vlnk *vlnk, int print, char *dst, int size)
+{
+    int diskfind = 0;
+    int partfind = 0;
+    int filefind = 0;
+    char *disk, *device;
+    grub_uint32_t readcrc, calccrc;
+    ventoy_vlnk_part *cur;
+    grub_fs_t fs = NULL;
+    
+    if (grub_memcmp(&(vlnk->guid), &g_ventoy_guid, sizeof(ventoy_guid)))
+    {
+        if (print)
+        {
+            grub_printf("VLNK invalid guid\n");
+            grub_refresh();
+        }
+        return 1;
+    }
+
+    readcrc = vlnk->crc32;
+    vlnk->crc32 = 0;
+    calccrc = grub_getcrc32c(0, vlnk, sizeof(ventoy_vlnk));
+    if (readcrc != calccrc)
+    {
+        if (print)
+        {
+            grub_printf("VLNK invalid crc 0x%08x 0x%08x\n", calccrc, readcrc);
+            grub_refresh();
+        }
+        return 1;
+    }
+
+    if (!g_vlnk_part_list)
+    {
+        grub_disk_dev_iterate(ventoy_vlnk_iterate_disk, g_ventoy_part_info->MBR.BootCode + 0x1b8);
+    }
+
+    for (cur = g_vlnk_part_list; cur && filefind == 0; cur = cur->next)
+    {
+        if (cur->disksig == vlnk->disk_signature)
+        {
+            diskfind = 1;
+            disk = cur->disk;
+            if (cur->partoffset == vlnk->part_offset)
+            {
+                partfind = 1;
+                device = cur->device;
+
+                if (cur->probe == 0)
+                {
+                    cur->probe = 1;
+                    ventoy_vlnk_probe_fs(cur);
+                }
+    
+                if (!fs)
+                {
+                    fs = cur->fs;
+                }
+                
+                if (cur->fs)
+                {
+                    struct grub_file file;
+
+                    grub_memset(&file, 0, sizeof(file));
+                    file.device = cur->dev;
+                    if (cur->fs->fs_open(&file, vlnk->filepath) == GRUB_ERR_NONE)
+                    {
+                        filefind = 1;
+                        cur->fs->fs_close(&file);
+                        grub_snprintf(dst, size - 1, "(%s)%s", cur->device, vlnk->filepath);
+                    }
+                }
+            }
+        }
+    }
+
+    if (print)
+    {
+        grub_printf("\n==== VLNK Information ====\n"
+                    "Disk Signature: %08x\n"
+                    "Partition Offset: %llu\n"
+                    "File Path: <%s>\n\n",
+                    vlnk->disk_signature, (ulonglong)vlnk->part_offset, vlnk->filepath);
+
+        if (diskfind)
+        {
+            grub_printf("Disk Find: [ YES ] [ %s ]\n", disk);
+        }
+        else
+        {
+            grub_printf("Disk Find: [ NO ]\n");
+        }
+        
+        if (partfind)
+        {
+            grub_printf("Part Find: [ YES ] [ %s ] [ %s ]\n", device, fs ? fs->name : "N/A");
+        }
+        else
+        {
+            grub_printf("Part Find: [ NO ]\n");
+        }
+        grub_printf("File Find: [ %s ]\n", filefind ? "YES" : "NO");
+        if (filefind)
+        {
+            grub_printf("VLNK File: <%s>\n", dst);
+        }
+        
+        grub_printf("\n");
+        grub_refresh();
+    }
+
+    return (1 - filefind);
+}
+
+int ventoy_add_vlnk_file(char *dir, const char *name)
+{
+    int rc = 1;
+    char src[512];
+    char dst[512];
+    grub_file_t file = NULL;
+    ventoy_vlnk vlnk;
+
+    if (!dir)
+    {
+        grub_snprintf(src, sizeof(src), "%s%s", g_iso_path, name);
+    }
+    else if (dir[0] == '/')
+    {
+        grub_snprintf(src, sizeof(src), "%s%s%s", g_iso_path, dir, name);
+    }
+    else
+    {
+        grub_snprintf(src, sizeof(src), "%s/%s%s", g_iso_path, dir, name);
+    }
+
+    file = grub_file_open(src, VENTOY_FILE_TYPE);
+    if (!file)
+    {
+        return 1;
+    }
+
+    grub_memset(&vlnk, 0, sizeof(vlnk));
+    grub_file_read(file, &vlnk, sizeof(vlnk));
+    grub_file_close(file);
+
+    if (ventoy_check_vlnk_data(&vlnk, 0, dst, sizeof(dst)) == 0)
+    {
+        rc = grub_file_add_vlnk(src, dst);        
+    }
+
+    return rc;
+}
+
 static int ventoy_collect_img_files(const char *filename, const struct grub_dirhook_info *info, void *data)
 {
     //int i = 0;
     int type = 0;
     int ignore = 0;
     int index = 0;
 static int ventoy_collect_img_files(const char *filename, const struct grub_dirhook_info *info, void *data)
 {
     //int i = 0;
     int type = 0;
     int ignore = 0;
     int index = 0;
+    int vlnk = 0;
     grub_size_t len;
     img_info *img;
     img_info *tail;
     grub_size_t len;
     img_info *img;
     img_info *tail;
@@ -1785,6 +1987,18 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh
                 return 0; 
             }
         }
                 return 0; 
             }
         }
+
+        if (info->size == VTOY_FILT_MIN_FILE_SIZE || info->size == 0)
+        {
+            if (grub_file_is_vlnk_suffix(filename, len))
+            {
+                vlnk = 1;
+                if (ventoy_add_vlnk_file(node->dir, filename) != 0)
+                {
+                    return 0;
+                }
+            }
+        }
         
         img = grub_zalloc(sizeof(img_info));
         if (img)
         
         img = grub_zalloc(sizeof(img_info));
         if (img)
@@ -1796,9 +2010,16 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh
             img->pathlen = grub_snprintf(img->path, sizeof(img->path), "%s%s", node->dir, img->name);
 
             img->size = info->size;
             img->pathlen = grub_snprintf(img->path, sizeof(img->path), "%s%s", node->dir, img->name);
 
             img->size = info->size;
-            if (0 == img->size)
+            if (vlnk || 0 == img->size)
             {
             {
-                img->size = ventoy_grub_get_file_size("%s/%s%s", g_iso_path, node->dir, filename);
+                if (node->dir[0] == '/')
+                {
+                    img->size = ventoy_grub_get_file_size("%s%s%s", g_iso_path, node->dir, filename);                    
+                }
+                else
+                {
+                    img->size = ventoy_grub_get_file_size("%s/%s%s", g_iso_path, node->dir, filename);                    
+                }
             }
 
             if (img->size < VTOY_FILT_MIN_FILE_SIZE)
             }
 
             if (img->size < VTOY_FILT_MIN_FILE_SIZE)
@@ -2803,6 +3024,10 @@ void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param)
         param->vtoy_reserved[5] = 1;
     }
 
         param->vtoy_reserved[5] = 1;
     }
 
+    /* ventoy_disk_signature used for vlnk */
+    param->vtoy_reserved[6] = file->vlnk;
+    grub_memcpy(param->vtoy_reserved + 7, g_ventoy_part_info->MBR.BootCode + 0x1b8, 4);
+
     /* calculate checksum */
     for (i = 0; i < sizeof(ventoy_os_param); i++)
     {
     /* calculate checksum */
     for (i = 0; i < sizeof(ventoy_os_param); i++)
     {
@@ -5084,6 +5309,114 @@ out:
     return ret;
 }
 
     return ret;
 }
 
+static grub_err_t grub_cmd_vlnk_dump_part(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    int n = 0;
+    ventoy_vlnk_part *node;
+    
+    (void)ctxt;
+    (void)argc;
+    (void)args;
+
+    for (node = g_vlnk_part_list; node; node = node->next)
+    {
+        grub_printf("[%d] %s  disksig:%08x  offset:%llu  fs:%s\n", 
+                    ++n, node->device, node->disksig, 
+                    (ulonglong)node->partoffset, (node->fs ? node->fs->name : "N/A"));
+    }
+
+    return 0;
+}
+
+static grub_err_t grub_cmd_is_vlnk_name(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    int len = 0;
+    
+    (void)ctxt;
+
+    if (argc == 1)
+    {
+        len = (int)grub_strlen(args[0]);
+        if (grub_file_is_vlnk_suffix(args[0], len))
+        {
+            return 0;
+        }        
+    }
+
+    return 1;
+}
+
+static grub_err_t grub_cmd_get_vlnk_dst(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    int vlnk = 0;
+    const char *name = NULL;
+    
+    (void)ctxt;
+
+    if (argc == 2)
+    {
+        grub_env_unset(args[1]);
+        name = grub_file_get_vlnk(args[0], &vlnk);
+        if (vlnk)
+        {
+            debug("VLNK SRC: <%s>\n", args[0]);
+            debug("VLNK DST: <%s>\n", name);
+            grub_env_set(args[1], name);
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
+static grub_err_t grub_cmd_check_vlnk(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    int ret = 1;
+    int len = 0;
+    grub_file_t file = NULL;
+    ventoy_vlnk vlnk;
+    char dst[512];
+    
+    (void)ctxt;
+
+    if (argc != 1)
+    {
+        goto out;
+    }
+
+    len = (int)grub_strlen(args[0]);
+    if (!grub_file_is_vlnk_suffix(args[0], len))
+    {
+        grub_printf("Invalid vlnk suffix\n");
+        goto out;
+    }
+
+    file = grub_file_open(args[0], VENTOY_FILE_TYPE | GRUB_FILE_TYPE_NO_VLNK);
+    if (!file)
+    {
+        grub_printf("Failed to open %s\n", args[0]);
+        goto out;
+    }
+
+    if (file->size != 32768)
+    {
+        grub_printf("Invalid vlnk file (size=%llu).\n", (ulonglong)file->size);
+        goto out;
+    }
+
+    grub_memset(&vlnk, 0, sizeof(vlnk));
+    grub_file_read(file, &vlnk, sizeof(vlnk));
+
+    ret = ventoy_check_vlnk_data(&vlnk, 1, dst, sizeof(dst));
+
+out:
+
+    grub_refresh();
+    check_free(file, grub_file_close);
+    grub_errno = GRUB_ERR_NONE;
+    return ret;
+}
+
 int ventoy_env_init(void)
 {
     char buf[64];
 int ventoy_env_init(void)
 {
     char buf[64];
@@ -5271,6 +5604,10 @@ static cmd_para ventoy_cmds[] =
     { "vt_append_extra_sector", ventoy_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_append_extra_sector", ventoy_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 },
 };
 
 int ventoy_register_all_cmd(void)
 };
 
 int ventoy_register_all_cmd(void)
index b9f94d5c2a2dc4cb3ad8e979253ef91c2f2307e1..69d3440067a375d688ab051248e96ec8350a2d35 100644 (file)
@@ -304,6 +304,7 @@ extern ventoy_guid  g_ventoy_guid;
 extern ventoy_img_chunk_list g_img_chunk_list;
 extern ventoy_img_chunk_list g_wimiso_chunk_list;
 extern char *g_wimiso_path;
 extern ventoy_img_chunk_list g_img_chunk_list;
 extern ventoy_img_chunk_list g_wimiso_chunk_list;
 extern char *g_wimiso_path;
+extern grub_uint32_t g_wimiso_size;
 extern char g_arch_mode_suffix[64];
 extern const char *g_menu_prefix[img_type_max];
 
 extern char g_arch_mode_suffix[64];
 extern const char *g_menu_prefix[img_type_max];
 
@@ -604,7 +605,6 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **
 int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, const char *name);
 grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...);
 grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...);
 int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, const char *name);
 grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...);
 grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...);
-int ventoy_is_file_exist(const char *fmt, ...);
 int ventoy_is_dir_exist(const char *fmt, ...);
 int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
 grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
 int ventoy_is_dir_exist(const char *fmt, ...);
 int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
 grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
@@ -826,6 +826,7 @@ typedef struct ventoy_video_mode
 typedef struct file_fullpath
 {
     char path[256];
 typedef struct file_fullpath
 {
     char path[256];
+    int vlnk_add;
 }file_fullpath;
 
 typedef struct theme_list
 }file_fullpath;
 
 typedef struct theme_list
@@ -1153,5 +1154,20 @@ struct g_ventoy_map{
 };
 #pragma pack()
 
 };
 #pragma pack()
 
+typedef struct ventoy_vlnk_part
+{
+    grub_uint32_t disksig;
+    grub_uint64_t partoffset;
+    char disk[64];
+    char device[64];
+    grub_device_t dev;
+    grub_fs_t fs;
+    int probe;
+    struct ventoy_vlnk_part *next;
+}ventoy_vlnk_part;
+
+extern char g_iso_path[256];
+int ventoy_add_vlnk_file(char *dir, const char *name);
+
 #endif /* __VENTOY_DEF_H__ */
 
 #endif /* __VENTOY_DEF_H__ */
 
index 59fca857a5e1c167b96f4e7fdcbd75ac985c53ce..841327aea0456749d192526b1be15a029c8de1ec 100644 (file)
@@ -171,11 +171,11 @@ static int ventoy_plugin_theme_check(VTOY_JSON *json, const char *isodisk)
         grub_printf("file: %s\n", value);
         if (value[0] == '/')
         {
         grub_printf("file: %s\n", value);
         if (value[0] == '/')
         {
-            exist = ventoy_is_file_exist("%s%s", isodisk, value);
+            exist = ventoy_check_file_exist("%s%s", isodisk, value);
         }
         else
         {
         }
         else
         {
-            exist = ventoy_is_file_exist("%s/ventoy/%s", isodisk, value);
+            exist = ventoy_check_file_exist("%s/ventoy/%s", isodisk, value);
         }
         
         if (exist == 0)
         }
         
         if (exist == 0)
@@ -195,11 +195,11 @@ static int ventoy_plugin_theme_check(VTOY_JSON *json, const char *isodisk)
                 grub_printf("file: %s\n", value);
                 if (value[0] == '/')
                 {
                 grub_printf("file: %s\n", value);
                 if (value[0] == '/')
                 {
-                    exist = ventoy_is_file_exist("%s%s", isodisk, value);
+                    exist = ventoy_check_file_exist("%s%s", isodisk, value);
                 }
                 else
                 {
                 }
                 else
                 {
-                    exist = ventoy_is_file_exist("%s/ventoy/%s", isodisk, value);
+                    exist = ventoy_check_file_exist("%s/ventoy/%s", isodisk, value);
                 }
 
                 if (exist == 0)
                 }
 
                 if (exist == 0)
@@ -463,7 +463,7 @@ static int ventoy_plugin_check_path(const char *path, const char *file)
         return 1;
     }
 
         return 1;
     }
 
-    if (!ventoy_is_file_exist("%s%s", path, file))
+    if (!ventoy_check_file_exist("%s%s", path, file))
     {
         grub_printf("%s%s does NOT exist\n", path, file);
         return 1;
     {
         grub_printf("%s%s does NOT exist\n", path, file);
         return 1;
@@ -561,7 +561,7 @@ static int ventoy_plugin_parse_fullpath
     {
         debug("%s is string type data\n", node->pcName);
 
     {
         debug("%s is string type data\n", node->pcName);
 
-        if ((node->unData.pcStrVal[0] != '/') || (!ventoy_is_file_exist("%s%s", isodisk, node->unData.pcStrVal)))
+        if ((node->unData.pcStrVal[0] != '/') || (!ventoy_check_file_exist("%s%s", isodisk, node->unData.pcStrVal)))
         {
             debug("%s%s file not found\n", isodisk, node->unData.pcStrVal);
             return 1;
         {
             debug("%s%s file not found\n", isodisk, node->unData.pcStrVal);
             return 1;
@@ -596,7 +596,7 @@ static int ventoy_plugin_parse_fullpath
             
             for (count = 0, child = node->pstChild; child; child = child->pstNext)
             {
             
             for (count = 0, child = node->pstChild; child; child = child->pstNext)
             {
-                if (ventoy_is_file_exist("%s%s", isodisk, child->unData.pcStrVal))
+                if (ventoy_check_file_exist("%s%s", isodisk, child->unData.pcStrVal))
                 {
                     grub_snprintf(path->path, sizeof(path->path), "%s", child->unData.pcStrVal);
                     path++;
                 {
                     grub_snprintf(path->path, sizeof(path->path), "%s", child->unData.pcStrVal);
                     path++;
@@ -1401,7 +1401,7 @@ static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
                 {
                     grub_printf("image: <%s> [ * ]\n", path);
                 }
                 {
                     grub_printf("image: <%s> [ * ]\n", path);
                 }
-                else if (ventoy_is_file_exist("%s%s", isodisk, path))
+                else if (ventoy_check_file_exist("%s%s", isodisk, path))
                 {
                     grub_printf("image: <%s> [ OK ]\n", path);
                 }
                 {
                     grub_printf("image: <%s> [ OK ]\n", path);
                 }
@@ -1542,7 +1542,7 @@ static int ventoy_plugin_menutip_check(VTOY_JSON *json, const char *isodisk)
                 {
                     grub_printf("image: <%s> [ * ]\n", path);
                 }
                 {
                     grub_printf("image: <%s> [ * ]\n", path);
                 }
-                else if (ventoy_is_file_exist("%s%s", isodisk, path))
+                else if (ventoy_check_file_exist("%s%s", isodisk, path))
                 {
                     grub_printf("image: <%s> [ OK ]\n", path);
                 }
                 {
                     grub_printf("image: <%s> [ OK ]\n", path);
                 }
@@ -2684,6 +2684,8 @@ persistence_config * ventoy_plugin_find_persistent(const char *isopath)
 int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list)
 {
     int rc = 1;
 int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list)
 {
     int rc = 1;
+    int len = 0;
+    char *path = NULL;
     grub_uint64_t start = 0;
     grub_file_t file = NULL;
     persistence_config *node = NULL;
     grub_uint64_t start = 0;
     grub_file_t file = NULL;
     persistence_config *node = NULL;
@@ -2704,10 +2706,22 @@ int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, vento
         return 1;
     }
 
         return 1;
     }
 
-    file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", g_iso_disk_name, node->backendpath[index].path);
+    path = node->backendpath[index].path;
+
+    if (node->backendpath[index].vlnk_add == 0)
+    {
+        len = grub_strlen(path);
+        if (len > 9 && grub_strncmp(path + len - 9, ".vlnk.dat", 9) == 0)
+        {
+            ventoy_add_vlnk_file(NULL, path);
+            node->backendpath[index].vlnk_add = 1;
+        }
+    }
+    
+    file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", g_iso_disk_name, path);
     if (!file)
     {
     if (!file)
     {
-        debug("Failed to open file %s%s\n", g_iso_disk_name, node->backendpath[index].path);
+        debug("Failed to open file %s%s\n", g_iso_disk_name, path);
         goto end;
     }
 
         goto end;
     }
 
index b37cf0ac78c5fa0e064c5a0d21942db0e732ecca..7bc7d90f6b70ea0615530652358a1a40d93617b3 100644 (file)
@@ -667,6 +667,11 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
         return 1;
     }
 
         return 1;
     }
 
+    if (grub_strncmp(args[0], g_iso_path, grub_strlen(g_iso_path)))
+    {
+        file->vlnk = 1;
+    }
+
     img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
     
     size = sizeof(ventoy_chain_head) + img_chunk_size;
     img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
     
     size = sizeof(ventoy_chain_head) + img_chunk_size;
index 4e605093c052cb4f133c41a8aaec970e0fd95022..c854ad4a1e09d2378ea5878b0dfeae72f37273c5 100644 (file)
@@ -1994,21 +1994,12 @@ static grub_uint32_t ventoy_get_wim_iso_offset(const char *filepath)
     return imgoffset;
 }
 
     return imgoffset;
 }
 
-static int ventoy_get_wim_chunklist(const char *filename, ventoy_img_chunk_list *wimchunk, grub_uint64_t *wimsize)
+static int ventoy_get_wim_chunklist(grub_file_t wimfile, ventoy_img_chunk_list *wimchunk)
 {
 {
-    grub_file_t wimfile;
-    
-    wimfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", filename);
-    if (!wimfile)
-    {
-        return 1;
-    }
-
     grub_memset(wimchunk, 0, sizeof(ventoy_img_chunk_list));
     wimchunk->chunk = grub_malloc(sizeof(ventoy_img_chunk) * DEFAULT_CHUNK_NUM);
     if (NULL == wimchunk->chunk)
     {
     grub_memset(wimchunk, 0, sizeof(ventoy_img_chunk_list));
     wimchunk->chunk = grub_malloc(sizeof(ventoy_img_chunk) * DEFAULT_CHUNK_NUM);
     if (NULL == wimchunk->chunk)
     {
-        grub_file_close(wimfile);
         return grub_error(GRUB_ERR_OUT_OF_MEMORY, "Can't allocate image chunk memoty\n");
     }
     
         return grub_error(GRUB_ERR_OUT_OF_MEMORY, "Can't allocate image chunk memoty\n");
     }
     
@@ -2017,9 +2008,6 @@ static int ventoy_get_wim_chunklist(const char *filename, ventoy_img_chunk_list
     
     ventoy_get_block_list(wimfile, wimchunk, wimfile->device->disk->partition->start);
 
     
     ventoy_get_block_list(wimfile, wimchunk, wimfile->device->disk->partition->start);
 
-    *wimsize = wimfile->size;
-    grub_file_close(wimfile);
-
     return 0;
 }
 
     return 0;
 }
 
@@ -2058,7 +2046,7 @@ grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, c
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
-grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
+static grub_err_t ventoy_vlnk_wim_chain_data(grub_file_t wimfile)
 {
     grub_uint32_t i = 0;
     grub_uint32_t imgoffset = 0;
 {
     grub_uint32_t i = 0;
     grub_uint32_t imgoffset = 0;
@@ -2079,10 +2067,172 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
     ventoy_img_chunk_list wimchunk;
     char envbuf[128];
     
     ventoy_img_chunk_list wimchunk;
     char envbuf[128];
     
-    (void)ctxt;
-    (void)argc;
+    debug("vlnk wim chain data begin <%s> ...\n", wimfile->name);
+
+    if (NULL == g_wimiso_chunk_list.chunk || NULL == g_wimiso_path)
+    {
+        grub_printf("ventoy not ready\n");
+        return 1;
+    }
+
+    imgoffset = ventoy_get_wim_iso_offset(g_wimiso_path);
+    if (imgoffset == 0)
+    {
+        grub_printf("image offset not found\n");
+        return 1;
+    }
+
+    if (0 != ventoy_get_wim_chunklist(wimfile, &wimchunk))
+    {
+        grub_printf("Failed to get wim chunklist\n");
+        return 1;
+    }
+    wimsize = wimfile->size;
+
+    file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", g_wimiso_path);
+    if (!file)
+    {
+        return 1;
+    }
+
+    boot_catlog = ventoy_get_iso_boot_catlog(file);
+
+    img_chunk1_size = g_wimiso_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
+    img_chunk2_size = wimchunk.cur_chunk * sizeof(ventoy_img_chunk);
+    override_size = sizeof(ventoy_override_chunk) + g_wimiso_size;
+
+    size = sizeof(ventoy_chain_head) + img_chunk1_size + img_chunk2_size + override_size;
+
+    pLastChain = grub_env_get("vtoy_chain_mem_addr");
+    if (pLastChain)
+    {
+        chain = (ventoy_chain_head *)grub_strtoul(pLastChain, NULL, 16);
+        if (chain)
+        {
+            debug("free last chain memory %p\n", chain);
+            grub_free(chain);
+        }
+    }
+
+    chain = grub_malloc(size);
+    if (!chain)
+    {
+        grub_printf("Failed to alloc chain memory size %u\n", size);
+        grub_file_close(file);
+        return 1;
+    }
+
+    grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
+    grub_env_set("vtoy_chain_mem_addr", envbuf);
+    grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
+    grub_env_set("vtoy_chain_mem_size", envbuf);
+
+    grub_memset(chain, 0, sizeof(ventoy_chain_head));
+
+    /* part 1: os parameter */
+    g_ventoy_chain_type = ventoy_chain_wim;
+    ventoy_fill_os_param(wimfile, &(chain->os_param));
+
+    /* part 2: chain head */
+    disk = wimfile->device->disk;
+    chain->disk_drive = disk->id;
+    chain->disk_sector_size = (1 << disk->log_sector_size);
+    chain->real_img_size_in_bytes = ventoy_align_2k(file->size) + ventoy_align_2k(wimsize);
+    chain->virt_img_size_in_bytes = chain->real_img_size_in_bytes;
+    chain->boot_catalog = boot_catlog;
+
+    if (!ventoy_is_efi_os())
+    {
+        grub_file_seek(file, boot_catlog * 2048);
+        grub_file_read(file, chain->boot_catalog_sector, sizeof(chain->boot_catalog_sector));
+    }
+
+    /* part 3: image chunk */
+    chain->img_chunk_offset = sizeof(ventoy_chain_head);
+    chain->img_chunk_num = g_wimiso_chunk_list.cur_chunk + wimchunk.cur_chunk;
+    grub_memcpy((char *)chain + chain->img_chunk_offset, g_wimiso_chunk_list.chunk, img_chunk1_size);
+
+    chunknode = (ventoy_img_chunk *)((char *)chain + chain->img_chunk_offset);
+    for (i = 0; i < g_wimiso_chunk_list.cur_chunk; i++)
+    {
+        chunknode->disk_end_sector = chunknode->disk_end_sector - chunknode->disk_start_sector;
+        chunknode->disk_start_sector = 0;
+        chunknode++;
+    }
+
+    /* fs cluster size >= 2048, so don't need to proc align */
+
+    /* align by 2048 */
+    chunknode = wimchunk.chunk + wimchunk.cur_chunk - 1;
+    i = (chunknode->disk_end_sector + 1 - chunknode->disk_start_sector) % 4;
+    if (i)
+    {
+        chunknode->disk_end_sector += 4 - i;
+    }
+
+    isosector = (grub_uint32_t)((file->size + 2047) / 2048);
+    for (i = 0; i < wimchunk.cur_chunk; i++)
+    {
+        chunknode = wimchunk.chunk + i;
+        chunknode->img_start_sector = isosector;
+        chunknode->img_end_sector = chunknode->img_start_sector + 
+            ((chunknode->disk_end_sector + 1 - chunknode->disk_start_sector) / 4) - 1;
+        isosector = chunknode->img_end_sector + 1;
+    }
+    
+    grub_memcpy((char *)chain + chain->img_chunk_offset + img_chunk1_size, wimchunk.chunk, img_chunk2_size);
+
+    /* part 4: override chunk */
+    chain->override_chunk_offset = chain->img_chunk_offset + img_chunk1_size + img_chunk2_size;
+    chain->override_chunk_num = 1;
 
 
-    debug("wim chain data begin <%s> ...\n", args[0]);
+    override = (ventoy_override_chunk *)((char *)chain + chain->override_chunk_offset);
+    override->img_offset = 0;
+    override->override_size = g_wimiso_size;
+
+    grub_file_seek(file, 0);
+    grub_file_read(file, override->override_data, file->size);
+    
+    dirent = (ventoy_iso9660_override *)(override->override_data + imgoffset);
+    dirent->first_sector    = (grub_uint32_t)((file->size + 2047) / 2048);
+    dirent->size            = (grub_uint32_t)(wimsize);
+    dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector);
+    dirent->size_be         = grub_swap_bytes32(dirent->size);
+
+    debug("imgoffset=%u first_sector=0x%x size=0x%x\n", imgoffset, dirent->first_sector, dirent->size);
+
+    if (ventoy_is_efi_os() == 0)
+    {
+        ventoy_windows_drive_map(chain);        
+    }
+
+    grub_file_close(file);
+
+    VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+
+static grub_err_t ventoy_normal_wim_chain_data(grub_file_t wimfile)
+{
+    grub_uint32_t i = 0;
+    grub_uint32_t imgoffset = 0;
+    grub_uint32_t size = 0;
+    grub_uint32_t isosector = 0;
+    grub_uint64_t wimsize = 0;
+    grub_uint32_t boot_catlog = 0;
+    grub_uint32_t img_chunk1_size = 0;
+    grub_uint32_t img_chunk2_size = 0;
+    grub_uint32_t override_size = 0;
+    grub_file_t file;
+    grub_disk_t disk;
+    const char *pLastChain = NULL;
+    ventoy_chain_head *chain;
+    ventoy_iso9660_override *dirent;
+    ventoy_img_chunk *chunknode;
+    ventoy_override_chunk *override;
+    ventoy_img_chunk_list wimchunk;
+    char envbuf[128];
+    
+    debug("normal wim chain data begin <%s> ...\n", wimfile->name);
 
     if (NULL == g_wimiso_chunk_list.chunk || NULL == g_wimiso_path)
     {
 
     if (NULL == g_wimiso_chunk_list.chunk || NULL == g_wimiso_path)
     {
@@ -2097,11 +2247,12 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
         return 1;
     }
 
         return 1;
     }
 
-    if (0 != ventoy_get_wim_chunklist(args[0], &wimchunk, &wimsize))
+    if (0 != ventoy_get_wim_chunklist(wimfile, &wimchunk))
     {
         grub_printf("Failed to get wim chunklist\n");
         return 1;
     }
     {
         grub_printf("Failed to get wim chunklist\n");
         return 1;
     }
+    wimsize = wimfile->size;
 
     file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", g_wimiso_path);
     if (!file)
 
     file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", g_wimiso_path);
     if (!file)
@@ -2214,6 +2365,33 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
+grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    grub_err_t ret;
+    grub_file_t wimfile;
+
+    (void)ctxt;
+    (void)argc;
+
+    wimfile = grub_file_open(args[0], VENTOY_FILE_TYPE);
+    if (!wimfile)
+    {
+        return 1;
+    }
+
+    if (wimfile->vlnk)
+    {
+        ret = ventoy_vlnk_wim_chain_data(wimfile);
+    }
+    else
+    {
+        ret = ventoy_normal_wim_chain_data(wimfile);
+    }
+
+    grub_file_close(wimfile);
+    return ret;
+}
+
 int ventoy_chain_file_size(const char *path)
 {
     int size;
 int ventoy_chain_file_size(const char *path)
 {
     int size;
index 6c4203cb8f43889fe414ff6d54b05936951ee19d..2d64b59023bdf78457b2b5053f45cc6b5beae0f3 100644 (file)
@@ -132,7 +132,8 @@ enum grub_file_type
 
     /* --skip-sig is specified.  */
     GRUB_FILE_TYPE_SKIP_SIGNATURE = 0x10000,
 
     /* --skip-sig is specified.  */
     GRUB_FILE_TYPE_SKIP_SIGNATURE = 0x10000,
-    GRUB_FILE_TYPE_NO_DECOMPRESS = 0x20000
+    GRUB_FILE_TYPE_NO_DECOMPRESS = 0x20000,
+    GRUB_FILE_TYPE_NO_VLNK = 0x40000,
   };
 
 /* File description.  */
   };
 
 /* File description.  */
@@ -141,6 +142,8 @@ struct grub_file
   /* File name.  */
   char *name;
 
   /* File name.  */
   char *name;
 
+  int vlnk;
+
   /* The underlying device.  */
   grub_device_t device;
 
   /* The underlying device.  */
   grub_device_t device;
 
@@ -213,6 +216,10 @@ grub_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, void *buf,
 grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
 grub_err_t EXPORT_FUNC(grub_file_close) (grub_file_t file);
 
 grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
 grub_err_t EXPORT_FUNC(grub_file_close) (grub_file_t file);
 
+int EXPORT_FUNC(grub_file_is_vlnk_suffix)(const char *name, int len);
+int EXPORT_FUNC(grub_file_add_vlnk)(const char *src, const char *dst);
+const char * EXPORT_FUNC(grub_file_get_vlnk)(const char *name, int *vlnk);
+
 /* Return value of grub_file_size() in case file size is unknown. */
 #define GRUB_FILE_SIZE_UNKNOWN  0xffffffffffffffffULL
 
 /* Return value of grub_file_size() in case file size is unknown. */
 #define GRUB_FILE_SIZE_UNKNOWN  0xffffffffffffffffULL
 
index 3955faa63a8160360b11a199fe803f124177205b..50b3a185854852941bb7701aa66ffb90081037e0 100644 (file)
@@ -128,5 +128,6 @@ grub_fs_unregister (grub_fs_t fs)
 #define FOR_FILESYSTEMS(var) FOR_LIST_ELEMENTS((var), (grub_fs_list))
 
 grub_fs_t EXPORT_FUNC(grub_fs_probe) (grub_device_t device);
 #define FOR_FILESYSTEMS(var) FOR_LIST_ELEMENTS((var), (grub_fs_list))
 
 grub_fs_t EXPORT_FUNC(grub_fs_probe) (grub_device_t device);
+grub_fs_t EXPORT_FUNC(grub_fs_list_probe) (grub_device_t device, const char **list);
 
 #endif /* ! GRUB_FS_HEADER */
 
 #endif /* ! GRUB_FS_HEADER */
index 0102ef59b91cc3a005c8d0055cd6cd0e62ebe7d7..9199fa4100a8436fbeb49147b5de13494f25aa45 100644 (file)
@@ -122,6 +122,8 @@ typedef struct ventoy_os_param
      * vtoy_reserved[3]: vtoy_iso_format     0:iso9660  1:udf
      * vtoy_reserved[4]: vtoy_windows_cd_prompt
      * vtoy_reserved[5]: vtoy_linux_remount
      * vtoy_reserved[3]: vtoy_iso_format     0:iso9660  1:udf
      * vtoy_reserved[4]: vtoy_windows_cd_prompt
      * vtoy_reserved[5]: vtoy_linux_remount
+     * vtoy_reserved[6]: vtoy_vlnk
+     * vtoy_reserved[7~10]: vtoy_disk_sig[4] used for vlnk
      *
      */
     grub_uint8_t   vtoy_reserved[32];    // Internal use by ventoy
      *
      */
     grub_uint8_t   vtoy_reserved[32];    // Internal use by ventoy
@@ -151,11 +153,23 @@ typedef struct ventoy_secure_data
     grub_uint8_t magic2[16];     /* VENTOY_GUID */
 }ventoy_secure_data;
 
     grub_uint8_t magic2[16];     /* VENTOY_GUID */
 }ventoy_secure_data;
 
+
+typedef struct ventoy_vlnk
+{
+    ventoy_guid   guid;         // VENTOY_GUID
+    grub_uint32_t crc32;        // crc32
+    grub_uint32_t disk_signature;
+    grub_uint64_t part_offset; // in bytes
+    char filepath[384];
+    grub_uint8_t reserved[96];
+}ventoy_vlnk;
+
 #pragma pack()
 
 // compile assert check : sizeof(ventoy_os_param) must be 512
 COMPILE_ASSERT(1,sizeof(ventoy_os_param) == 512);
 COMPILE_ASSERT(2,sizeof(ventoy_secure_data) == 4096);
 #pragma pack()
 
 // compile assert check : sizeof(ventoy_os_param) must be 512
 COMPILE_ASSERT(1,sizeof(ventoy_os_param) == 512);
 COMPILE_ASSERT(2,sizeof(ventoy_secure_data) == 4096);
+COMPILE_ASSERT(3,sizeof(ventoy_vlnk) == 512);
 
 
 
 
 
 
index c2f426a7b17efd348a31bb5e2d0d9d1da2db3f99..88bfe7389ad8e18f6d5725ca5e01d4d78d573810 100644 (file)
@@ -31,6 +31,7 @@ HEAD=$BUSYBOX_PATH/head
 VTOY_DM_PATH=/dev/mapper/ventoy
 VTOY_DEBUG_LEVEL=$($BUSYBOX_PATH/hexdump -n 1 -s 450 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
 VTOY_LINUX_REMOUNT=$($BUSYBOX_PATH/hexdump -n 1 -s 454 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
 VTOY_DM_PATH=/dev/mapper/ventoy
 VTOY_DEBUG_LEVEL=$($BUSYBOX_PATH/hexdump -n 1 -s 450 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
 VTOY_LINUX_REMOUNT=$($BUSYBOX_PATH/hexdump -n 1 -s 454 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
+VTOY_VLNK_BOOT=$($BUSYBOX_PATH/hexdump -n 1 -s 455 -e '1/1 "%02x"' $VTOY_PATH/ventoy_os_param)
 
 if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
     if [ -e /dev/console ]; then
 
 if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
     if [ -e /dev/console ]; then
@@ -65,12 +66,16 @@ set_ventoy_hook_finish() {
     echo 'Y' > $VTOY_PATH/hook_finish
 }
 
     echo 'Y' > $VTOY_PATH/hook_finish
 }
 
-get_ventoy_disk_name() {    
-    line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
-    if [ $? -eq 0 ]; then
-        echo ${line%%#*}
-    else    
-        echo "unknown"
+get_ventoy_disk_name() {
+    if [ "$VTOY_VLNK_BOOT" = "01" ]; then
+        $VTOY_PATH/tool/vtoydump -t /ventoy/ventoy_os_param
+    else
+        line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
+        if [ $? -eq 0 ]; then
+            echo ${line%%#*}
+        else    
+            echo "unknown"
+        fi
     fi
 }
 
     fi
 }
 
@@ -121,14 +126,6 @@ check_usb_disk_ready() {
     [ -e "${vtpart2}" ]
 }
 
     [ -e "${vtpart2}" ]
 }
 
-is_ventoy_disk() {
-    if $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c "$1"; then
-        $BUSYBOX_PATH/true
-    else
-        $BUSYBOX_PATH/false
-    fi
-}
-
 not_ventoy_disk() {
     if echo $1 | $EGREP -q "nvme.*p$|mmc.*p$|nbd.*p$"; then
         vtDiskName=${1:0:-1}
 not_ventoy_disk() {
     if echo $1 | $EGREP -q "nvme.*p$|mmc.*p$|nbd.*p$"; then
         vtDiskName=${1:0:-1}
@@ -136,10 +133,15 @@ not_ventoy_disk() {
         vtDiskName=$1
     fi
 
         vtDiskName=$1
     fi
 
-    if $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c "$vtDiskName"; then
-        $BUSYBOX_PATH/false
+    if [ "$VTOY_VLNK_BOOT" = "01" ]; then
+        vtVtoyDisk=$($VTOY_PATH/tool/vtoydump -t $VTOY_PATH/ventoy_os_param)
+        [ "$vtVtoyDisk" != "/dev/$vtDiskName" ]
     else
     else
-        $BUSYBOX_PATH/true
+        if $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c "$vtDiskName"; then
+            $BUSYBOX_PATH/false
+        else
+            $BUSYBOX_PATH/true
+        fi
     fi
 }
 
     fi
 }
 
@@ -803,7 +805,12 @@ is_inotify_ventoy_part() {
                 fi
                 
                 if [ -e /dev/$vtShortName ]; then
                 fi
                 
                 if [ -e /dev/$vtShortName ]; then
-                    $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c $vtShortName
+                    if [ "$VTOY_VLNK_BOOT" = "01" ]; then
+                        vtOrgDiskName=$($VTOY_PATH/tool/vtoydump -t $VTOY_PATH/ventoy_os_param)
+                        [ "$vtOrgDiskName" = "/dev/$vtShortName" ]
+                    else
+                        $VTOY_PATH/tool/vtoydump -f $VTOY_PATH/ventoy_os_param -c $vtShortName
+                    fi
                     return
                 fi
             fi
                     return
                 fi
             fi
index 2cf658ba31da5ae8eaf7564ad7363977a8bf3414..666a4e0b150c278ea52aa254e4b9ae0c2c772c0f 100644 (file)
@@ -129,6 +129,10 @@ mount -t devtmpfs dev /newdev
 cp -a /dev/mapper/ventoy* /newdev/mapper/
 cp -a /dev/ventoy* /newdev/
 
 cp -a /dev/mapper/ventoy* /newdev/mapper/
 cp -a /dev/ventoy* /newdev/
 
+if [ "$VTOY_VLNK_BOOT" = "01" ]; then
+    vtLine=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
+    vtdiskname=${vtLine%%#*}
+fi
 
 vtshortname="${vtdiskname#/dev/}"
 mv /newdev/${vtshortname} /newdev/backup_${vtshortname}
 
 vtshortname="${vtdiskname#/dev/}"
 mv /newdev/${vtshortname} /newdev/backup_${vtshortname}
index 2cf658ba31da5ae8eaf7564ad7363977a8bf3414..666a4e0b150c278ea52aa254e4b9ae0c2c772c0f 100644 (file)
@@ -129,6 +129,10 @@ mount -t devtmpfs dev /newdev
 cp -a /dev/mapper/ventoy* /newdev/mapper/
 cp -a /dev/ventoy* /newdev/
 
 cp -a /dev/mapper/ventoy* /newdev/mapper/
 cp -a /dev/ventoy* /newdev/
 
+if [ "$VTOY_VLNK_BOOT" = "01" ]; then
+    vtLine=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
+    vtdiskname=${vtLine%%#*}
+fi
 
 vtshortname="${vtdiskname#/dev/}"
 mv /newdev/${vtshortname} /newdev/backup_${vtshortname}
 
 vtshortname="${vtdiskname#/dev/}"
 mv /newdev/${vtshortname} /newdev/backup_${vtshortname}
index a435d5671fa8b362d5aaae237300b1ba1440f57e..92502d71cec5ecd8bc90072c635061b05ade0947 100644 (file)
@@ -26,6 +26,14 @@ Please refer https://www.ventoy.net/en/doc_start.html for details.
 1. sudo sh VentoyPlugson.sh 
 2. open your browser and visit http://127.0.0.1:24681
 
 1. sudo sh VentoyPlugson.sh 
 2. open your browser and visit http://127.0.0.1:24681
 
+========== VentoyVlnk.sh ===============
+Usage:  sudo sh VentoyVlnk.sh CMD FILE
+  CMD:
+   -c FILE      create vlnk for FILE
+   -l VLNK      parse vlnk file
+   -v           print verbose info
+   -h           print this help
+
 
 ========= VentoyGUI ===================
 VentoyGUI is native GUI program for Linux (GTK/QT)
 
 ========= VentoyGUI ===================
 VentoyGUI is native GUI program for Linux (GTK/QT)
index 4656e87a37a2301182c380904116f58291dfc765..2042c172682caddaedfe6c8b6162ee262cfd4f35 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/affs.mod and b/INSTALL/grub/arm64-efi/affs.mod differ
index e8982a9f61276d71b155001502622a8719378755..5bc5cb1d72894be1a1aaa2201faec6c2a4394f14 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/afs.mod and b/INSTALL/grub/arm64-efi/afs.mod differ
index e24a0998ed4b58919f5b1f54d81bf2a68fd5a476..fc7dae2ac9aaa064c3fb1975849154c8ab245da1 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/bfs.mod and b/INSTALL/grub/arm64-efi/bfs.mod differ
index 6dbb181b0dad26bf006c1795128d922324fb8777..ee546727b6371eb7aa8c821f9c2b841f3ec09873 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/btrfs.mod and b/INSTALL/grub/arm64-efi/btrfs.mod differ
index a59d1c0f088b1d322800d61c15c630d6b0cd777e..882413aade2287ad1d1a20ecdc66acb317661550 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/cbfs.mod and b/INSTALL/grub/arm64-efi/cbfs.mod differ
index d392b473adcf4574640f482a4a0bc74034046ed4..28e828f30f582c4a1b0c3749dfd9fc1b34afbef6 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/cmp.mod and b/INSTALL/grub/arm64-efi/cmp.mod differ
index 541fe71b8ce158091796da00422c369516286300..387d4b79747fa552cb77b77de58d48622b920a0b 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/cpio.mod and b/INSTALL/grub/arm64-efi/cpio.mod differ
index db0c096adec2517cc649002802db68c96e37c3a0..b2193f6ec6d5c953fb4f1a78545e82d82e1056cc 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/cpio_be.mod and b/INSTALL/grub/arm64-efi/cpio_be.mod differ
index eb62b75566a878537ed28eabee6e7c5f8d0fe22e..381880dfb9afcb335aacc9bddcae6b77d0b9297e 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/f2fs.mod and b/INSTALL/grub/arm64-efi/f2fs.mod differ
index 1c8029ec32be0e1f8d6e22f67ccbf86cafbd41e7..c624b64a1209687900daff972b8e8a6b5231b583 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/fdt.mod and b/INSTALL/grub/arm64-efi/fdt.mod differ
index 3018a844a9637b19761d3775938612d249218d92..3874910d0da6e26bb6937606917838b9813e3b7d 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/hexdump.mod and b/INSTALL/grub/arm64-efi/hexdump.mod differ
index 728d25937de4578389ed29e657cc7c944a2a6bc1..f4113b949944b815b3358404d6cd5080c3ba1b52 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/hfs.mod and b/INSTALL/grub/arm64-efi/hfs.mod differ
index aebbdd186bba631333cebc5130c96a2d4bf3fec7..c9139a138e9ec5ea38a2b4e6126fe54b97c39dc4 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/jfs.mod and b/INSTALL/grub/arm64-efi/jfs.mod differ
index 8c6a2a889ead2fd844a79051eeed65a02805ee94..eeb7f274a1e469a893f01c50cc6e16c4be331f5e 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/loadenv.mod and b/INSTALL/grub/arm64-efi/loadenv.mod differ
index 109f49fd16b6fa39cdf2c0eb7641f3e29b01b692..c2f1eb635952adf8c310e180f7575c9f7b1f68d5 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/macho.mod and b/INSTALL/grub/arm64-efi/macho.mod differ
index b69594604ec8d8033438a1fb394809aa2d11a624..39dec9a7b4772dcf307c11919fca88ea388619eb 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/minix.mod and b/INSTALL/grub/arm64-efi/minix.mod differ
index 01775e8d77e1d7ce326739f4626ec4c5042e4bfd..1c027b44bbc3a5bf9279c6580c28e38c788ede2d 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/minix2.mod and b/INSTALL/grub/arm64-efi/minix2.mod differ
index f8cf8f79e08a51879a9eb4427e27f6b47e5f387b..20b6276d334a0577153305647b29dbb2727e4ee9 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/minix2_be.mod and b/INSTALL/grub/arm64-efi/minix2_be.mod differ
index 0c61d0bafaeab34b4822383d8785dc0d0f447557..6585c7f8c3d463492679ab65358d00425cd2394f 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/minix3.mod and b/INSTALL/grub/arm64-efi/minix3.mod differ
index 91843b86b7e49a16a65a0e6a24ea7d2543dbbf7c..2192a11a203702afd9ee582a7abd82c860dabc46 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/minix3_be.mod and b/INSTALL/grub/arm64-efi/minix3_be.mod differ
index 0dc4c2a1cc5efab95bd3cc9c879315dcbf861022..154c4ab38fd65acf86876720159da27102e751f6 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/minix_be.mod and b/INSTALL/grub/arm64-efi/minix_be.mod differ
index 1a4cafcaa52cd0e2e025582e9404a76147802e2b..fad03460b1f0fc096c07ef545820526f1310987c 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/moddep.lst and b/INSTALL/grub/arm64-efi/moddep.lst differ
index 0742bc81b75e6a891269fc5e7c426052b3790f40..c207df9a1ba5cccf5b5fc40d22f792ea9275b75e 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/nilfs2.mod and b/INSTALL/grub/arm64-efi/nilfs2.mod differ
index a2557d46f775daac3b17915c9733a2724311d543..04ce41a707b22496175a509173be4c177388de03 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/normal.mod and b/INSTALL/grub/arm64-efi/normal.mod differ
index c7c13fbd9277c89b49ea6bd26888b5935b164b73..3ed3c1c48e5c2c1ee24108e0cb4a61393c5d7ea8 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/odc.mod and b/INSTALL/grub/arm64-efi/odc.mod differ
index e9eba9fce2292b4137c519b9502450e5ee479b69..397a1620e4d5e400484be7911e3430697198232b 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/offsetio.mod and b/INSTALL/grub/arm64-efi/offsetio.mod differ
index 05a1eec9ab4fc8efda14aaf91edfa438757b829f..c041eeecb2c4f9d32f31746d2415f7d81036c8c9 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/pgp.mod and b/INSTALL/grub/arm64-efi/pgp.mod differ
index fb59fcc7f6c06726717d2d4e806d1a2c30bad243..1c6933278a021e6fd861f46b144253f60cfadb84 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/procfs.mod and b/INSTALL/grub/arm64-efi/procfs.mod differ
index 86a5baeb29e170f96dca43e158cf343dd16bedc8..da0883ddd962b1580a6484da94b18c4ba23de0d0 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/progress.mod and b/INSTALL/grub/arm64-efi/progress.mod differ
index 46a19bc5fea82306da4f3c4995599dd7cf0c0283..c01126091f201ec473d31c2c975519f8212bb8c6 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/reiserfs.mod and b/INSTALL/grub/arm64-efi/reiserfs.mod differ
index b861540cc1781a5aa908a3bc046b461e16585e94..31c30ab42ffe6afe840f78cbddea334cfac2f289 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/romfs.mod and b/INSTALL/grub/arm64-efi/romfs.mod differ
index 299ed04ab0307c99b82aadc39005658433781e87..ae09a2ec4d35299a4e0eff079b0e713c244d088c 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/sfs.mod and b/INSTALL/grub/arm64-efi/sfs.mod differ
index 7aa0eaf4993b137d96c1999ffb4d052ac161b52f..c0660652cc25053ebbe61a4e9b19af4a2d661578 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/testload.mod and b/INSTALL/grub/arm64-efi/testload.mod differ
index 8698d99b34a14257fa66268da3287957ca550f76..778b672c2a5b6348da792896054b4b7f62e323f5 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/tga.mod and b/INSTALL/grub/arm64-efi/tga.mod differ
index 54480205108cf07cde276ac99b423ba245052881..a6d94954f8f717f7e76ed7c35ea543e5d052bf26 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/ufs1.mod and b/INSTALL/grub/arm64-efi/ufs1.mod differ
index 68c1788796c048338dd30f255ce3bb6a514e7eda..90fdc23237a674396d79e2c530125010cdcd6793 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/ufs1_be.mod and b/INSTALL/grub/arm64-efi/ufs1_be.mod differ
index c65ea87490a958aefed4579ca0d8a92de3ca396a..7b52727046d02053f2b4749ea201652bd157b866 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/ufs2.mod and b/INSTALL/grub/arm64-efi/ufs2.mod differ
index 0b389c4a54d8d41e9f148bf411401bd61fb1be44..bee98f5047c0b265b19cce2565e880009f64165e 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/verifiers.mod and b/INSTALL/grub/arm64-efi/verifiers.mod differ
index ae21ef0db0a4a8c18f2945b709add0550806fbbe..6d8d274839258e8db00b9ece05ffb0a64bac477a 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/xen_boot.mod and b/INSTALL/grub/arm64-efi/xen_boot.mod differ
index f83071a8843475c94b799f3b5e8faaf01b7aad7a..4ed99c2d8babb390d0bddbb4c655da2466e667fc 100644 (file)
Binary files a/INSTALL/grub/arm64-efi/zfs.mod and b/INSTALL/grub/arm64-efi/zfs.mod differ
index 950d38ced7283e2b6f132b7a15fc39f986303fcc..e110bc869fa39900f7afd6fc65dbc3455de407ab 100644 (file)
@@ -1390,7 +1390,19 @@ function efi_common_menuentry {
         return
     fi
     
         return
     fi
     
-    vt_concat_efi_iso "${vtoy_iso_part}${vt_chosen_path}" vtoy_iso_buf
+    unset vt_vlnk_dst
+    if vt_is_vlnk_name "${vt_chosen_path}"; then
+        vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
+        if [ -z "$vt_vlnk_dst" ]; then
+            echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"            
+            ventoy_pause
+            return
+        fi
+    else
+        vt_vlnk_dst="${vtoy_iso_part}${vt_chosen_path}"
+    fi
+    
+    vt_concat_efi_iso "${vt_vlnk_dst}" vtoy_iso_buf
     
     ventoy_debug_pause
     
     
     ventoy_debug_pause
     
@@ -1402,7 +1414,7 @@ function efi_common_menuentry {
     
     if [ -n "$vtoy_dotefi_retry" ]; then
         unset vtoy_dotefi_retry
     
     if [ -n "$vtoy_dotefi_retry" ]; then
         unset vtoy_dotefi_retry
-        chainloader "${vtoy_iso_part}${vt_chosen_path}"
+        chainloader "${vt_vlnk_dst}"
         boot
     fi
     
         boot
     fi
     
@@ -1438,17 +1450,6 @@ function vhdboot_common_func {
 }
 
 function vhd_common_menuentry {
 }
 
 function vhd_common_menuentry {
-
-    if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
-        if [ "$vtoy_iso_fs" != "ntfs" ]; then
-            echo -e "!!! WARNING !!!\n"
-            echo -e "\nPartition1 ($vtoy_iso_fs) is NOT ntfs, the VHD(x) file may not boot normally \n"
-            echo -e "\nVHD(x) 文件所在分区不是 ntfs 格式, 可能无法正常启动 \n\n"
-            echo -n "press ENTER to continue boot (请按 回车 键继续) ..."    
-            read vtInputKey
-        fi
-    fi
-
     vt_chosen_img_path vt_chosen_path vt_chosen_size
     
     if vt_check_password "${vt_chosen_path}"; then
     vt_chosen_img_path vt_chosen_path vt_chosen_size
     
     if vt_check_password "${vt_chosen_path}"; then
@@ -1459,7 +1460,28 @@ function vhd_common_menuentry {
         return
     fi
     
         return
     fi
     
-    vhdboot_common_func "${vt_chosen_path}"
+    unset vt_vlnk_dst
+    if vt_is_vlnk_name "${vt_chosen_path}"; then
+        vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
+        if [ -z "$vt_vlnk_dst" ]; then
+            echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"            
+            ventoy_pause
+            return
+        fi
+    else
+        vt_vlnk_dst="${vt_chosen_path}"
+        if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
+            if [ "$vtoy_iso_fs" != "ntfs" ]; then
+                echo -e "!!! WARNING !!!\n"
+                echo -e "\nPartition1 ($vtoy_iso_fs) is NOT ntfs, the VHD(x) file may not boot normally \n"
+                echo -e "\nVHD(x) 文件所在分区不是 ntfs 格式, 可能无法正常启动 \n\n"
+                echo -n "press ENTER to continue boot (请按 回车 键继续) ..."    
+                read vtInputKey
+            fi
+        fi
+    fi
+    
+    vhdboot_common_func "${vt_vlnk_dst}"
 }
 
 function vhd_unsupport_menuentry {
 }
 
 function vhd_unsupport_menuentry {
@@ -1535,7 +1557,19 @@ function vtoy_common_menuentry {
         return
     fi
     
         return
     fi
     
-    vtoyboot_common_func "${vtoy_iso_part}${vt_chosen_path}"
+    unset vt_vlnk_dst
+    if vt_is_vlnk_name "${vt_chosen_path}"; then
+        vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
+        if [ -z "$vt_vlnk_dst" ]; then
+            echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"            
+            ventoy_pause
+            return
+        fi
+    else
+        vt_vlnk_dst="${vtoy_iso_part}${vt_chosen_path}"
+    fi
+    
+    vtoyboot_common_func "${vt_vlnk_dst}"
 }
 
 function vtoy_unsupport_menuentry {
 }
 
 function vtoy_unsupport_menuentry {
@@ -2036,7 +2070,7 @@ function img_unsupport_menuentry {
 #############################################################
 #############################################################
 
 #############################################################
 #############################################################
 
-set VENTOY_VERSION="1.0.65"
+set VENTOY_VERSION="1.0.66"
 
 #ACPI not compatible with Window7/8, so disable by default
 set VTOY_PARAM_NO_ACPI=1
 
 #ACPI not compatible with Window7/8, so disable by default
 set VTOY_PARAM_NO_ACPI=1
@@ -2044,7 +2078,7 @@ set VTOY_PARAM_NO_ACPI=1
 # Default menu display mode, you can change it as you want.
 #    0: List mode   
 #    1: TreeView mode
 # Default menu display mode, you can change it as you want.
 #    0: List mode   
 #    1: TreeView mode
-set VTOY_DEFAULT_MENU_MODE=0
+set VTOY_DEFAULT_MENU_MODE=1
 
 set VTOY_MEM_DISK_STR="[Memdisk]"
 set VTOY_ISO_RAW_STR="Compatible Mode"
 
 set VTOY_MEM_DISK_STR="[Memdisk]"
 set VTOY_ISO_RAW_STR="Compatible Mode"
@@ -2156,6 +2190,7 @@ else
     set VTOY_HOTKEY_TIP="h:Help  F1:Memdisk  F2:Power  F3:ListView  F4:Localboot  F5:Tools  F6:ExMenu"
 fi
 
     set VTOY_HOTKEY_TIP="h:Help  F1:Memdisk  F2:Power  F3:ListView  F4:Localboot  F5:Tools  F6:ExMenu"
 fi
 
+terminal_output  console
 
 if [ -n "$vtoy_gfxmode" ]; then
     set gfxmode=$vtoy_gfxmode
 
 if [ -n "$vtoy_gfxmode" ]; then
     set gfxmode=$vtoy_gfxmode
index 8ba2f262958800b68677bb60a8a24aac5a625413..17e12fe79eb4eb698bde13a04a05e8e0cd2a9749 100644 (file)
Binary files a/INSTALL/grub/i386-efi/affs.mod and b/INSTALL/grub/i386-efi/affs.mod differ
index 422605487f9863bc9edd57f811d678d2c54394c6..eedba846150abc4351732cebd3c62a88e170227d 100644 (file)
Binary files a/INSTALL/grub/i386-efi/afs.mod and b/INSTALL/grub/i386-efi/afs.mod differ
index 3e3ce9b1b46b19ed41e29cc469877c33e6bbde93..35c79ce8d498c86e25f0c6e2db010debb61e83c3 100644 (file)
Binary files a/INSTALL/grub/i386-efi/aout.mod and b/INSTALL/grub/i386-efi/aout.mod differ
index e69b08278d6c073ee58d7a0e6c2cb49144961e8a..2a8f9e9932fa67c28b7adadacc40e8c1fac0807b 100644 (file)
Binary files a/INSTALL/grub/i386-efi/bfs.mod and b/INSTALL/grub/i386-efi/bfs.mod differ
index ea3e86f9e01c20eca377f9eb3f11b62fd8e951ae..05b6c5832c1ecbc0b9fe8dce01258d411b7afabd 100644 (file)
Binary files a/INSTALL/grub/i386-efi/bsd.mod and b/INSTALL/grub/i386-efi/bsd.mod differ
index 20f080db03e0e4440f91df4f1d310c167c27e0ba..1ad0b8721313d5dcfd5afb7c99f2e8b808819a61 100644 (file)
Binary files a/INSTALL/grub/i386-efi/btrfs.mod and b/INSTALL/grub/i386-efi/btrfs.mod differ
index 7a6fa09476399822e672b8f871506e522290b1f3..25868f62ca2a9cdb5abb4d2323e8fc470c9364af 100644 (file)
Binary files a/INSTALL/grub/i386-efi/cbfs.mod and b/INSTALL/grub/i386-efi/cbfs.mod differ
index e9eb48e30931cb554ff0f622ebca42caa3d07ce4..7373cd6fc1b8d8d54c14298e70d09c8c7923c930 100644 (file)
Binary files a/INSTALL/grub/i386-efi/cmp.mod and b/INSTALL/grub/i386-efi/cmp.mod differ
index f23822c95cde5b25b8bc565f7194e02da12de187..b06a5898f6731dea91e6ad80baf73c2c6dfa1b4e 100644 (file)
Binary files a/INSTALL/grub/i386-efi/cpio.mod and b/INSTALL/grub/i386-efi/cpio.mod differ
index 60714628533b6039820917370b35d95bae513d48..e974c657863f21232b561e13cd5adef72479b2a5 100644 (file)
Binary files a/INSTALL/grub/i386-efi/cpio_be.mod and b/INSTALL/grub/i386-efi/cpio_be.mod differ
index b245c9d6e11a14aef6657850d0ffc9a204e0e335..3a391f2001496d5846d0e6ac88bed08577827e27 100644 (file)
Binary files a/INSTALL/grub/i386-efi/f2fs.mod and b/INSTALL/grub/i386-efi/f2fs.mod differ
index 5cb22caca46a170cc2083b584b8f904d4c8259c6..f99f5864c7b166029ea8ff888a2b1814a4328bfd 100644 (file)
Binary files a/INSTALL/grub/i386-efi/hexdump.mod and b/INSTALL/grub/i386-efi/hexdump.mod differ
index 7e44a334d65ec31a8584e214f20e353732d9512c..abd125c7947d467a986b03934db575ef7465301b 100644 (file)
Binary files a/INSTALL/grub/i386-efi/hfs.mod and b/INSTALL/grub/i386-efi/hfs.mod differ
index d247fb56cc45bb8d553fbcf06d8a3c111012b4b6..0feab322d55813f65a2a0b769bbfefec1312d1d3 100644 (file)
Binary files a/INSTALL/grub/i386-efi/jfs.mod and b/INSTALL/grub/i386-efi/jfs.mod differ
index 9edbda4ab2d7b92d80d1d716f5775d517f1e4f84..9a0a1b4d9605bdb8b332ff33a6ce512e4c5b4654 100644 (file)
Binary files a/INSTALL/grub/i386-efi/linux16.mod and b/INSTALL/grub/i386-efi/linux16.mod differ
index 0601fe219b53ea84fe118e12d12b60d3a2af25da..91f19b4468fcb20c8957611826282307076acb52 100644 (file)
Binary files a/INSTALL/grub/i386-efi/loadbios.mod and b/INSTALL/grub/i386-efi/loadbios.mod differ
index d32017db7ef30c7cd9999c8238b000335b8a4fb6..c7619f55318521d47009c35de2939e511d08331b 100644 (file)
Binary files a/INSTALL/grub/i386-efi/loadenv.mod and b/INSTALL/grub/i386-efi/loadenv.mod differ
index b97d10505124228d96b9b93a0d33a424e85a9075..beec10ec67a610c076a79208c2e7b322b901d5f0 100644 (file)
Binary files a/INSTALL/grub/i386-efi/macho.mod and b/INSTALL/grub/i386-efi/macho.mod differ
index 08c6f71353220c2b2237557526ec3b1255bd1330..a3d1c02e7a74bd74501c6baf7cf04888ebdaff40 100644 (file)
Binary files a/INSTALL/grub/i386-efi/minix.mod and b/INSTALL/grub/i386-efi/minix.mod differ
index 372fec6a2492ef05b56492722a6822de7271e19d..0c73e4e897d79e05a189c8aa61dfa6ecae39f96a 100644 (file)
Binary files a/INSTALL/grub/i386-efi/minix2.mod and b/INSTALL/grub/i386-efi/minix2.mod differ
index 34867dde1bb7b7f04d85c3f1e3d3bced7fc77d4c..4b6ce2f13335ef3f5992798edfa36db627483d51 100644 (file)
Binary files a/INSTALL/grub/i386-efi/minix2_be.mod and b/INSTALL/grub/i386-efi/minix2_be.mod differ
index 0e886a888bb40d4fda3be6e3a4380469c9a6fdad..1f4f704efb838c1883c9c4596c7ab6bcc7513f21 100644 (file)
Binary files a/INSTALL/grub/i386-efi/minix3.mod and b/INSTALL/grub/i386-efi/minix3.mod differ
index f9eaba5b03429d41d16f9758afd6863b9c112228..194da0f6b2e0664adb5766cc2da92a209109addd 100644 (file)
Binary files a/INSTALL/grub/i386-efi/minix3_be.mod and b/INSTALL/grub/i386-efi/minix3_be.mod differ
index 2b2a0f137675b88a1f45474bdc830bfaf5cf527b..04ee8f17f6515f48841a5ff29051a962c142c4e3 100644 (file)
Binary files a/INSTALL/grub/i386-efi/minix_be.mod and b/INSTALL/grub/i386-efi/minix_be.mod differ
index 479d6bd5ffe82e16505ef52d56f7457768a983a0..82ae547ababdbca19b5abb65e00356cd0abb1c3a 100644 (file)
@@ -120,7 +120,7 @@ ehci: cs5536 usb boot
 crypto:
 part_bsd: part_msdos
 cs5536:
 crypto:
 part_bsd: part_msdos
 cs5536:
-ventoy: elf fshelp ext2 btrfs font crypto gcry_md5 exfat udf extcmd datetime div normal video gcry_sha1 iso9660
+ventoy: fshelp ext2 elf btrfs font crypto gcry_md5 exfat udf div extcmd datetime normal video gcry_sha1 iso9660
 gcry_sha512: crypto
 password: crypto normal
 fshelp:
 gcry_sha512: crypto
 password: crypto normal
 fshelp:
index 12519fd4f02747aee7f0b53733156405c53d85da..0a80010b2bbea038711262460464836c13c875c3 100644 (file)
Binary files a/INSTALL/grub/i386-efi/multiboot.mod and b/INSTALL/grub/i386-efi/multiboot.mod differ
index c05719f793b31bf880d301c62afae12973341d75..ed46eeace224361dbcca647ca58584f46c49a21a 100644 (file)
Binary files a/INSTALL/grub/i386-efi/multiboot2.mod and b/INSTALL/grub/i386-efi/multiboot2.mod differ
index 1779ad09ca890c5b7cd29998626a95e16d204526..6063443bd83e3d03c18f52231ad31b523e921de5 100644 (file)
Binary files a/INSTALL/grub/i386-efi/nativedisk.mod and b/INSTALL/grub/i386-efi/nativedisk.mod differ
index 4adb48c30da0413fd54e4e9f0450953ad4352054..02e7572a7a4ff09479253b9519f9b899917b8e12 100644 (file)
Binary files a/INSTALL/grub/i386-efi/nilfs2.mod and b/INSTALL/grub/i386-efi/nilfs2.mod differ
index fe35b9c60155926facd4f871c44e0339ec8c5ef3..467046ff3f65c6cdb4bfb8b23209206ce28ab1c9 100644 (file)
Binary files a/INSTALL/grub/i386-efi/normal.mod and b/INSTALL/grub/i386-efi/normal.mod differ
index a115affef7506e8f559bcfdbedd00ed225294b97..614418a04d975f8f9639af6b52745b0388d98b53 100644 (file)
Binary files a/INSTALL/grub/i386-efi/odc.mod and b/INSTALL/grub/i386-efi/odc.mod differ
index aa681a7ae742d21f449fa79ff9b6a391a19647ca..62500890c21f07167ccd0169b68df13b62b44d58 100644 (file)
Binary files a/INSTALL/grub/i386-efi/offsetio.mod and b/INSTALL/grub/i386-efi/offsetio.mod differ
index fc27231395e0e0093c8acd716e0f60415610590e..0e78e8f0c15d25278bce7c50cd51335e21de4611 100644 (file)
Binary files a/INSTALL/grub/i386-efi/pgp.mod and b/INSTALL/grub/i386-efi/pgp.mod differ
index e30dd2bb1575ed36efc73e91e3bbb8ba86d5bfd5..04b27e2d5d93510cfe0e59fc6b3e13f3bf35644d 100644 (file)
Binary files a/INSTALL/grub/i386-efi/procfs.mod and b/INSTALL/grub/i386-efi/procfs.mod differ
index ee1481d82f42dcded66f0e6defdb97e319d3143a..c8b00fd62f876af1d5d9d716205cf771a519ab14 100644 (file)
Binary files a/INSTALL/grub/i386-efi/progress.mod and b/INSTALL/grub/i386-efi/progress.mod differ
index 6c85ff89720ab0614a1fc11afad3fc913aa4f09b..e8dfb86358914a05f09066a49428739eb78a3e3e 100644 (file)
Binary files a/INSTALL/grub/i386-efi/reiserfs.mod and b/INSTALL/grub/i386-efi/reiserfs.mod differ
index 34f5955f63d364b97d6ba49600165a73e8d741dd..db077c14b94090de1757b9a274ef02e33cc67343 100644 (file)
Binary files a/INSTALL/grub/i386-efi/romfs.mod and b/INSTALL/grub/i386-efi/romfs.mod differ
index 97103deeb0379ecba1990c5be2e969dc5a1ab655..8f4eb833edffd2691e27ebfc9c45b358dd89b678 100644 (file)
Binary files a/INSTALL/grub/i386-efi/sfs.mod and b/INSTALL/grub/i386-efi/sfs.mod differ
index e053e2831757e6d8e17dd9e84b54c3e028da9145..addd9ec16870f0ceb69b7d922c7835edbc322959 100644 (file)
Binary files a/INSTALL/grub/i386-efi/testload.mod and b/INSTALL/grub/i386-efi/testload.mod differ
index 16523b6e52cb1c81aba3790994c1c9fe1e35ba84..62d9a39cf1bf5d24f95d6361ab78ea3025f92625 100644 (file)
Binary files a/INSTALL/grub/i386-efi/tga.mod and b/INSTALL/grub/i386-efi/tga.mod differ
index dc06fcab7b2efc7df669850ba949775f5518b8b0..70356dfb070ee1e35f9e2569edd12bfc66ae633c 100644 (file)
Binary files a/INSTALL/grub/i386-efi/ufs1.mod and b/INSTALL/grub/i386-efi/ufs1.mod differ
index 4371324ccc70a44c1ec88ce51122311f2936af83..160b7ac4ad2d60bff58e6283e17b7bf3310df0ee 100644 (file)
Binary files a/INSTALL/grub/i386-efi/ufs1_be.mod and b/INSTALL/grub/i386-efi/ufs1_be.mod differ
index a4a939b6f2a81d064b2b119db7b4201bf71aef88..2754630db0a003deda45ce1471cfeaa3f05e8d61 100644 (file)
Binary files a/INSTALL/grub/i386-efi/ufs2.mod and b/INSTALL/grub/i386-efi/ufs2.mod differ
index 7bd45fe8a51e5d648c008eebcf86409f09ba3206..00ca55f6a40b23d5f331f193baaae4633881a7a4 100644 (file)
Binary files a/INSTALL/grub/i386-efi/verifiers.mod and b/INSTALL/grub/i386-efi/verifiers.mod differ
index 6f71890e2fe3d77cda679795af2e0c6dbdf24fdd..b1e874a190cb470fc432b37535e5af5338050a3a 100644 (file)
Binary files a/INSTALL/grub/i386-efi/xnu.mod and b/INSTALL/grub/i386-efi/xnu.mod differ
index 0f9ee6a93d04b0bf687d4bb2d52720c4663b3db0..b5fa5d532034a84f3facda0d0e3fe1a7e66ebefd 100644 (file)
Binary files a/INSTALL/grub/i386-efi/zfs.mod and b/INSTALL/grub/i386-efi/zfs.mod differ
index 8768848c1c6a2ff59c3a27aee34007d5b5ac95b7..1c28ba86b8373bf5174db22d5babfcf56ce87305 100644 (file)
Binary files a/INSTALL/grub/i386-pc/acpi.mod and b/INSTALL/grub/i386-pc/acpi.mod differ
index 1aabc41c4754fe2c3a94db0a7b00572bdef392de..aad7f0e731dcc1aeb937c82c45403be98fc363ae 100644 (file)
Binary files a/INSTALL/grub/i386-pc/affs.mod and b/INSTALL/grub/i386-pc/affs.mod differ
index 020612f3780c4d8a9302b4dd855cb9108049ade1..495bc81572c8b44aef93aba0954318e98b725e2f 100644 (file)
Binary files a/INSTALL/grub/i386-pc/afs.mod and b/INSTALL/grub/i386-pc/afs.mod differ
index e775a1eb1a824c33984d1a30e8f7e59b660a2b5c..189c8477414bbb7683c4fc1fc6ad87df7a770c6c 100644 (file)
Binary files a/INSTALL/grub/i386-pc/aout.mod and b/INSTALL/grub/i386-pc/aout.mod differ
index 07ac64568ef0e519fa7940c415eca054a3f85c35..427ce266a067140e7e742ff9bd882d0ff181153c 100644 (file)
Binary files a/INSTALL/grub/i386-pc/bfs.mod and b/INSTALL/grub/i386-pc/bfs.mod differ
index 8b46a1876aea0ecfdef61ef35d8c4fb3477e85e5..02687ffb015626d743bb2c26bff4f7e6c42f7e8b 100644 (file)
Binary files a/INSTALL/grub/i386-pc/bitmap_scale.mod and b/INSTALL/grub/i386-pc/bitmap_scale.mod differ
index 51d7358d9a41d96ce1a0114ae299df45a55e51f6..35f1bcbbd3371da656b0991e870666faad16f117 100644 (file)
Binary files a/INSTALL/grub/i386-pc/bsd.mod and b/INSTALL/grub/i386-pc/bsd.mod differ
index 25aa06e287676a2fdd2f3bd4db2a6b2250648cfb..f56207fa11c970ca9443d2e665e8d06b9b6f9e98 100644 (file)
Binary files a/INSTALL/grub/i386-pc/btrfs.mod and b/INSTALL/grub/i386-pc/btrfs.mod differ
index 73bd58e98cd10825a399aed4f46fbeabad654b6c..6db404b64aa79f5b24852390b6b3cad9472655eb 100644 (file)
Binary files a/INSTALL/grub/i386-pc/bufio.mod and b/INSTALL/grub/i386-pc/bufio.mod differ
index 578ed2cd4c092e2dcdcce1b4a5a9ad5af8341c13..987e9aa03f96a1533e24784e9850160f16488c9a 100644 (file)
Binary files a/INSTALL/grub/i386-pc/cbfs.mod and b/INSTALL/grub/i386-pc/cbfs.mod differ
index d5155d7e3584130c7dc3130d73237f5dc053a19b..e482c30594d2bddc352ecc220c0b0d9414ad9edd 100644 (file)
Binary files a/INSTALL/grub/i386-pc/cmp.mod and b/INSTALL/grub/i386-pc/cmp.mod differ
index 2dabb509dda14cfeb8fa28ae5b3298480381e3c2..d94561e0af61fef967754754d18c074881d7624b 100644 (file)
Binary files a/INSTALL/grub/i386-pc/core.img and b/INSTALL/grub/i386-pc/core.img differ
index 550b2af19037a37de822b8c03ffd48b5131b9f81..6bf0ef06aca510ba0117e93a1995bdaa38717df2 100644 (file)
Binary files a/INSTALL/grub/i386-pc/cpio.mod and b/INSTALL/grub/i386-pc/cpio.mod differ
index 42776b174216b270534446fbd2f4bfcb76031f82..3b0df64a90375ad94a3c14cc4be4b84d0ea65241 100644 (file)
Binary files a/INSTALL/grub/i386-pc/cpio_be.mod and b/INSTALL/grub/i386-pc/cpio_be.mod differ
index 88fd5f0a357e97636f8d1938f8bc2594b952195e..b6ea6986be57cede000a7a586b0283c64ec6d19a 100644 (file)
Binary files a/INSTALL/grub/i386-pc/efiemu.mod and b/INSTALL/grub/i386-pc/efiemu.mod differ
index f0fe6fd17ba4e18a37ad48c32c1e89767649d3de..fa9ed6cf633c84ab497ea87ab6168d1f7bf7b3bc 100644 (file)
Binary files a/INSTALL/grub/i386-pc/f2fs.mod and b/INSTALL/grub/i386-pc/f2fs.mod differ
index 08cabd0e3c5d20f45289672adcd9057ae93a0b66..0ea367b8dc50aea0061b8e77f64d8a725793d849 100644 (file)
Binary files a/INSTALL/grub/i386-pc/freedos.mod and b/INSTALL/grub/i386-pc/freedos.mod differ
index 7ccea1764a398f7c5dba2af65888e15ba1dd1568..93837fed9b85f6d9e7ee5f44461dd7d024f3d1ed 100644 (file)
Binary files a/INSTALL/grub/i386-pc/hexdump.mod and b/INSTALL/grub/i386-pc/hexdump.mod differ
index eb1134c6c8e41b8dee333a8a132442732f834460..a8d2d8f01720c9708da6b57c3776a483fee44a72 100644 (file)
Binary files a/INSTALL/grub/i386-pc/hfs.mod and b/INSTALL/grub/i386-pc/hfs.mod differ
index f07eedb40d9f6aee397de8f354dc5361dbb633f4..72938300a080618821b3cc6bc444150c52cc02a1 100644 (file)
Binary files a/INSTALL/grub/i386-pc/hfsplus.mod and b/INSTALL/grub/i386-pc/hfsplus.mod differ
index 1dbc26848995b6bd35285199032f66d0878abdca..028c65816955f7385d748f78b78e57955e94da12 100644 (file)
Binary files a/INSTALL/grub/i386-pc/jfs.mod and b/INSTALL/grub/i386-pc/jfs.mod differ
index 683cd9047b325cd70561ba5a114fa52d4d119291..834e8d91b1dc96754c6e71c963224c6e103afab8 100644 (file)
Binary files a/INSTALL/grub/i386-pc/loadenv.mod and b/INSTALL/grub/i386-pc/loadenv.mod differ
index c4a88ceff8b373ba060621ce684a833368b609f6..6aa4cf51b83221828fe8d52f7ee276810840ea66 100644 (file)
Binary files a/INSTALL/grub/i386-pc/macho.mod and b/INSTALL/grub/i386-pc/macho.mod differ
index 87477bff115d6d494ea3fde35af8acf5c1b0cf19..87064eea747dbb807c3ec9df6ab8be8c3e16ec7b 100644 (file)
Binary files a/INSTALL/grub/i386-pc/minix.mod and b/INSTALL/grub/i386-pc/minix.mod differ
index 01d2f609ba74bb80c0e1a73f5dbe0467bfbb38b2..0d0b6d2995b59487def838ffe2f3715ed1352181 100644 (file)
Binary files a/INSTALL/grub/i386-pc/minix2.mod and b/INSTALL/grub/i386-pc/minix2.mod differ
index 260e1e7bb0bf359bf02751e1b71c6105507d75d6..e383aa5693d89142d8ba5b1ad7bc801f6d097ef5 100644 (file)
Binary files a/INSTALL/grub/i386-pc/minix2_be.mod and b/INSTALL/grub/i386-pc/minix2_be.mod differ
index 256f5d71bcd73b7e3632feee0313d6275d332690..f96fb45c88965d16c9ceb2806872547656eb3ffb 100644 (file)
Binary files a/INSTALL/grub/i386-pc/minix3.mod and b/INSTALL/grub/i386-pc/minix3.mod differ
index 7212cb60083b0c22bf7df9a57d7d7ca6cd6c5570..d3dca213dfb416f4f43976e4f567a2e9e400499a 100644 (file)
Binary files a/INSTALL/grub/i386-pc/minix3_be.mod and b/INSTALL/grub/i386-pc/minix3_be.mod differ
index cf7f0462faccaf521732b14cb19eea7c136b10a7..604dffea644bccaf4608c0cb09c5b9ad83463f61 100644 (file)
Binary files a/INSTALL/grub/i386-pc/minix_be.mod and b/INSTALL/grub/i386-pc/minix_be.mod differ
index df8a186430b7e7ab3577717746eb85520f76b70b..d205b28a15c8dfb8a3ec86bf443d797fced0f761 100644 (file)
@@ -123,7 +123,7 @@ crypto:
 part_bsd: part_msdos
 cs5536: pci
 biosdisk:
 part_bsd: part_msdos
 cs5536: pci
 biosdisk:
-ventoy: elf fshelp ext2 btrfs font crypto gcry_md5 exfat udf extcmd datetime div normal video gcry_sha1 iso9660 acpi
+ventoy: elf fshelp ext2 btrfs font crypto gcry_md5 exfat udf div extcmd datetime normal video gcry_sha1 iso9660 acpi
 lsapm:
 gcry_sha512: crypto
 password: crypto normal
 lsapm:
 gcry_sha512: crypto
 password: crypto normal
index 0547a54d5c39376839a377a64328a72bccc9ea31..a327afe21a9960190b07b44f92dc78e6ef4f3f12 100644 (file)
Binary files a/INSTALL/grub/i386-pc/multiboot.mod and b/INSTALL/grub/i386-pc/multiboot.mod differ
index a4879c75dd29d8d0fdcc321144d730727d22a55a..9f6f775f8022c4b5ccfbd5c9f806a4c1259024f6 100644 (file)
Binary files a/INSTALL/grub/i386-pc/multiboot2.mod and b/INSTALL/grub/i386-pc/multiboot2.mod differ
index df1a07df58c4b844feb5f0cd416f551d4df0afeb..f77fd13a8944b2135ff32bf4da65d38c7bcbabda 100644 (file)
Binary files a/INSTALL/grub/i386-pc/nativedisk.mod and b/INSTALL/grub/i386-pc/nativedisk.mod differ
index 337527031622e9b0fd5f01e70c3fa4f6e8d04c37..182fed555e07c7fc0f67c429cac97eba993dacf4 100644 (file)
Binary files a/INSTALL/grub/i386-pc/net.mod and b/INSTALL/grub/i386-pc/net.mod differ
index 3d2b1387b6687cd4361e85cd6fd1963e9ea20b6d..a1baea367de5f29a28ffc95cd12ed1241cfac58c 100644 (file)
Binary files a/INSTALL/grub/i386-pc/nilfs2.mod and b/INSTALL/grub/i386-pc/nilfs2.mod differ
index bf6ef93f24aa707269a64f154989a3cfd32f3b01..36bda9121733a5ca6e2e41a99af8e1cea4037026 100644 (file)
Binary files a/INSTALL/grub/i386-pc/odc.mod and b/INSTALL/grub/i386-pc/odc.mod differ
index 9db26d07ab852faf7437594c8354c35035ffc459..be57ff598558bb6dc6a8b0b5334908cadf43a12b 100644 (file)
Binary files a/INSTALL/grub/i386-pc/offsetio.mod and b/INSTALL/grub/i386-pc/offsetio.mod differ
index 3270fff7ebaa952831769b84eae4e680122bc35c..a487fdf9f0366e063dda16ff7b9caee8250b7de7 100644 (file)
Binary files a/INSTALL/grub/i386-pc/pgp.mod and b/INSTALL/grub/i386-pc/pgp.mod differ
index 4845df3417d2cbd30a92a7169932ed2438b42e38..2fccdbc4dcfb5c9924a5654b33a6523f14d24017 100644 (file)
Binary files a/INSTALL/grub/i386-pc/plan9.mod and b/INSTALL/grub/i386-pc/plan9.mod differ
index a0e20ec428a572cfe2f15789d5e2133102f8a1a5..b67ff465840bfd3985ccfe501f2d7aeb344864a1 100644 (file)
Binary files a/INSTALL/grub/i386-pc/procfs.mod and b/INSTALL/grub/i386-pc/procfs.mod differ
index 67dd96e85d82bb799dbc4125ba7e192ecc646516..c93b2420274e5d10e3535d724c014b6f43529dbf 100644 (file)
Binary files a/INSTALL/grub/i386-pc/progress.mod and b/INSTALL/grub/i386-pc/progress.mod differ
index 2a1bc6afc5650d493120f5ed105ba6c9246c1ec9..627626ed9b8e731201556e11980d4b12575e5a62 100644 (file)
Binary files a/INSTALL/grub/i386-pc/pxechain.mod and b/INSTALL/grub/i386-pc/pxechain.mod differ
index c51d8f636b42d6ca9d5ad0f39b022e0a3810f39e..853fe5005965fca4affd9446d18c43d048dd8752 100644 (file)
Binary files a/INSTALL/grub/i386-pc/reiserfs.mod and b/INSTALL/grub/i386-pc/reiserfs.mod differ
index d420e23604fb80e3a58490fa26a947f88c63431e..e154ab9878f1ead54fc93225ed961effb2249c25 100644 (file)
Binary files a/INSTALL/grub/i386-pc/romfs.mod and b/INSTALL/grub/i386-pc/romfs.mod differ
index 3cf881b432dae73896f5218a1e895c9eb62d5d1a..86240a7aca8b5e74044933fb5257998d2feb98fe 100644 (file)
Binary files a/INSTALL/grub/i386-pc/sfs.mod and b/INSTALL/grub/i386-pc/sfs.mod differ
index 1d428810108b7fb13114b86183aadeec9adafc96..27965dee9e7bfa071a10325f771ad545e7d924ce 100644 (file)
Binary files a/INSTALL/grub/i386-pc/testload.mod and b/INSTALL/grub/i386-pc/testload.mod differ
index c8fcd0b5f3a085efa4be3e0f6d6be49fbb777fc5..9b333d79f14e81c770d30e4348752058beadcb95 100644 (file)
Binary files a/INSTALL/grub/i386-pc/tga.mod and b/INSTALL/grub/i386-pc/tga.mod differ
index 4772a2026e5f33112e322c9617ceae944120b9b5..e2e7f9a785994cbcd09acf5537145e303a5ff73d 100644 (file)
Binary files a/INSTALL/grub/i386-pc/ufs1.mod and b/INSTALL/grub/i386-pc/ufs1.mod differ
index 31a50d7c2ced3341f15896a27c2bfe9287db0aee..f615f3c93d7ab5a86d1bb9517f7f48e9e510b2f7 100644 (file)
Binary files a/INSTALL/grub/i386-pc/ufs1_be.mod and b/INSTALL/grub/i386-pc/ufs1_be.mod differ
index 088fba3929d43b592c3283854fb36c8535dc8bba..f1b01d75cc3954583ec27fb16893314c416a0521 100644 (file)
Binary files a/INSTALL/grub/i386-pc/ufs2.mod and b/INSTALL/grub/i386-pc/ufs2.mod differ
index f7b8ab91a197cfbfdbd3d5ad50c39ed67079e48c..c2dd20758729d23007685f88e5aae0a3a09e843c 100644 (file)
Binary files a/INSTALL/grub/i386-pc/verifiers.mod and b/INSTALL/grub/i386-pc/verifiers.mod differ
index 96c2e58356d749bbadbdb27446c0158489c3d4ff..6aa059060dd921b15387c29cb5cfb0ccc27eb305 100644 (file)
Binary files a/INSTALL/grub/i386-pc/xnu.mod and b/INSTALL/grub/i386-pc/xnu.mod differ
index 28adaa654ee2b60ddaa695e7c5a836845b673353..eb5d3264a874e9692beab894605c4051929459d8 100644 (file)
Binary files a/INSTALL/grub/i386-pc/zfs.mod and b/INSTALL/grub/i386-pc/zfs.mod differ
index 80ee7eccf06121a6b6c211ec3395fdd044800530..79f7d3b83ba20d56ff525ae265772dcca47b3d23 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/affs.mod and b/INSTALL/grub/mips64el-efi/affs.mod differ
index fe2a1c81ff3f26e99a4520c0cf5555ab627ab801..e09eb7b932edbd74f2827f60f766a39e1fde7738 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/afs.mod and b/INSTALL/grub/mips64el-efi/afs.mod differ
index 133bc607e0c90629e1fc63407fa64e7908d85cda..cb28a88e415c4c1156b773a74b3e757955abb916 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/bfs.mod and b/INSTALL/grub/mips64el-efi/bfs.mod differ
index d268085ba7150c3b9c41b8cd98698b6000419436..e3b549b75f343631c004987d19feca755b973d4c 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/btrfs.mod and b/INSTALL/grub/mips64el-efi/btrfs.mod differ
index c3c2bfaab63ff8efd4d1d9b37ff977a614ceccc3..c95efc9a1bef86ac8c8ae3abd910e70118c14653 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/cbfs.mod and b/INSTALL/grub/mips64el-efi/cbfs.mod differ
index 98de3928690e2db425b4ab3a2114f1ce95399aa4..09e90e533b5abf180e58a7d12223ff80e94dd54c 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/cmp.mod and b/INSTALL/grub/mips64el-efi/cmp.mod differ
index 1df9f5cb2c872e28833ef9cb1c65428efa736225..0af3d1eb5845a16a228fb9634f3bbca4a0bbf0c4 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/cpio.mod and b/INSTALL/grub/mips64el-efi/cpio.mod differ
index cb4e8a088b0804e668be7854ca4985fe95eb16be..126fac3909367f1b6a1d8df50e3a8856b3d59240 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/cpio_be.mod and b/INSTALL/grub/mips64el-efi/cpio_be.mod differ
index 373a97f2b3f8113469916b98d0ad156b33ed1bb3..3516fe326f52e8ac00d86dc79b145a7b77158c87 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/f2fs.mod and b/INSTALL/grub/mips64el-efi/f2fs.mod differ
index b056cba8ce94b8d9cd74c5b190789e90e1d86b2b..e9240e8d5d4cac5a0c0ee73e91daf27469a50cd5 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/hexdump.mod and b/INSTALL/grub/mips64el-efi/hexdump.mod differ
index bc579bdbe77b766361d997e4ff207b584585aeb1..a13022b54f8b2d33dd2f4bb5efa38d92520110a5 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/hfs.mod and b/INSTALL/grub/mips64el-efi/hfs.mod differ
index 38f9888cfe8dd239383d20385bbb189cee420ccc..3104fb7f3cb375c482a51c2a3fb649c422989cae 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/jfs.mod and b/INSTALL/grub/mips64el-efi/jfs.mod differ
index 091f014af70fc76f34ff57a0a803860dcaf3b62e..7584c9bb3d8c7c9bed257c65d350c030d0bc48f8 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/loadenv.mod and b/INSTALL/grub/mips64el-efi/loadenv.mod differ
index 30acfd54afe09469b8bbefac3a3e08fb9968f7cf..043b2e7337db7879c5509af073ae283c86c34bec 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/macho.mod and b/INSTALL/grub/mips64el-efi/macho.mod differ
index 3a16c28074fd4aae93b061e82485ce46b5ebbd51..ef34533ad119f17a8fe5ae77b51e8f525302b6a0 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/minix.mod and b/INSTALL/grub/mips64el-efi/minix.mod differ
index 7ad76d1afd2fa325e2ddec324f57e2a8201c2869..cd505fa280af0d6b58a197271eade1688e11113a 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/minix2.mod and b/INSTALL/grub/mips64el-efi/minix2.mod differ
index 72ddc95816736de69c9be4d09a073f20c8c192c0..7f4fec2b4d194073295ac46389db2dc18b3f3b23 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/minix2_be.mod and b/INSTALL/grub/mips64el-efi/minix2_be.mod differ
index 979bb9d0794383d9699e4b974495611ff5c6ceed..d2b94ca1ef293976c19f7eb23ba7908dafb0d558 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/minix3.mod and b/INSTALL/grub/mips64el-efi/minix3.mod differ
index 87021fe4cbfeddf7b09a576ee16bca0adcf2a659..13bf1bae10f1868cda9e3189bdf7c22d4fd2d49e 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/minix3_be.mod and b/INSTALL/grub/mips64el-efi/minix3_be.mod differ
index acc3187fdf53f0dc70862bd90e520f76886dc0bd..2b58151f7bf813ba80540b5cb218aa464c737084 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/minix_be.mod and b/INSTALL/grub/mips64el-efi/minix_be.mod differ
index b16abbf1bd1afe2e9d9c746fe63375b6286c82a6..554171b54f10488ef69e088556e5c9f4a9952282 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/moddep.lst and b/INSTALL/grub/mips64el-efi/moddep.lst differ
index 19594cf632310b750527f20d5165bcd75be228b6..618936662060d639b627ed73b9dc730986496fcd 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/nilfs2.mod and b/INSTALL/grub/mips64el-efi/nilfs2.mod differ
index 8236497ca0fb35db82ca3d6b71f354d7cbf8df07..a10d308b02329304526bd553b6f14bc7fd6f417a 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/normal.mod and b/INSTALL/grub/mips64el-efi/normal.mod differ
index 1c00422627de407332b9f9f1506c9e2a1fa699a2..20afc1eaf13cd16b73921a054dc2e7b3a52fa869 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/odc.mod and b/INSTALL/grub/mips64el-efi/odc.mod differ
index e3d381278582b00915a744fcbfeefce112638263..c3147389daef1cc28d34661bb64ccaf504f98c99 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/offsetio.mod and b/INSTALL/grub/mips64el-efi/offsetio.mod differ
index 7948f3f68579bf94ef81b25dc4d14cdb8578bec5..24f438fb6fbb22152965c75e023269ceb2c3b064 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/pgp.mod and b/INSTALL/grub/mips64el-efi/pgp.mod differ
index 3d86a0a48fa5736b59dedf1796c21370dc57625e..f83188931a05c51ef130dbe8fc036ed181c6830e 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/procfs.mod and b/INSTALL/grub/mips64el-efi/procfs.mod differ
index 3547a322e93644045f668ab4e4f4959ae8c3be99..b23fc39f72f981371dae809a0ccb1f74dcb57d14 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/progress.mod and b/INSTALL/grub/mips64el-efi/progress.mod differ
index b425c03412d85c28d591c4c5ab37905ac42f7a45..6eee7c972683b9e25abcef84bd2d6106ebdeec4e 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/reiserfs.mod and b/INSTALL/grub/mips64el-efi/reiserfs.mod differ
index 85a0a59e3854e3d2cb79377e265137598ae2a7dc..7e90eb2658c6a462dad6894ba6d69ccc5a9b4d81 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/romfs.mod and b/INSTALL/grub/mips64el-efi/romfs.mod differ
index 484fb2da9ecd405cdb3a944e4c6dd4729b32a592..4ea53fe1b714f052283bd3d39b4450fb4accbf17 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/sfs.mod and b/INSTALL/grub/mips64el-efi/sfs.mod differ
index 09e724aa5585d46d673f910c60ce1ed27a731743..3a241b06e8b2fe262087634d85c7921fe6d60235 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/testload.mod and b/INSTALL/grub/mips64el-efi/testload.mod differ
index 2e1e62d5153506a67bf6c5c581d50db21a799a18..c6ab4b42931067249fd2de834767cec2f5b35848 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/tga.mod and b/INSTALL/grub/mips64el-efi/tga.mod differ
index 738d705017b4bafb195264b96051827c9c11d2e8..a8a193664950a9066285172f93ffb13c4962ef68 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/ufs1.mod and b/INSTALL/grub/mips64el-efi/ufs1.mod differ
index b38fd905cceade7b6ce4573ac5c6ef27620e40a0..521caf3ad6bb0e198c77130f2cd4388db6edc2d2 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/ufs1_be.mod and b/INSTALL/grub/mips64el-efi/ufs1_be.mod differ
index 177da8a13aa8f21b70e596d62138221fde0d828d..f2a63188a3d9cd559c70cb186e44e5d3aa786dd0 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/ufs2.mod and b/INSTALL/grub/mips64el-efi/ufs2.mod differ
index 9d16385cf45be3bcadc7f7625458879c2b108a0b..e058a904cf6843d0728b8588f89a47dd699d5e87 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/verifiers.mod and b/INSTALL/grub/mips64el-efi/verifiers.mod differ
index 13b9f82393f2f4db246ed1d2c335b28851279f62..4d22ea773a3eb57326776a5fc5101df32000562a 100644 (file)
Binary files a/INSTALL/grub/mips64el-efi/zfs.mod and b/INSTALL/grub/mips64el-efi/zfs.mod differ
index 8c67092edd394f0447945ebd4fc714b38ceb8497..5dca7c66e92a65be786c7f4826b9430bb83b3cd4 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/affs.mod and b/INSTALL/grub/x86_64-efi/affs.mod differ
index 98157773c2a40830725036a84224301c778b18a4..5be6473a330ecf79ab5ef2cda6a6f7a5ca73df97 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/afs.mod and b/INSTALL/grub/x86_64-efi/afs.mod differ
index db8ab3ea284e4c30c184435af74e943985bdabed..aec5b825076542701a60b434ea6cf5efc92fda0c 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/aout.mod and b/INSTALL/grub/x86_64-efi/aout.mod differ
index 3065049f6c94416a82577896ac3c5d64a0220937..c74d6e1d85fe88a9335d6573efd9a25f82531c57 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/bfs.mod and b/INSTALL/grub/x86_64-efi/bfs.mod differ
index 9f5235b03de015adf1c728d5292df3cdbaca08e3..c7f3fe06a04d710e7866a2a4a20a45703e468737 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/bsd.mod and b/INSTALL/grub/x86_64-efi/bsd.mod differ
index af470c3d18f703ec53461a994d1bcd5587e43ac4..afcd8c4cc56e9a3c47f71b37131afbdcbb56fe1b 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/btrfs.mod and b/INSTALL/grub/x86_64-efi/btrfs.mod differ
index 385069bbaede8cdfeb2070fd42fbc0f24a500bce..6bfcfa065bf5410c2c3584ee759241cffb895f0f 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/cbfs.mod and b/INSTALL/grub/x86_64-efi/cbfs.mod differ
index 29dbd130daca2f44a574595926ad57dc116882eb..f73979551b551005bc2a754b51e4986f04804a30 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/cmp.mod and b/INSTALL/grub/x86_64-efi/cmp.mod differ
index e774c231f36026a75c8da10822557f5f187b1b5a..c5d64b1bfa9f52f21aeb6da3d414457dd1b8706b 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/cpio.mod and b/INSTALL/grub/x86_64-efi/cpio.mod differ
index 621213fd887d87d4bc4edb7aa672632e0a37a50b..e81b6256137df37c8864e6d0df19c328b6e8e599 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/cpio_be.mod and b/INSTALL/grub/x86_64-efi/cpio_be.mod differ
index 4d9e530cbd12c497416cf709329ea1463237db69..aec09542e2b41a585148a57bfce1268c2752109a 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/f2fs.mod and b/INSTALL/grub/x86_64-efi/f2fs.mod differ
index 05c5722a091fda1942f982f618d179a9b2904fed..75a176dac91d6d1ed7a5062cfe546225a57347ef 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/hexdump.mod and b/INSTALL/grub/x86_64-efi/hexdump.mod differ
index d04180a9591a73645588b3171eb2f63031c1898b..efab966ef1c50ca57ac44f0c4ac1d1ff4407a4aa 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/hfs.mod and b/INSTALL/grub/x86_64-efi/hfs.mod differ
index 776a758ebf17ecb7b67c3f2621d31300e34e4f74..4f99b2cf9b824ba9c6f20345acd05d23d026e820 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/jfs.mod and b/INSTALL/grub/x86_64-efi/jfs.mod differ
index 1aa94efffe03b3ce8a391263f6ccc64aa1267730..d36f75f3ea24423ebf7b3ce24dd967365dd624f8 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/linux16.mod and b/INSTALL/grub/x86_64-efi/linux16.mod differ
index 9dae5686caee45988a51872162be228c3264deb1..b4e1d1f03c199de64e17eb7dc8ee45f53481a51b 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/loadbios.mod and b/INSTALL/grub/x86_64-efi/loadbios.mod differ
index 6bfde6bb406351adb05912171c3bf6dbb89d83c1..8ab183ac13f90c10b56a2bbe3f482749f5053cf0 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/loadenv.mod and b/INSTALL/grub/x86_64-efi/loadenv.mod differ
index d8d73442e0f96115e229e5971d13d7a2d550e576..b174dcfe8041a966c7c4a115d77b1d4532dc2724 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/macho.mod and b/INSTALL/grub/x86_64-efi/macho.mod differ
index 21548278ec0356516345242055848d0ced7c2aa5..bf5442dc131f8330f76026c507d84181a4751748 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/minix.mod and b/INSTALL/grub/x86_64-efi/minix.mod differ
index 402eb73147eb0951d4350559b662470d0dd21e8e..6a7c81d50265786789c1614cded0db1a9f88def7 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/minix2.mod and b/INSTALL/grub/x86_64-efi/minix2.mod differ
index 1fd15f37c141dfeed147f9d3dd6baef81eb9216d..baf218750ba0ddc7770b004ffb91cfc9f0e8de61 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/minix2_be.mod and b/INSTALL/grub/x86_64-efi/minix2_be.mod differ
index b63128318254ca8f7c9a02abdf0e9f61a917f2e7..2e601d7954dc01a351a1bfe869fe5e31e8a75389 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/minix3.mod and b/INSTALL/grub/x86_64-efi/minix3.mod differ
index 2d24bad4e921629dfd3675e566416af4f9d2116f..5d052b6404da3b05d6ad26caff5f51309124278b 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/minix3_be.mod and b/INSTALL/grub/x86_64-efi/minix3_be.mod differ
index a039b6dad64e89ceb084cbeebdb8316f21be152d..0bf16a33d586001e10568a89a2c1b753482991a9 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/minix_be.mod and b/INSTALL/grub/x86_64-efi/minix_be.mod differ
index 570599581b11af8e8cd0d188f9ea28574fdba3f4..8cbceb048793f5a23aeb1354061905c3c2f3e26d 100644 (file)
@@ -120,7 +120,7 @@ ehci: cs5536 usb boot
 crypto:
 part_bsd: part_msdos
 cs5536:
 crypto:
 part_bsd: part_msdos
 cs5536:
-ventoy: elf fshelp ext2 btrfs font crypto gcry_md5 exfat udf extcmd datetime div normal video gcry_sha1 iso9660
+ventoy: fshelp ext2 elf btrfs font crypto gcry_md5 exfat udf div extcmd datetime normal video gcry_sha1 iso9660
 gcry_sha512: crypto
 password: crypto normal
 fshelp:
 gcry_sha512: crypto
 password: crypto normal
 fshelp:
index 9a827f206402e0a97dd0d6ef1d4dca3479d875c8..4fc337be457d2e3c040f38c7f962964147bb7d7d 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/multiboot.mod and b/INSTALL/grub/x86_64-efi/multiboot.mod differ
index 057693d99bdbcbbc9a745fe92108dafe50ce7a89..eec62fd990647b447e286e59c3c3906ab9cc1b95 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/multiboot2.mod and b/INSTALL/grub/x86_64-efi/multiboot2.mod differ
index 3061804f7abd1e1769294875c70d548b1962b7d1..41e87c22f575936e84ddd61ef6553ed82235b3e9 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/nativedisk.mod and b/INSTALL/grub/x86_64-efi/nativedisk.mod differ
index 2aa661da1923a3a3f311da3f65803668770f20c9..ce329fc8d98a89570dab566643f8ed45f92d578f 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/nilfs2.mod and b/INSTALL/grub/x86_64-efi/nilfs2.mod differ
index 92839027b1de7d9713aedf2a5d945a69f447d72c..5ed99b73fc5fe5e2bdb42a2348479ac3471d3637 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/normal.mod and b/INSTALL/grub/x86_64-efi/normal.mod differ
index 512d7e70cf09dfb91982255979e1b137225eea7c..1ae07900a6f9728bef954c71d228f4a26a30db7d 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/odc.mod and b/INSTALL/grub/x86_64-efi/odc.mod differ
index 99c12779f3ddfdf1799cdab9865d37758a372778..15c8c228dc1574cf3ec7be5b0f877e4cb1b551b5 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/offsetio.mod and b/INSTALL/grub/x86_64-efi/offsetio.mod differ
index 309f6135ab47e56906d08105fd073ece76504bc1..994a868fc96d4df2de41fda6db37eee15a146ab8 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/pgp.mod and b/INSTALL/grub/x86_64-efi/pgp.mod differ
index 01d42e95fceff6d2c3706df0fb96ae3ba3cbd313..aad83d3335173758375d4f3e4a93a765bdceed12 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/procfs.mod and b/INSTALL/grub/x86_64-efi/procfs.mod differ
index e8448364bbd5c56cac73d9baeb7658afce8d0a01..de0912573518ae5c446cd6f17e8846e73d9636ef 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/progress.mod and b/INSTALL/grub/x86_64-efi/progress.mod differ
index 542ae3ce6bebc847ef208c904c28431e5edf44ac..1b98ff6b529693f11b414e916310e35747822e73 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/reiserfs.mod and b/INSTALL/grub/x86_64-efi/reiserfs.mod differ
index c42d9c7ea45e0df1c21395aea13f6a5ea9d608a7..b29514377934c9363c3a67c7c7062a8107001708 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/romfs.mod and b/INSTALL/grub/x86_64-efi/romfs.mod differ
index 2e3a2142a3f98419eae9e189d71315e770d609a7..a532b1f474463bf6b0269f8ef96925f1a9260992 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/sfs.mod and b/INSTALL/grub/x86_64-efi/sfs.mod differ
index 1b58c2106180f24cd2a3a7c3c399fe630b1c1d8d..a7185ac0c33990c1585c3e432509687a06509e3d 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/testload.mod and b/INSTALL/grub/x86_64-efi/testload.mod differ
index 02ce149ea52105635b22e99354bb9208a7c13366..ecbf32d1f799863eb458b24f08ff5f36ec7aa4b5 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/tga.mod and b/INSTALL/grub/x86_64-efi/tga.mod differ
index ab79b219d31e1585581544f9cc21d6ceac26f6b0..de6276445199924c684457222624ad4c32fbbd48 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/ufs1.mod and b/INSTALL/grub/x86_64-efi/ufs1.mod differ
index 296c2fcb6c20c4913132d838a6b9a448ed67750a..bab70123f7e2f1f7d934061fb29effe313372dc7 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/ufs1_be.mod and b/INSTALL/grub/x86_64-efi/ufs1_be.mod differ
index c84e55a53e9c122c3b79a42c921fc835fe222d62..d1cc24cd6652dd5226ec37324344483530979fe7 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/ufs2.mod and b/INSTALL/grub/x86_64-efi/ufs2.mod differ
index 6cb24d3c630583bb088918f0b3816549aa74d0ca..c44200f3e71ee4ddd9c4b7f78b995101f032ca3e 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/verifiers.mod and b/INSTALL/grub/x86_64-efi/verifiers.mod differ
index ad4d811c03864fcfc824e609800c74a687e402e7..3ba80d20f4d79bc89d90ec8dc3254c09c2656893 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/xnu.mod and b/INSTALL/grub/x86_64-efi/xnu.mod differ
index 70f1d917a8ff9a8ad6d885264013481542537f71..b213ee3f045623eaeb8af7759b0401cb6b3306c4 100644 (file)
Binary files a/INSTALL/grub/x86_64-efi/zfs.mod and b/INSTALL/grub/x86_64-efi/zfs.mod differ
index 2545928af8389a38f038f505deef4b1c977ffd2b..0c2889d880032c2d03ead17bff0e619e7f594d58 100644 (file)
Binary files a/INSTALL/ventoy/ventoy.cpio and b/INSTALL/ventoy/ventoy.cpio differ
index 506a49e1c797ca39a0b9212e6dddc0c44f2da064..f550456e0db4dbf959a524821fbf987b03a7184a 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_aa64.efi and b/INSTALL/ventoy/ventoy_aa64.efi differ
index c4ea7af2581e247fc9be3228143dc9df9b627ac9..f9a36eeec9d1db32b4d56b8b3488d3157ac7fa86 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_arm64.cpio and b/INSTALL/ventoy/ventoy_arm64.cpio differ
index a891aef8b3d58701f8721f5341df1c5d9293d32f..61515d747e65ca35e421b5c457c9bc93b3444414 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_ia32.efi and b/INSTALL/ventoy/ventoy_ia32.efi differ
index 7967349b274f867211c126fb52e9d62770e0e253..162478b804d01f76c0001710dec83822847e61a6 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_mips64.cpio and b/INSTALL/ventoy/ventoy_mips64.cpio differ
index 83fdf00b464af4ddfdd1c0cdda7532b00dc94cb3..9cf11c3631db4df11a43d0fa1accc336bf36e2e7 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_unix.cpio and b/INSTALL/ventoy/ventoy_unix.cpio differ
index 1ad451547dc1a2c27252ad8d92f57cab44bee8a1..73eef7b69a1f7224a853d4843976a7afa6a16c46 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_x64.efi and b/INSTALL/ventoy/ventoy_x64.efi differ
index 920f4f502f4518081bc533502c3f1ed9a83e00bd..e63ee3fd03dceb822295f1fb3ef7e60556d43ac8 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_x86.cpio and b/INSTALL/ventoy/ventoy_x86.cpio differ
index 48d2faabe48d8e21ae68d57b519e171686c2baee..88a76b058b2fcd095f044da2f80927045e454df2 100644 (file)
Binary files a/INSTALL/ventoy/vtloopex.cpio and b/INSTALL/ventoy/vtloopex.cpio differ
index 992a3623fe4aa48a66634423e2fbd00e2ce28721..960c02537b95729d72cb7772de3d51f2c15d599e 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ
index 7a425c06ee79ec8c7f206c965fbdc2d3d3eeed93..82a42ae94244735979694f25fd5a2e0933fbb409 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ
index 5dafe9b436b3290acca60ed6f0fc6ea4bb8ea702..e2e305e62d3fb2110f62f8f024a2c3e185bbbce0 100644 (file)
Binary files a/INSTALL/ventoy/vtoyutil_aa64.efi and b/INSTALL/ventoy/vtoyutil_aa64.efi differ
index 47e40c46663d9211287dfe92259a4b247c7d3af6..6b2d05ca51bbf42589372d608414141839e5f570 100644 (file)
Binary files a/INSTALL/ventoy/vtoyutil_ia32.efi and b/INSTALL/ventoy/vtoyutil_ia32.efi differ
index 8cfe7a810cc89ca25131b118e77c6e978f7cc56f..a75bcef04d4cf460714a05e8fd0761683e78968d 100644 (file)
Binary files a/INSTALL/ventoy/vtoyutil_x64.efi and b/INSTALL/ventoy/vtoyutil_x64.efi differ
index 315d840a99ad0e50093d2b2c967dcd702fa97609..aa132a39ed58365ea5f6ae1f50a5357dff098544 100644 (file)
@@ -41,6 +41,11 @@ sh build.sh
 sh pack.sh
 cd -
 
 sh pack.sh
 cd -
 
+cd ../Vlnk
+sh build.sh
+sh pack.sh
+cd -
+
 
 LOOP=$(losetup -f)
 
 
 LOOP=$(losetup -f)
 
@@ -118,6 +123,7 @@ rm -f $tmpdir/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
 cp $OPT Ventoy2Disk.sh $tmpdir/
 cp $OPT VentoyWeb.sh $tmpdir/
 cp $OPT VentoyPlugson.sh $tmpdir/
 cp $OPT Ventoy2Disk.sh $tmpdir/
 cp $OPT VentoyWeb.sh $tmpdir/
 cp $OPT VentoyPlugson.sh $tmpdir/
+cp $OPT VentoyVlnk.sh $tmpdir/
 cp $OPT VentoyGUI* $tmpdir/
 
 
 cp $OPT VentoyGUI* $tmpdir/
 
 
@@ -128,6 +134,7 @@ cp $OPT ExtendPersistentImg.sh $tmpdir/
 dos2unix -q $tmpdir/Ventoy2Disk.sh
 dos2unix -q $tmpdir/VentoyWeb.sh
 dos2unix -q $tmpdir/VentoyPlugson.sh
 dos2unix -q $tmpdir/Ventoy2Disk.sh
 dos2unix -q $tmpdir/VentoyWeb.sh
 dos2unix -q $tmpdir/VentoyPlugson.sh
+dos2unix -q $tmpdir/VentoyVlnk.sh
 
 
 dos2unix -q $tmpdir/CreatePersistentImg.sh
 
 
 dos2unix -q $tmpdir/CreatePersistentImg.sh
@@ -167,6 +174,7 @@ find $tmpdir/ -type f -exec chmod 644 "{}" +
 chmod +x $tmpdir/Ventoy2Disk.sh
 chmod +x $tmpdir/VentoyWeb.sh
 chmod +x $tmpdir/VentoyPlugson.sh
 chmod +x $tmpdir/Ventoy2Disk.sh
 chmod +x $tmpdir/VentoyWeb.sh
 chmod +x $tmpdir/VentoyPlugson.sh
+chmod +x $tmpdir/VentoyVlnk.sh
 chmod +x $tmpdir/VentoyGUI*
 
 cp $OPT $LANG_DIR/languages.json $tmpdir/tool/
 chmod +x $tmpdir/VentoyGUI*
 
 cp $OPT $LANG_DIR/languages.json $tmpdir/tool/
@@ -183,6 +191,7 @@ rm -f ventoy-${curver}-windows.zip
 
 cp $OPT Ventoy2Disk.exe $tmpdir/
 cp $OPT VentoyPlugson.exe $tmpdir/
 
 cp $OPT Ventoy2Disk.exe $tmpdir/
 cp $OPT VentoyPlugson.exe $tmpdir/
+cp $OPT VentoyVlnk.exe $tmpdir/
 cp $OPT FOR_X64_ARM.txt $tmpdir/
 mkdir -p $tmpdir/altexe
 cp $OPT Ventoy2Disk_*.exe $tmpdir/altexe/
 cp $OPT FOR_X64_ARM.txt $tmpdir/
 mkdir -p $tmpdir/altexe
 cp $OPT Ventoy2Disk_*.exe $tmpdir/altexe/
index 6f913951f735a96034f306ec3dacacc7beb1fbdb..9a55938e014f2f60de7956f326dfa6a4a3521826 100644 (file)
         "STR_PART_RESIZE_FAILED":"Hi ha hagut un error durant el procés d'instal·lació no destructiva, comproveu el fitxer log.txt per a més detalls.",
         "STR_PART_RESIZE_UNSUPPORTED":"La instal·lació no destructiva de Ventoy no ha estat possible perquè els requeriments no es compleixen. Comproveu el fitxer log.txt per a més detalls.",
         
         "STR_PART_RESIZE_FAILED":"Hi ha hagut un error durant el procés d'instal·lació no destructiva, comproveu el fitxer log.txt per a més detalls.",
         "STR_PART_RESIZE_UNSUPPORTED":"La instal·lació no destructiva de Ventoy no ha estat possible perquè els requeriments no es compleixen. Comproveu el fitxer log.txt per a més detalls.",
         
+        "STRXXX":""
+    },
+    
+    {
+        "name":"Georgian (ქართული)",
+        "FontFamily":"Courier New",
+        "FontSize":16,
+        "Author":"Levan Baindurashvili",
+        
+        "STR_ERROR":"შეცდომა",
+        "STR_WARNING":"გაფრთხილება",
+        "STR_INFO":"ინფორმაცია",
+        "STR_INCORRECT_DIR":"გთხოვთ, გაუშვით სხვა კატალოგში!",
+        "STR_INCORRECT_TREE_DIR":"ნუ გამიშვებ აქ, გთხოვთ გადმოწეროთ გამოშვებული ინსტალაციის პაკეტი და გაუშვათ სხვაგან.",
+        "STR_DEVICE":"მოწყობილობა",
+        "STR_LOCAL_VER":"Ventoy პაკეტში",
+        "STR_DISK_VER":"Ventoy მოწყობილობაზე",
+        "STR_STATUS":"სტატუსი - მზადაა",
+        "STR_INSTALL":"დაყენება",
+        "STR_UPDATE":"განახლება",
+        "STR_UPDATE_TIP":"განახლება უსაფრთხოა და ISO ფაილები უცვლელი დარჩება.#@გაგრძელება?",
+        "STR_INSTALL_TIP":"დისკი დაფორმატდება და ყველა მონაცემი დაიკარგება.#@გსურთ გააგრძელოთ?",
+        "STR_INSTALL_TIP2":"დისკი დაფორმატდება და ყველა მონაცემი დაიკარგება.#@ ნამდვილად გსურთ გაგრძელება?",
+        "STR_INSTALL_SUCCESS":"გილოცავთ!#@Ventoy წარმატებით დაინსტალირდა თქვენს მოწყობილობაზე.",
+        "STR_INSTALL_FAILED":"Ventoy-ის ინსტალაციისას მოხდა შეცდომა. ხელახლა შეაერთეთ თქვენი მოწყობილობა და სცადეთ ხელახლა. შეამოწმეთ log.txt შეცდომებისთვის.",
+        "STR_UPDATE_SUCCESS":"გილოცავთ!#@Ventoy წარმატებით განახლდა თქვენს მოწყობილობაზე.",
+        "STR_UPDATE_FAILED":"Ventoy-ის განახლებისას მოხდა შეცდომა. ხელახლა შეაერთეთ თქვენი მოწყობილობა და სცადეთ ხელახლა. შეამოწმეთ log.txt შეცდომებისთვის.",
+        "STR_WAIT_PROCESS":"პროცესი დაიწყო, გთხოვთ დაელოდოთ...",
+        "STR_MENU_OPTION":"Პარამეტრები",
+        "STR_MENU_SECURE_BOOT":"Secure Boot-ის მხარდაჭერა",
+        "STR_MENU_PART_CFG":"დამატებითი განყოფილება",
+        "STR_BTN_OK":"ОК",
+        "STR_BTN_CANCEL":"უარყოფა",
+        "STR_PRESERVE_SPACE":"შექმენით დამატებითი დანაყოფი დისკის ბოლოს",
+        "STR_SPACE_VAL_INVALID":"დანაყოფის ზომა არასწორია",
+        "STR_MENU_CLEAR":"Ventoy-ს წაშლა",
+        "STR_CLEAR_SUCCESS":"Ventoy წარმატებით წაიშალა მოწყობილობიდან.",
+        "STR_CLEAR_FAILED":"Ventoy-ის დეინსტალაციისას მოხდა შეცდომა. ხელახლა შეაერთეთ თქვენი მოწყობილობა და სცადეთ ხელახლა. შეამოწმეთ log.txt შეცდომებზე.",
+        "STR_MENU_PART_STYLE":"განყოფილების განლაგების სტილი",
+        "STR_DISK_2TB_MBR_ERROR":"გთხოვთ, აირჩიოთ GPT 2 ტბაიტზე მეტი დისკებისთვის",
+        "STR_SHOW_ALL_DEV":"ყველა მოწყობილობის ჩვენება",
+        "STR_PART_ALIGN_4KB":"ტიხრების გასწორება 4 KB ზომით",
+        "STR_WEB_COMMUNICATION_ERR":"დაკავშირების შეცდომა:",
+        "STR_WEB_REMOTE_ABNORMAL":"კომუნიკაციის შეცდომა: დისტანციური კავშირი არასწორია",
+        "STR_WEB_REQUEST_TIMEOUT":"კომუნიკაციის შეცდომა: მოთხოვნის დრო ამოიწურა",
+        "STR_WEB_SERVICE_UNAVAILABLE":"კომუნიკაციის შეცდომა: სერვისი მიუწვდომელია",
+        "STR_WEB_TOKEN_MISMATCH":"დემონის სტატუსი განახლებულია. გთხოვთ სცადოთ მოგვიანებით.",
+        "STR_WEB_SERVICE_BUSY":"სერვისი დაკავებულია, გთხოვთ, სცადოთ მოგვიანებით.",
+        "STR_MENU_VTSI_CREATE":"VTSI ფაილის შექმნა",
+        "STR_VTSI_CREATE_TIP":"ამჯერად Ventoy არ დაინსტალირდება მოწყობილობაზე, მაგრამ შეიქმნება მხოლოდ VTSI ფაილი#@გაგრძელება?",
+        "STR_VTSI_CREATE_SUCCESS":"VTSI ფაილი წარმატებით შეიქმნა!#@შეგიძლიათ გამოიყენოთ Rufus(3.15+) ჩაწეროთ მოწყობილობაზე Ventoy ინსტალაციის დასასრულებლად.",
+        "STR_VTSI_CREATE_FAILED":"VTSI ფაილის შექმნის შეცდომა.",
+        "STR_MENU_PART_RESIZE":"Non-destructive Install",
+        "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+        "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+        "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+        "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
         "STRXXX":""
     }
 ]
         "STRXXX":""
     }
 ]
index be24e3755f5397997d00b7d58c5d83c4edd7d11b..259dcdb9590a20b2924b5ea3c1c8522e844aa330 100644 (file)
@@ -485,6 +485,7 @@ void ventoy_data_default_control(data_control *data)
 {
     memset(data, 0, sizeof(data_control));
 
 {
     memset(data, 0, sizeof(data_control));
 
+    data->default_menu_mode = 1;
     data->filter_dot_underscore = 1;
     data->max_search_level = -1;
     data->menu_timeout = 0;
     data->filter_dot_underscore = 1;
     data->max_search_level = -1;
     data->menu_timeout = 0;
index 21fcdbac29627c5cc33e704b12a6326ee444a2f6..6e562321e9c7b3ce52a555c35c3c37b5bc2edef0 100644 (file)
Binary files a/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe and b/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe differ
diff --git a/Vlnk/VentoyVlnk.sh b/Vlnk/VentoyVlnk.sh
new file mode 100644 (file)
index 0000000..5037df1
--- /dev/null
@@ -0,0 +1,271 @@
+#!/bin/sh
+
+print_usage() {    
+    echo 'Usage:  sudo sh VentoyVlnk.sh CMD FILE'
+    echo '  CMD:'
+    echo '   -c FILE      create vlnk for FILE'
+    echo '   -l VLNK      parse vlnk file'
+    echo '   -v           print verbose info'
+    echo '   -h           print this help'
+    echo ''
+}
+
+verbose_flag=0
+
+vlog() {
+    if [ $verbose_flag -eq 1 ]; then
+        echo "$@"
+    fi
+}
+
+vlnk_suffix() {
+    echo $1 | egrep -q '.*(.vlnk.iso|.vlnk.img|.vlnk.wim|.vlnk.vhd|.vlnk.vhdx|.vlnk.efi|.vlnk.vtoy|.vlnk.dat)$'
+}
+
+
+uid=$(id -u)
+if [ $uid -ne 0 ]; then
+    echo "Please use sudo or run the script as root."
+    exit 1
+fi
+
+#check system tools used bellow
+for t in 'mountpoint' 'readlink' 'xzcat'; do
+    if ! which "$t" > /dev/null 2>&1; then
+        echo "$t command not found in current system!"
+        exit 1
+    fi
+done
+
+machine=$(uname -m)
+if echo $machine | egrep -q 'aarch64|arm64'; then
+    TOOLDIR=aarch64
+elif echo $machine | egrep -q 'x86_64|amd64'; then
+    TOOLDIR=x86_64
+elif echo $machine | egrep -q 'mips64'; then
+    TOOLDIR=mips64el
+elif echo $machine | egrep -q 'i[3-6]86'; then
+    TOOLDIR=i386
+else
+    echo "Unsupported machine type $machine"    
+    exit 1
+fi
+
+fullsh=$(readlink -f "$0")
+vtoydir=${fullsh%/*}
+
+if [ -f "$vtoydir/tool/$TOOLDIR/vlnk.xz" ]; then
+    xzcat "$vtoydir/tool/$TOOLDIR/vlnk.xz" > "$vtoydir/tool/$TOOLDIR/vlnk"
+    rm -f "$vtoydir/tool/$TOOLDIR/vlnk.xz"
+fi
+
+if [ -f "$vtoydir/tool/$TOOLDIR/vlnk" ]; then
+    chmod +x "$vtoydir/tool/$TOOLDIR/vlnk"
+else
+    echo "$vtoydir/tool/$TOOLDIR/vlnk does not exist! "
+    exit 1
+fi
+
+PATH="$vtoydir/tool/$TOOLDIR":$PATH
+
+VLNKCMD=vlnk
+while [ -n "$1" ]; do
+    if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
+        print_usage
+        exit 0
+    elif [ "$1" = "-c" ]; then
+        shift
+        CMD='c'
+        IMG="$1"
+    elif [ "$1" = "-o" ]; then
+        shift
+        OUT="$1"
+    elif [ "$1" = "-l" ]; then
+        shift
+        CMD='l'
+        VLNK="$1"
+    elif [ "$1" = "-v" ]; then
+        verbose_flag=1
+        VLNKCMD="vlnk -v"
+    else
+        echo "invalid option $1"
+        exit 1
+    fi
+    
+    shift
+done
+
+if [ "$CMD" = "c" ]; then    
+    vlog "Create vlnk for $IMG"
+    
+    if [ ! -f "$IMG" ]; then
+        echo "$IMG does not exist!"
+        exit 1
+    fi
+    
+    if echo $IMG | egrep -q -i '.*(.iso|.img|.wim|.vhd|.vhdx|.efi|.vtoy|.dat)$'; then
+        :
+    else
+        echo "This file is not supported for vlnk!"
+        exit 1
+    fi
+    
+    if vlnk_suffix "$IMG"; then
+        echo "This is already a vlnk file!"
+        exit 1
+    fi
+    
+    if $VLNKCMD -t "$IMG"; then
+        echo "This is already a vlnk file!"
+        exit 1
+    fi
+    
+    FULLIMG=$(readlink -f "$IMG")
+    if [ ! -f "$FULLIMG" ]; then
+        echo "$FULLIMG does not exist!"
+        exit 1
+    fi
+    vlog "Full file path is $FULLIMG"
+    
+    
+    #check img file position is a valid mountpoint
+    FULLDIR=${FULLIMG%/*}
+    while [ -n "${FULLDIR}" ]; do
+        if mountpoint -q "${FULLDIR}"; then
+            break
+        fi        
+        FULLDIR="${FULLDIR%/*}"
+    done
+    
+    if [ -z "${FULLDIR}" ]; then
+        FULLDIR=/
+        IMGPATH="${FULLIMG}"
+    else
+        IMGPATH="${FULLIMG#$FULLDIR}"
+    fi
+    
+    IMGFILE=$(basename "$IMGPATH")
+    vlog "IMGPATH=$IMGPATH IMGFILE=$IMGFILE"
+    
+    
+    mntdev=$(mountpoint -d "${FULLDIR}")
+    vlog "mountpoint is ${FULLDIR}  dev $mntdev"
+    
+    #check fs
+    if grep -q " ${FULLDIR} " /proc/mounts; then
+        FS=$(grep " ${FULLDIR} " /proc/mounts | awk '{print $3}')
+        vlog "File system is $FS"
+        
+        if echo $FS | egrep -q "ext2|ext3|ext4|exfat|vfat|fat32|fat16|fat12|ntfs|xfs|udf"; then
+            vlog "FS OK"
+        else
+            echo "$FS is not supported!"
+            exit 1
+        fi
+    else
+        echo "${FULLDIR} not found in /proc/mounts"
+        exit 1
+    fi
+    
+    
+    Major=$(echo $mntdev | awk -F: '{print $1}')
+    Minor=$(echo $mntdev | awk -F: '{print $2}')
+    vlog "Major=$Major Minor=$Minor"
+    
+    IMGPARTITION=""
+    while read line; do
+        M1=$(echo $line | awk '{print $1}')
+        M2=$(echo $line | awk '{print $2}')        
+        if [ "$Major" = "$M1" -a "$Minor" = "$M2" ]; then
+            IMGPARTITION=$(echo $line | awk '{print $4}')
+            vlog "disk partition is $IMGPARTITION"
+            break
+        fi
+    done < /proc/partitions
+    
+    if [ -z "$IMGPARTITION" ]; then
+        echo "Disk partition not found for $FULLDIR"
+        grep " $FULLDIR " /proc/mounts
+        exit 1
+    fi
+    
+    if [ -f "/sys/class/block/$IMGPARTITION/start" ]; then
+        PARTSTART=$(cat "/sys/class/block/$IMGPARTITION/start")
+        if echo $IMGPARTITION | egrep -q 'mmc|nbd|nvme'; then
+            DISK=$(echo /dev/$IMGPARTITION | sed "s/^\(.*\)p[0-9][0-9]*$/\1/")
+        else
+            DISK=$(echo /dev/$IMGPARTITION | sed "s/^\(.*[^0-9]\)[0-9][0-9]*$/\1/")
+        fi
+        
+        if [ ! -b $DISK ]; then
+            echo "Device $DISK not exist!"
+            exit 1
+        fi
+        
+        vlog "PARTSTART=$PARTSTART DISK=$DISK"
+    else
+        if echo $IMGPARTITION | grep -q '^dm-[0-9][0-9]*'; then
+            echo "LVM/DM is not supported!"
+        fi
+        echo "/sys/class/block/$IMGPARTITION/start not exist!"
+        exit 1
+    fi
+    
+    
+    if [ -n "$OUT" ]; then
+        lowersuffix=$(echo ${IMG##*.} | tr 'A-Z' 'a-z')        
+        OUT="${OUT}.vlnk.${lowersuffix}"
+    else
+        name=${IMGFILE%.*}
+        lowersuffix=$(echo ${IMGFILE##*.} | tr 'A-Z' 'a-z')
+        OUT="${name}.vlnk.${lowersuffix}"
+    fi
+
+    echo "Output VLNK file is $OUT"
+    [ -f "${OUT}" ] && rm -f "${OUT}"
+    
+    touch "${OUT}"
+    if [ -f "${OUT}" ]; then
+        rm -f "${OUT}"
+    else
+        echo "Failed to create ${OUT}"
+        exit 1
+    fi
+    
+    if $VLNKCMD -c "$IMGPATH" -d $DISK -p $PARTSTART -o "${OUT}"; then
+        echo "====== Vlnk file create success ========="
+        echo ""
+    else
+        echo "====== Vlnk file create failed ========="
+        echo ""
+        exit 1
+    fi
+elif [ "$CMD" = "l" ]; then
+    vlog "Parse vlnk for $VLNK"
+    
+    if [ ! -f "$VLNK" ]; then
+        echo "$VLNK does not exist!"
+        exit 1
+    fi
+
+    if vlnk_suffix "$VLNK"; then
+        :
+    else
+        echo "Invalid vlnk file suffix!"
+        exit 1
+    fi
+
+    if $VLNKCMD -t "$VLNK"; then
+        vlog "Vlnk data check OK"
+    else
+        echo "This is not a valid vlnk file!"
+        exit 1
+    fi
+
+    $VLNKCMD -l "$VLNK"
+    echo ""
+else
+    echo "invalid cmd"
+    print_usage
+    exit 1
+fi
diff --git a/Vlnk/build.sh b/Vlnk/build.sh
new file mode 100644 (file)
index 0000000..c00eb17
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+rm -f vlnk_64
+rm -f vlnk_32
+rm -f vlnk_aa64
+rm -f vlnk_m64e
+
+SRCS="src/crc32.c src/main_linux.c src/vlnk.c"
+
+gcc -specs "/usr/local/musl/lib/musl-gcc.specs" -Os -static -D_FILE_OFFSET_BITS=64 $SRCS -Isrc -o vlnk_64
+
+/opt/diet32/bin/diet -Os gcc -D_FILE_OFFSET_BITS=64 -m32 -static $SRCS -Isrc -o vlnk_32
+
+aarch64-buildroot-linux-uclibc-gcc -static -O2 -D_FILE_OFFSET_BITS=64 $SRCS -Isrc -o vlnk_aa64
+mips64el-linux-musl-gcc -mips64r2 -mabi=64 -static -O2 -D_FILE_OFFSET_BITS=64 $SRCS -Isrc -o vlnk_m64e
+
+if [ -e vlnk_64 ] && [ -e vlnk_32 ] && [ -e vlnk_aa64 ] && [ -e vlnk_m64e ]; then
+    echo -e "\n===== success =======\n"
+    
+    strip --strip-all vlnk_32
+    strip --strip-all vlnk_64
+    aarch64-buildroot-linux-uclibc-strip --strip-all vlnk_aa64
+    mips64el-linux-musl-strip --strip-all vlnk_m64e
+    
+    [ -d ../INSTALL/tool/i386/ ] && mv vlnk_32 ../INSTALL/tool/i386/vlnk
+    [ -d ../INSTALL/tool/x86_64/ ] && mv vlnk_64 ../INSTALL/tool/x86_64/vlnk
+    [ -d ../INSTALL/tool/aarch64/ ] && mv vlnk_aa64 ../INSTALL/tool/aarch64/vlnk
+    [ -d ../INSTALL/tool/mips64el/ ] && mv vlnk_m64e ../INSTALL/tool/mips64el/vlnk
+else
+    echo -e "\n===== failed =======\n"
+    exit 1
+fi
diff --git a/Vlnk/pack.sh b/Vlnk/pack.sh
new file mode 100644 (file)
index 0000000..7f657d4
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+rm -f ../INSTALL/VentoyVlnk.sh
+cp -a ./VentoyVlnk.sh ../INSTALL/VentoyVlnk.sh
+
+rm -f ../INSTALL/VentoyVlnk.exe
+cp -a ./vs/VentoyVlnk/Release/VentoyVlnk.exe   ../INSTALL/VentoyVlnk.exe
diff --git a/Vlnk/src/crc32.c b/Vlnk/src/crc32.c
new file mode 100644 (file)
index 0000000..831a605
--- /dev/null
@@ -0,0 +1,77 @@
+/******************************************************************************
+ * crc32.c  ---- 
+ *
+ * Copyright (c) 2022, longpanda <admin@ventoy.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include "vlnk.h"
+
+static uint32_t crc32c_table [256];
+
+/* Helper for init_crc32c_table.  */
+static uint32_t reflect (uint32_t ref, int len)
+{
+  uint32_t result = 0;
+  int i;
+
+  for (i = 1; i <= len; i++)
+    {
+      if (ref & 1)
+       result |= 1 << (len - i);
+      ref >>= 1;
+    }
+
+  return result;
+}
+
+static void init_crc32c_table (void)
+{
+  uint32_t polynomial = 0x1edc6f41;
+  int i, j;
+
+  for(i = 0; i < 256; i++)
+    {
+      crc32c_table[i] = reflect(i, 8) << 24;
+      for (j = 0; j < 8; j++)
+        crc32c_table[i] = (crc32c_table[i] << 1) ^
+            (crc32c_table[i] & (1 << 31) ? polynomial : 0);
+      crc32c_table[i] = reflect(crc32c_table[i], 32);
+    }
+}
+
+uint32_t ventoy_getcrc32c (uint32_t crc, const void *buf, int size)
+{
+  int i;
+  const uint8_t *data = buf;
+
+  if (! crc32c_table[1])
+    init_crc32c_table ();
+
+  crc^= 0xffffffff;
+
+  for (i = 0; i < size; i++)
+    {
+      crc = (crc >> 8) ^ crc32c_table[(crc & 0xFF) ^ *data];
+      data++;
+    }
+
+  return crc ^ 0xffffffff;
+}
+
diff --git a/Vlnk/src/main_linux.c b/Vlnk/src/main_linux.c
new file mode 100644 (file)
index 0000000..fa27600
--- /dev/null
@@ -0,0 +1,457 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <sys/statfs.h>
+#include <dirent.h>
+#include <unistd.h>
+
+#include "vlnk.h"
+
+#ifndef PATH_MAX
+#define PATH_MAX  4096
+#endif
+
+#define IS_DIGIT(x) ((x) >= '0' && (x) <= '9')
+
+static int verbose = 0;
+#define debug(fmt, args...) if(verbose) printf(fmt, ##args)
+
+static uint8_t g_vlnk_buf[VLNK_FILE_LEN];
+
+static int64_t get_file_size(char *file)
+{
+    struct stat stStat;
+    
+    if (stat(file, &stStat) < 0)
+    {
+        return -1;
+    }
+
+    return (int64_t)(stStat.st_size);
+}
+
+static int get_disk_sig(char *diskname, uint32_t *sig)
+{
+    int fd;
+    uint8_t buf[512] = {0};
+    
+    fd = open(diskname, O_RDONLY);
+    if (fd < 0)
+    {
+        printf("Failed to open %s\n", diskname);
+        return 1;
+    }
+
+    read(fd, buf, 512);
+    close(fd);
+
+    memcpy(sig, buf + 0x1b8, 4);    
+    return 0;
+}
+
+static int vtoy_get_disk_guid(const char *diskname, uint8_t *vtguid, uint8_t *vtsig)
+{
+    int i = 0;
+    int fd = 0;
+    char devdisk[128] = {0};
+
+    snprintf(devdisk, sizeof(devdisk) - 1, "/dev/%s", diskname);
+    
+    fd = open(devdisk, O_RDONLY);
+    if (fd >= 0)
+    {
+        lseek(fd, 0x180, SEEK_SET);
+        read(fd, vtguid, 16);
+        
+        lseek(fd, 0x1b8, SEEK_SET);
+        read(fd, vtsig, 4);
+        close(fd);
+        return 0;
+    }
+    else
+    {
+        debug("failed to open %s %d\n", devdisk, errno);
+        return errno;
+    }
+}
+
+static int vtoy_is_possible_blkdev(const char *name)
+{
+    if (name[0] == '.')
+    {
+        return 0;
+    }
+
+    /* /dev/ramX */
+    if (name[0] == 'r' && name[1] == 'a' && name[2] == 'm')
+    {
+        return 0;
+    }
+
+    /* /dev/loopX */
+    if (name[0] == 'l' && name[1] == 'o' && name[2] == 'o' && name[3] == 'p')
+    {
+        return 0;
+    }
+
+    /* /dev/dm-X */
+    if (name[0] == 'd' && name[1] == 'm' && name[2] == '-' && IS_DIGIT(name[3]))
+    {
+        return 0;
+    }
+
+    /* /dev/srX */
+    if (name[0] == 's' && name[1] == 'r' && IS_DIGIT(name[2]))
+    {
+        return 0;
+    }
+    
+    return 1;
+}
+
+
+static int find_disk_by_sig(uint8_t *sig, char *diskname)
+{
+    int rc = 0;
+    int count = 0;
+    DIR* dir = NULL;
+    struct dirent* p = NULL;
+    uint8_t vtguid[16];
+    uint8_t vtsig[16];
+
+    dir = opendir("/sys/block");
+    if (!dir)
+    {
+        return 0;
+    }
+    
+    while ((p = readdir(dir)) != NULL)
+    {
+        if (!vtoy_is_possible_blkdev(p->d_name))
+        {
+            continue;
+        }
+    
+        rc = vtoy_get_disk_guid(p->d_name, vtguid, vtsig);
+        if (rc == 0 && memcmp(vtsig, sig, 4) == 0)
+        {
+            sprintf(diskname, "%s", p->d_name);
+            count++;
+        }
+    }
+    closedir(dir);
+    
+    return count;    
+}
+
+static uint64_t get_part_offset(char *partname)
+{
+    int fd;
+    uint64_t offset;
+    char buf[32] = {0};
+    char path[PATH_MAX];
+
+    snprintf(path, PATH_MAX - 1, "/sys/class/block/%s/start", partname);
+
+    fd = open(path, O_RDONLY);
+    if (fd < 0)
+    {
+        return 0;
+    }
+
+    read(fd, buf, sizeof(buf));
+    close(fd);
+
+    offset = (uint64_t)strtoull(buf, NULL, 10);
+    offset *= 512;
+
+    return offset;
+}
+
+static int create_vlnk(char *infile, char *diskname, uint64_t partoff, char *outfile)
+{
+    FILE *fp;
+    int len;
+    uint32_t sig = 0;
+
+    debug("create vlnk\n");
+    
+    if (infile[0] == 0 || outfile[0] == 0 || diskname[0] == 0 || partoff == 0)
+    {
+        debug("Invalid parameters: %d %d %d %llu\n", infile[0], outfile[0], diskname[0], (unsigned long long)partoff);
+        return 1;
+    }
+
+    len = (int)strlen(infile);
+    if (len >= VLNK_NAME_MAX)
+    {
+        printf("File name length %d is too long for vlnk!\n", len);
+        return 1;
+    }
+
+    if (get_disk_sig(diskname, &sig))
+    {
+        printf("Failed to read disk sig\n");
+        return 1;
+    }
+
+    fp = fopen(outfile, "wb+");
+    if (!fp)
+    {
+        printf("Failed to create file %s\n", outfile);
+        return 1;
+    }
+
+    memset(g_vlnk_buf, 0, sizeof(g_vlnk_buf));
+    ventoy_create_vlnk(sig, partoff, infile, (ventoy_vlnk *)g_vlnk_buf);
+    fwrite(g_vlnk_buf, 1, VLNK_FILE_LEN, fp);
+    fclose(fp);
+
+    return 0;
+}
+
+static int get_mount_point(char *partname, char *mntpoint)
+{
+    int i;
+    int len;
+    int rc = 1;
+    FILE *fp = NULL;
+    char line[PATH_MAX];
+
+    fp = fopen("/proc/mounts", "r");
+    if (!fp)
+    {
+        return 1;
+    }
+
+    len = (int)strlen(partname);
+    while (fgets(line, sizeof(line), fp))
+    {
+        if (strncmp(line, partname, len) == 0)
+        {
+            for (i = len; i < PATH_MAX && line[i]; i++)
+            {
+                if (line[i] == ' ')
+                {
+                    line[i] = 0;
+                    rc = 0;
+                    strncpy(mntpoint, line + len, PATH_MAX - 1);                    
+                    break;
+                }
+            }
+            break;
+        }
+    }
+
+    fclose(fp);
+    return rc;
+}
+
+static int parse_vlnk(char *infile)
+{
+    int i;
+    int fd;
+    int cnt;
+    int pflag = 0;
+    char diskname[128] = {0};
+    char partname[128] = {0};
+    char partpath[256] = {0};
+    char mntpoint[PATH_MAX];
+    ventoy_vlnk vlnk;
+
+    debug("parse vlnk\n");
+    
+    if (infile[0] == 0)
+    {
+        debug("input file null\n");
+        return 1;
+    }
+
+    fd = open(infile, O_RDONLY);
+    if (fd < 0)
+    {
+        printf("Failed to open file %s error %d\n", infile, errno);
+        return 1;
+    }
+
+    memset(&vlnk, 0, sizeof(vlnk));
+    read(fd, &vlnk, sizeof(vlnk));
+    close(fd);
+
+    debug("disk_signature:%08X\n", vlnk.disk_signature);
+    debug("file path:<%s>\n", vlnk.filepath);
+    debug("part offset: %llu\n", (unsigned long long)vlnk.part_offset);
+    
+    cnt = find_disk_by_sig((uint8_t *)&(vlnk.disk_signature), diskname);
+    if (cnt != 1)
+    {
+        printf("Disk in vlnk not found!\n");
+        return 1;
+    }
+
+    debug("Disk is <%s>\n", diskname);
+
+    if (strstr(diskname, "nvme") || strstr(diskname, "mmc") || strstr(diskname, "nbd"))
+    {
+        pflag = 1;
+    }
+
+    for (i = 1; i <= 128; i++)
+    {
+        if (pflag)
+        {
+            snprintf(partname, sizeof(partname) - 1, "%sp%d", diskname, i);            
+        }
+        else
+        {
+            snprintf(partname, sizeof(partname) - 1, "%s%d", diskname, i);            
+        }
+
+        if (get_part_offset(partname) == vlnk.part_offset)
+        {
+            debug("Find correct partition </dev/%s>\n", partname);
+            break;
+        }
+    }
+
+    if (i > 128)
+    {
+        printf("Partition in vlnk not found!");
+        return 1;
+    }
+
+    snprintf(partpath, sizeof(partpath), "/dev/%s ", partname);
+    if (get_mount_point(partpath, mntpoint))
+    {
+        printf("Mountpoint of %s is not found!\n", partpath);
+        return 1;
+    }
+    debug("moutpoint of %s is <%s>\n", partpath, mntpoint);
+
+    strcat(mntpoint, vlnk.filepath);
+    printf("Vlnk Point: %s\n", mntpoint);
+    if (access(mntpoint, F_OK) >= 0)
+    {
+        printf("File Exist: YES\n");    
+    }
+    else
+    {
+        printf("File Exist: NO\n");    
+    }
+
+    return 0;
+}
+
+static int check_vlnk(char *infile)
+{
+    int fd;
+    int64_t size;
+    ventoy_vlnk vlnk;
+
+    debug("check vlnk\n");
+    
+    if (infile[0] == 0)
+    {
+        debug("input file null\n");
+        return 1;
+    }
+
+    size = get_file_size(infile);
+    if (size != VLNK_FILE_LEN)
+    {
+        debug("file size %lld is not a vlnk file size\n", (long long)size);
+        return 1;
+    }
+
+    fd = open(infile, O_RDONLY);
+    if (fd < 0)
+    {
+        debug("Failed to open file %s error %d\n", infile, errno);
+        return 1;
+    }
+
+    memset(&vlnk, 0, sizeof(vlnk));
+    read(fd, &vlnk, sizeof(vlnk));
+    close(fd);
+
+    if (CheckVlnkData(&vlnk))
+    {
+        return 0;
+    }
+
+    return 1;
+}
+
+int main(int argc, char **argv)
+{
+    int ch = 0;
+    int cmd = 0;
+    uint64_t partoff = 0;
+    char infile[PATH_MAX] = {0};
+    char outfile[PATH_MAX] = {0};
+    char diskname[256] = {0};
+
+    while ((ch = getopt(argc, argv, "c:t:l:d:p:o:v::")) != -1)
+    {
+        if (ch == 'c')
+        {
+            cmd = 1;
+            strncpy(infile, optarg, sizeof(infile) - 1);
+        }
+        else if (ch == 'o')
+        {
+            strncpy(outfile, optarg, sizeof(outfile) - 1);
+        }
+        else if (ch == 'l')
+        {
+            cmd = 2;
+            strncpy(infile, optarg, sizeof(infile) - 1);
+        }
+        else if (ch == 't')
+        {
+            cmd = 3;
+            strncpy(infile, optarg, sizeof(infile) - 1);
+        }        
+        else if (ch == 'd')
+        {
+            strncpy(diskname, optarg, sizeof(diskname) - 1);
+        }
+        else if (ch == 'p')
+        {
+            partoff = (uint64_t)strtoull(optarg, NULL, 10);
+            partoff *= 512;
+        }
+        else if (ch == 'v')
+        {
+            verbose = 1;
+        }
+        else
+        {
+            return 1;
+        }
+    }
+
+    if (cmd == 1)
+    {
+        return create_vlnk(infile, diskname, partoff, outfile);
+    }
+    else if (cmd == 2)
+    {
+        return parse_vlnk(infile);
+    }
+    else if (cmd == 3)
+    {
+        return check_vlnk(infile);
+    }
+    else
+    {
+        printf("Invalid command %d\n", cmd);
+        return 1;
+    }
+}
+
diff --git a/Vlnk/src/main_windows.c b/Vlnk/src/main_windows.c
new file mode 100644 (file)
index 0000000..6596c29
--- /dev/null
@@ -0,0 +1,711 @@
+#include <Windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdint.h>\r
+#include <time.h>\r
+#include <resource.h>\r
+#include <vlnk.h>\r
+\r
+static WCHAR g_CurDirW[MAX_PATH];\r
+static CHAR g_CurDirA[MAX_PATH];\r
+static CHAR g_LogFile[MAX_PATH];\r
+static HWND g_create_button;\r
+static HWND g_parse_button;\r
+\r
+typedef enum MSGID\r
+{\r
+    MSGID_ERROR = 0,\r
+       MSGID_INFO,\r
+       MSGID_BTN_CREATE,\r
+       MSGID_BTN_PARSE,\r
+    MSGID_SRC_UNSUPPORTED,\r
+    MSGID_FS_UNSUPPORTED,\r
+    MSGID_SUFFIX_UNSUPPORTED,\r
+    MSGID_DISK_INFO_ERR,\r
+    MSGID_VLNK_SUCCESS,\r
+    MSGID_RUNNING_TIP,\r
+    MSGID_CREATE_FILE_ERR,\r
+    MSGID_ALREADY_VLNK,\r
+    MSGID_INVALID_VLNK,\r
+    MSGID_VLNK_POINT_TO,\r
+    MSGID_VLNK_NO_DST,\r
+    MSGID_FILE_NAME_TOO_LONG,\r
+\r
+    MSGID_BUTT\r
+}MSGID;\r
+\r
+\r
+const WCHAR *g_msg_cn[MSGID_BUTT] =\r
+{\r
+    L"´íÎó",\r
+       L"ÌáÐÑ",\r
+       L"´´½¨",\r
+       L"½âÎö",        \r
+    L"²»Ö§³ÖΪ´ËÎļþ´´½¨vlnk",\r
+    L"²»Ö§³ÖµÄÎļþϵͳ",\r
+    L"²»Ö§³ÖµÄÎļþºó׺Ãû",\r
+    L"»ñÈ¡´ÅÅÌÐÅϢʱ·¢Éú´íÎó",\r
+    L"Vlnk Îļþ´´½¨³É¹¦¡£",\r
+    L"ÇëÏȹرÕÕýÔÚÔËÐеĠVentoyVlnk ³ÌÐò£¡",\r
+    L"´´½¨Îļþʧ°Ü",\r
+    L"´ËÎļþÒѾ­ÊÇÒ»¸övlnkÎļþÁË£¡",\r
+    L"·Ç·¨µÄvlnkÎļþ!",\r
+    L"´Ë vlnk ÎļþÖ¸Ïò ",\r
+    L"´Ë vlnk Ö¸ÏòµÄÎļþ²»´æÔÚ£¡",\r
+    L"Îļþ·¾¶Ì«³¤£¡",\r
+};\r
+const WCHAR *g_msg_en[MSGID_BUTT] =\r
+{\r
+    L"Error",\r
+       L"Info",   \r
+       L"Create",\r
+       L"Parse",\r
+    L"This file is not supported for vlnk",\r
+    L"Unsupported file system!", \r
+    L"Unsupported file suffix!",\r
+    L"Error when getting disk info",\r
+    L"Vlnk file successfully created!",\r
+    L"Please close another running VentoyVlnk instance!",\r
+    L"Failed to create file!",\r
+    L"This file is already a vlnk file!",\r
+    L"Invalid vlnk file!",\r
+    L"The vlnk file point to ",\r
+    L"The file pointed by the vlnk does NOT exist!",\r
+    L"The file full path is too long!",\r
+};\r
+\r
+const WCHAR **g_msg_lang = NULL;\r
+\r
+HINSTANCE g_hInst;\r
+
+static void Log2File(const char *log)
+{
+    time_t stamp;
+    struct tm ttm;
+    FILE *fp;
+
+    time(&stamp);
+    localtime_s(&ttm, &stamp);
+
+    fopen_s(&fp, g_LogFile, "a+");
+    if (fp)
+    {
+        fprintf_s(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s",
+            ttm.tm_year + 1900, ttm.tm_mon + 1, ttm.tm_mday,
+            ttm.tm_hour, ttm.tm_min, ttm.tm_sec, log);
+        fclose(fp);
+    }
+}
+
+void LogW(const WCHAR *Fmt, ...)
+{
+    WCHAR log[512];
+    CHAR  alog[2048];
+    va_list arg;
+
+    if (g_LogFile[0] == 0)
+    {
+        return;
+    }
+
+    va_start(arg, Fmt);
+    vswprintf_s(log, 512, Fmt, arg);
+    va_end(arg);
+
+    WideCharToMultiByte(CP_UTF8, 0, log, -1, alog, 2048, 0, 0);
+
+    Log2File(alog);
+}\r
+\r
+
+void LogA(const CHAR *Fmt, ...)
+{
+    CHAR log[512];
+    va_list arg;
+
+    if (g_LogFile[0] == 0)
+    {
+        return;
+    }
+
+    va_start(arg, Fmt);
+    vsprintf_s(log, 512, Fmt, arg);
+    va_end(arg);
+
+    Log2File(log);
+}\r
+\r
+static int Utf8ToUtf16(const char* src, WCHAR * dst)\r
+{\r
+    int size = MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, 0);\r
+    return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, size + 1);\r
+}\r
+\r
+static BOOL OnDestroyDialog()\r
+{    \r
+    return TRUE;\r
+}\r
+\r
+\r
+static BOOL InitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)\r
+{\r
+    HICON hIcon;\r
+\r
+    g_create_button = GetDlgItem(hWnd, IDC_BUTTON1);\r
+    g_parse_button = GetDlgItem(hWnd, IDC_BUTTON2);\r
+       \r
+       hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1));\r
+    SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);\r
+    SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);\r
+\r
+    SetWindowTextW(g_create_button, g_msg_lang[MSGID_BTN_CREATE]);\r
+    SetWindowTextW(g_parse_button, g_msg_lang[MSGID_BTN_PARSE]);\r
+\r
+    return TRUE;\r
+}\r
+\r
+static int GetPhyDiskInfo(const char LogicalDrive, UINT32 *DiskSig, DISK_EXTENT *DiskExtent)\r
+{\r
+    BOOL Ret;\r
+    DWORD dwSize;\r
+    HANDLE Handle;\r
+    VOLUME_DISK_EXTENTS DiskExtents;\r
+    CHAR PhyPath[128];\r
+    UINT8 SectorBuf[512];\r
+\r
+    LogA("GetPhyDiskInfo %C\n", LogicalDrive);\r
+\r
+    sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\%C:", LogicalDrive);\r
+    Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
+    if (Handle == INVALID_HANDLE_VALUE)\r
+    {\r
+        LogA("Could not open the disk %C: error:%u\n", LogicalDrive, GetLastError());\r
+        return 1;\r
+    }\r
+\r
+    Ret = DeviceIoControl(Handle,\r
+        IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,\r
+        NULL,\r
+        0,\r
+        &DiskExtents,\r
+        (DWORD)(sizeof(DiskExtents)),\r
+        (LPDWORD)&dwSize,\r
+        NULL);\r
+    if (!Ret || DiskExtents.NumberOfDiskExtents == 0)\r
+    {\r
+        LogA("DeviceIoControl IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS failed, error:%u\n", GetLastError());\r
+        CloseHandle(Handle);\r
+        return 1;\r
+    }\r
+    CloseHandle(Handle);\r
+\r
+    memcpy(DiskExtent, DiskExtents.Extents, sizeof(DISK_EXTENT));\r
+    LogA("%C: is in PhysicalDrive%d Offset:%llu\n", LogicalDrive, DiskExtents.Extents[0].DiskNumber,\r
+        (ULONGLONG)(DiskExtents.Extents[0].StartingOffset.QuadPart));\r
+\r
+    sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskExtents.Extents[0].DiskNumber);\r
+    Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
+    if (Handle == INVALID_HANDLE_VALUE)\r
+    {\r
+        LogA("Could not open the disk<PhysicalDrive%d>, error:%u\n", DiskExtents.Extents[0].DiskNumber, GetLastError());\r
+        return 1;\r
+    }\r
+\r
+    if (!ReadFile(Handle, SectorBuf, sizeof(SectorBuf), &dwSize, NULL))\r
+    {\r
+        LogA("ReadFile failed, dwSize:%u  error:%u\n", dwSize, GetLastError());\r
+        CloseHandle(Handle);\r
+        return 1;\r
+    }\r
+\r
+    memcpy(DiskSig, SectorBuf + 0x1B8, 4);\r
+\r
+    CloseHandle(Handle);\r
+    return 0;\r
+}\r
+\r
+\r
+static int SaveBuffer2File(const WCHAR *Fullpath, void *Buffer, DWORD Length)\r
+{\r
+    int rc = 1;\r
+    DWORD dwSize;\r
+    HANDLE Handle;\r
+\r
+    LogW(L"SaveBuffer2File <%ls> len:%u\n", Fullpath, Length);\r
+\r
+    Handle = CreateFileW(Fullpath, GENERIC_READ | GENERIC_WRITE,\r
+        FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0);\r
+    if (Handle == INVALID_HANDLE_VALUE)\r
+    {\r
+        LogA("Could not create new file, error:%u\n", GetLastError());\r
+        goto End;\r
+    }\r
+\r
+    WriteFile(Handle, Buffer, Length, &dwSize, NULL);\r
+\r
+    rc = 0;\r
+\r
+End:\r
+\r
+    if (Handle != INVALID_HANDLE_VALUE)\r
+    {\r
+        CloseHandle(Handle);\r
+    }\r
+\r
+\r
+    return rc;\r
+}\r
+\r
+static int DefaultVlnkDstFullPath(WCHAR *Src, WCHAR *Dir, WCHAR *Dst)\r
+{\r
+    int i, j;\r
+    int len;\r
+    int wrlen;\r
+    WCHAR C;\r
+\r
+    len = (int)lstrlen(Src);\r
+    for (i = len - 1; i >= 0; i--)\r
+    {\r
+        if (Src[i] == '.')\r
+        {\r
+            C = Src[i];\r
+            Src[i] = 0;\r
+            wrlen = swprintf_s(Dst, MAX_PATH, L"%ls\\%ls.vlnk.%ls", Dir, Src, Src + i + 1);\r
+            Src[i] = C;\r
+\r
+            for (j = wrlen - (len - i); j < wrlen; j++)\r
+            {\r
+                if (Dst[j] >= 'A' && Dst[j] <= 'Z')\r
+                {\r
+                    Dst[j] = 'a' + (Dst[j] - 'A');\r
+                }\r
+            }\r
+\r
+            break;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static BOOL IsVlnkFile(WCHAR *path, ventoy_vlnk *outvlnk)\r
+{\r
+    BOOL bRet;\r
+    BOOL bVlnk = FALSE;\r
+    DWORD dwSize;\r
+    LARGE_INTEGER FileSize;\r
+    HANDLE Handle;\r
+    ventoy_vlnk vlnk;\r
+\r
+    Handle = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);\r
+    if (Handle == INVALID_HANDLE_VALUE)\r
+    {\r
+        LogA("Could not open this file, error:%u\n", GetLastError());\r
+        return FALSE;\r
+    }\r
+\r
+    if (!GetFileSizeEx(Handle, &FileSize))\r
+    {\r
+        LogA("Failed to get vlnk file size\n");\r
+        goto End;\r
+    }\r
+\r
+    if (FileSize.QuadPart != VLNK_FILE_LEN)\r
+    {\r
+        LogA("Invalid vlnk file length %llu\n", (unsigned long long)FileSize.QuadPart);\r
+        goto End;\r
+    }\r
+\r
+    memset(&vlnk, 0, sizeof(vlnk));\r
+    bRet = ReadFile(Handle, &vlnk, sizeof(vlnk), &dwSize, NULL);\r
+    if (bRet && CheckVlnkData(&vlnk))\r
+    {\r
+        if (outvlnk)\r
+        {\r
+            memcpy(outvlnk, &vlnk, sizeof(vlnk));\r
+        }\r
+\r
+        bVlnk = TRUE;\r
+    }\r
+\r
+End:\r
+\r
+    if (Handle != INVALID_HANDLE_VALUE)\r
+    {\r
+        CloseHandle(Handle);\r
+    }\r
+\r
+    return bVlnk;\r
+}\r
+\r
+\r
+static int CreateVlnk(HWND hWnd, WCHAR *Dir)\r
+{\r
+    int i;\r
+    int end;\r
+    int len;\r
+    UINT32 DiskSig;\r
+    DISK_EXTENT DiskExtend;\r
+    OPENFILENAME ofn = { 0 };\r
+    CHAR UTF8Path[MAX_PATH];\r
+    WCHAR DstFullPath[MAX_PATH];\r
+    WCHAR szFile[MAX_PATH] = { 0 };\r
+    CHAR suffix[8] = { 0 };\r
+    CHAR Drive[8] = { 0 };\r
+    CHAR FsName[64] = { 0 };\r
+    CHAR *Buf = NULL;\r
+    WCHAR *Pos = NULL;\r
+    ventoy_vlnk *vlnk = NULL;\r
+\r
+    ofn.lStructSize = sizeof(ofn);\r
+    ofn.hwndOwner = hWnd;\r
+    ofn.lpstrFile = szFile;\r
+    ofn.nMaxFile = sizeof(szFile);\r
+    ofn.lpstrFilter = L"Vlnk Source File\0*.iso;*.img;*.wim;*.vhd;*.vhdx;*.vtoy;*.efi;*.dat\0";\r
+    ofn.nFilterIndex = 1;\r
+    ofn.lpstrFileTitle = NULL;\r
+    ofn.nMaxFileTitle = 0;\r
+    ofn.lpstrInitialDir = NULL;\r
+    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\r
+\r
+    if (GetOpenFileName(&ofn) != TRUE)\r
+    {\r
+        return 1;\r
+    }\r
+\r
+    LogW(L"Create vlnk for <%ls>\n", szFile);\r
+    \r
+    len = lstrlen(szFile);\r
+\r
+    if (len < 5 || szFile[0] == '.' || szFile[1] != ':')\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_SRC_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+    \r
+    Drive[0] = (CHAR)szFile[0];\r
+    Drive[1] = ':';\r
+    Drive[2] = '\\';\r
+    if (0 == GetVolumeInformationA(Drive, NULL, 0, NULL, NULL, NULL, FsName, sizeof(FsName) - 1))\r
+    {\r
+        LogA("GetVolumeInformationA failed %u\n", GetLastError());\r
+        return 1;\r
+    }\r
+\r
+    LogA("Partition filesystem of <%s> is <%s>\n", Drive, FsName);\r
+    if (_stricmp(FsName, "NTFS") == 0 ||\r
+        _stricmp(FsName, "exFAT") == 0 ||\r
+        _stricmp(FsName, "FAT") == 0 ||\r
+        _stricmp(FsName, "FAT32") == 0 ||\r
+        _stricmp(FsName, "FAT16") == 0 ||\r
+        _stricmp(FsName, "FAT12") == 0 ||\r
+        _stricmp(FsName, "UDF") == 0)\r
+    {\r
+        LogA("FS Check OK\n");\r
+    }\r
+    else\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_FS_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+\r
+    end = (szFile[len - 5] == '.') ? 5 : 4;\r
+    for (i = 0; i < end; i++)\r
+    {\r
+        suffix[i] = (CHAR)szFile[len - (end - i)];\r
+    }\r
+\r
+    if (!IsSupportedImgSuffix(suffix))\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_SUFFIX_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    if (IsVlnkFile(szFile, NULL))\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_ALREADY_VLNK], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    for (i = 0; i < MAX_PATH && szFile[i]; i++)\r
+    {\r
+        if (szFile[i] == '\\' || szFile[i] == '/')\r
+        {\r
+            Pos = szFile + i;\r
+        }\r
+    }\r
+\r
+    if (!Pos)\r
+    {\r
+        LogA("name part not found\n");\r
+        return 1;\r
+    }\r
+    LogW(L"File Name is <%ls>\n", Pos + 1);\r
+\r
+    memset(UTF8Path, 0, sizeof(UTF8Path));\r
+    WideCharToMultiByte(CP_UTF8, 0, szFile + 2, -1, UTF8Path, MAX_PATH, NULL, 0);\r
+\r
+    for (i = 0; i < MAX_PATH && UTF8Path[i]; i++)\r
+    {\r
+        if (UTF8Path[i] == '\\')\r
+        {\r
+            UTF8Path[i] = '/';\r
+        }\r
+    }\r
+\r
+    len = (int)strlen(UTF8Path);\r
+    if (len >= VLNK_NAME_MAX)\r
+    {\r
+        LogA("File name length %d overflow\n", len);\r
+        MessageBox(hWnd, g_msg_lang[MSGID_FILE_NAME_TOO_LONG], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    DiskExtend.StartingOffset.QuadPart = 0;\r
+    if (GetPhyDiskInfo((char)szFile[0], &DiskSig, &DiskExtend))\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_DISK_INFO_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    Buf = malloc(VLNK_FILE_LEN);\r
+    if (Buf)\r
+    {\r
+        memset(Buf, 0, VLNK_FILE_LEN);\r
+        vlnk = (ventoy_vlnk *)Buf;\r
+        ventoy_create_vlnk(DiskSig, (uint64_t)DiskExtend.StartingOffset.QuadPart, UTF8Path, vlnk);\r
+\r
+        DefaultVlnkDstFullPath(Pos + 1, Dir, DstFullPath);\r
+        LogW(L"vlnk output file path is <%ls>\n", DstFullPath);\r
+\r
+        if (SaveBuffer2File(DstFullPath, Buf, VLNK_FILE_LEN) == 0)\r
+        {\r
+            WCHAR Msg[1024];\r
+\r
+            swprintf_s(Msg, 1024, L"%ls\r\n\r\n%ls", g_msg_lang[MSGID_VLNK_SUCCESS], DstFullPath + lstrlen(Dir) + 1);\r
+\r
+            LogW(L"Vlnk file create success <%ls>\n", DstFullPath);\r
+            MessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION);\r
+        }\r
+        else\r
+        {\r
+            LogA("Vlnk file save failed\n");\r
+            MessageBox(hWnd, g_msg_lang[MSGID_CREATE_FILE_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        }\r
+\r
+        free(Buf);\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static CHAR GetDriveLetter(UINT32 disksig, UINT64 PartOffset)\r
+{\r
+    CHAR Letter;\r
+    DWORD Drives;\r
+    UINT32 Sig;\r
+    DISK_EXTENT DiskExtent;\r
+\r
+    Letter = 'A';\r
+    Drives = GetLogicalDrives();\r
+    LogA("Logic Drives: 0x%x", Drives);\r
+\r
+    while (Drives)\r
+    {\r
+        if (Drives & 0x01)\r
+        {\r
+            Sig = 0;\r
+            DiskExtent.StartingOffset.QuadPart = 0;\r
+            if (GetPhyDiskInfo(Letter, &Sig, &DiskExtent) == 0)\r
+            {\r
+                if (Sig == disksig && DiskExtent.StartingOffset.QuadPart == PartOffset)\r
+                {\r
+                    return Letter;\r
+                }\r
+            }\r
+        }\r
+\r
+        Drives >>= 1;\r
+        Letter++;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+static int ParseVlnk(HWND hWnd)\r
+{\r
+    int i;\r
+    CHAR Letter;\r
+    ventoy_vlnk vlnk;\r
+    OPENFILENAME ofn = { 0 };\r
+    WCHAR szFile[MAX_PATH] = { 0 };\r
+    WCHAR szDst[MAX_PATH + 2] = { 0 };\r
+    WCHAR Msg[1024];\r
+    CHAR *suffix = NULL;\r
+    HANDLE hFile;\r
+\r
+    ofn.lStructSize = sizeof(ofn);\r
+    ofn.hwndOwner = hWnd;\r
+    ofn.lpstrFile = szFile;\r
+    ofn.nMaxFile = sizeof(szFile);\r
+    ofn.lpstrFilter = L"Vlnk File\0*.vlnk.iso;*.vlnk.img;*.vlnk.wim;*.vlnk.efi;*.vlnk.vhd;*.vlnk.vhdx;*.vlnk.vtoy;*.vlnk.dat\0";\r
+    ofn.nFilterIndex = 1;\r
+    ofn.lpstrFileTitle = NULL;\r
+    ofn.nMaxFileTitle = 0;\r
+    ofn.lpstrInitialDir = NULL;\r
+    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\r
+\r
+    if (GetOpenFileName(&ofn) != TRUE)\r
+    {\r
+        return 1;\r
+    }\r
+\r
+    LogW(L"Parse vlnk for <%ls>\n", szFile);\r
+\r
+    if (!IsVlnkFile(szFile, &vlnk))\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_INVALID_VLNK], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    for (i = 0; i < sizeof(vlnk.filepath) && vlnk.filepath[i]; i++)\r
+    {\r
+        if (vlnk.filepath[i] == '.')\r
+        {\r
+            suffix = vlnk.filepath + i;\r
+        }\r
+    }\r
+\r
+    if (!IsSupportedImgSuffix(suffix))\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_SUFFIX_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    Utf8ToUtf16(vlnk.filepath, szDst + 2);\r
+    for (i = 2; i < MAX_PATH && szDst[i]; i++)\r
+    {\r
+        if (szDst[i] == '/')\r
+        {\r
+            szDst[i] = '\\';\r
+        }\r
+    }\r
+    \r
+\r
+    Letter = GetDriveLetter(vlnk.disk_signature, vlnk.part_offset);\r
+    if (Letter == 0)\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_VLNK_NO_DST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+\r
+    szDst[0] = toupper(Letter);\r
+    szDst[1] = ':';\r
+    LogW(L"vlnk dst is %ls\n", szDst);\r
+\r
+    hFile = CreateFileW(szDst, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);\r
+    if (INVALID_HANDLE_VALUE == hFile)\r
+    {\r
+        MessageBox(hWnd, g_msg_lang[MSGID_VLNK_NO_DST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+        return 1;\r
+    }\r
+    CloseHandle(hFile);\r
+\r
+    swprintf_s(Msg, 1024, L"%ls %ls", g_msg_lang[MSGID_VLNK_POINT_TO], szDst);\r
+    MessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION);\r
+\r
+    return 0;\r
+}\r
+\r
+INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       WORD NotifyCode;\r
+       WORD CtrlID;\r
+\r
+    switch (Message)\r
+    {\r
+               case WM_COMMAND:\r
+               {\r
+                       NotifyCode = HIWORD(wParam);\r
+                       CtrlID = LOWORD(wParam);\r
+\r
+                       if (NotifyCode == BN_CLICKED)\r
+                       {\r
+                               if (CtrlID == IDC_BUTTON1)\r
+                               {\r
+                    EnableWindow(g_create_button, FALSE);\r
+                    CreateVlnk(hWnd, g_CurDirW);\r
+                    EnableWindow(g_create_button, TRUE);\r
+                               }\r
+                               else if (CtrlID == IDC_BUTTON2)\r
+                               {\r
+                    EnableWindow(g_parse_button, FALSE);\r
+                    ParseVlnk(hWnd);\r
+                    EnableWindow(g_parse_button, TRUE);\r
+                               }\r
+                       }\r
+                       break;\r
+               }\r
+        case WM_INITDIALOG:\r
+        {\r
+            InitDialog(hWnd, wParam, lParam);\r
+            break;\r
+        }        \r
+        case WM_CLOSE:\r
+        {\r
+            OnDestroyDialog();\r
+            EndDialog(hWnd, 0);\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)\r
+{\r
+    int i;\r
+       HANDLE hMutex;\r
+\r
+    UNREFERENCED_PARAMETER(hPrevInstance);\r
+\r
+    if (GetUserDefaultUILanguage() == 0x0804)\r
+    {\r
+        g_msg_lang = g_msg_cn;\r
+    }\r
+    else\r
+    {\r
+        g_msg_lang = g_msg_en;\r
+    }\r
+\r
+       hMutex = CreateMutexA(NULL, TRUE, "VtoyVlnkMUTEX");\r
+       if ((hMutex != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS))\r
+       {\r
+               MessageBoxW(NULL, g_msg_lang[MSGID_RUNNING_TIP], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);\r
+               return 1;\r
+       }\r
+\r
+    GetCurrentDirectoryA(MAX_PATH, g_CurDirA);\r
+    GetCurrentDirectoryW(MAX_PATH, g_CurDirW);\r
+    sprintf_s(g_LogFile, sizeof(g_LogFile), "%s\\VentoyVlnk.log", g_CurDirA);\r
+\r
+    for (i = 0; i < __argc; i++)\r
+    {\r
+        if (strncmp(__argv[i], "-Q", 2) == 0 ||\r
+            strncmp(__argv[i], "-q", 2) == 0)\r
+        {\r
+            g_LogFile[0] = 0;\r
+            break;\r
+        }\r
+    }\r
+    \r
+\r
+    LogA("========= VentoyVlnk =========\n");\r
+\r
+    g_hInst = hInstance;\r
+    DialogBoxA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), NULL, DialogProc);\r
+\r
+    return 0;\r
+}\r
diff --git a/Vlnk/src/vlnk.c b/Vlnk/src/vlnk.c
new file mode 100644 (file)
index 0000000..5252e75
--- /dev/null
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include "vlnk.h"
+
+int ventoy_create_vlnk(uint32_t disksig, uint64_t partoffset, const char *path, ventoy_vlnk *vlnk)
+{
+    uint32_t crc;
+    ventoy_guid guid = VENTOY_GUID;
+
+    memcpy(&(vlnk->guid), &guid, sizeof(ventoy_guid));
+    vlnk->disk_signature = disksig;
+    vlnk->part_offset = partoffset;
+
+#ifdef WIN32
+    strcpy_s(vlnk->filepath, sizeof(vlnk->filepath) - 1, path);
+#else
+    strncpy(vlnk->filepath, path, sizeof(vlnk->filepath) - 1);
+#endif
+
+    crc = ventoy_getcrc32c(0, vlnk, sizeof(ventoy_vlnk));
+    vlnk->crc32 = crc;
+
+    return 0;
+}
+
+\r
+int CheckVlnkData(ventoy_vlnk *vlnk)\r
+{\r
+    uint32_t readcrc, calccrc;\r
+    ventoy_guid guid = VENTOY_GUID;\r
+\r
+    if (memcmp(&vlnk->guid, &guid, sizeof(guid)))\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    readcrc = vlnk->crc32;\r
+    vlnk->crc32 = 0;\r
+    calccrc = ventoy_getcrc32c(0, vlnk, sizeof(ventoy_vlnk));\r
+\r
+    if (readcrc != calccrc)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    return 1;\r
+}\r
+\r
+int IsSupportedImgSuffix(char *suffix)\r
+{\r
+    int i = 0;\r
+    const char *suffixs[] =\r
+    {\r
+        ".iso", ".img", ".wim", ".efi", ".vhd", ".vhdx", ".dat", ".vtoy", NULL\r
+    };\r
+\r
+    if (!suffix)\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    while (suffixs[i])\r
+    {\r
+
+#ifdef WIN32\r
+        if (_stricmp(suffixs[i], suffix) == 0)\r
+#else\r
+        if (strcasecmp(suffixs[i], suffix) == 0)\r
+#endif\r
+        {\r
+            return 1;\r
+        }\r
+\r
+        i++;\r
+    }\r
+\r
+    return 0;\r
+}\r
diff --git a/Vlnk/src/vlnk.h b/Vlnk/src/vlnk.h
new file mode 100644 (file)
index 0000000..7734c8e
--- /dev/null
@@ -0,0 +1,38 @@
+
+#ifndef __VLNK_H__
+#define __VLNK_H__
+
+#define VLNK_FILE_LEN  32768
+
+#define VLNK_NAME_MAX  384
+
+#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
+
+#pragma pack(1)
+
+typedef struct ventoy_guid
+{
+    uint32_t   data1;
+    uint16_t   data2;
+    uint16_t   data3;
+    uint8_t    data4[8];
+}ventoy_guid;
+
+typedef struct ventoy_vlnk
+{
+    ventoy_guid   guid;         // VENTOY_GUID
+    uint32_t crc32;        // crc32
+    uint32_t  disk_signature;
+    uint64_t part_offset; // in bytes
+    char filepath[VLNK_NAME_MAX];
+    uint8_t reserverd[96];
+}ventoy_vlnk;
+#pragma pack()
+
+uint32_t ventoy_getcrc32c (uint32_t crc, const void *buf, int size);
+int ventoy_create_vlnk(uint32_t disksig, uint64_t partoffset, const char *path, ventoy_vlnk *vlnk);
+int CheckVlnkData(ventoy_vlnk *vlnk);
+int IsSupportedImgSuffix(char *suffix);
+
+#endif
+
diff --git a/Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe b/Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe
new file mode 100644 (file)
index 0000000..879304d
Binary files /dev/null and b/Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe differ
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk.sln b/Vlnk/vs/VentoyVlnk/VentoyVlnk.sln
new file mode 100644 (file)
index 0000000..cb217b1
--- /dev/null
@@ -0,0 +1,22 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2013\r
+VisualStudioVersion = 12.0.21005.1\r
+MinimumVisualStudioVersion = 10.0.40219.1\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VentoyVlnk", "VentoyVlnk\VentoyVlnk.vcxproj", "{9987D9FE-1A40-4C5F-835C-D66B0FEADA26}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Release|Win32 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {9987D9FE-1A40-4C5F-835C-D66B0FEADA26}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9987D9FE-1A40-4C5F-835C-D66B0FEADA26}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9987D9FE-1A40-4C5F-835C-D66B0FEADA26}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9987D9FE-1A40-4C5F-835C-D66B0FEADA26}.Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/Vlnk32.manifest b/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/Vlnk32.manifest
new file mode 100644 (file)
index 0000000..ba90274
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+       <dependency> \r
+    <dependentAssembly> \r
+        <assemblyIdentity \r
+            type="win32" \r
+            name="Microsoft.Windows.Common-Controls" \r
+            version="6.0.0.0" \r
+            processorArchitecture="x86" \r
+            publicKeyToken="6595b64144ccf1df" \r
+            language="*" \r
+        /> \r
+    </dependentAssembly> \r
+       </dependency> \r
+    \r
+    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\r
+        <application>\r
+            <!-- Windows 10 -->\r
+            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\r
+            <!-- Windows 8.1 -->\r
+            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\r
+            <!-- Windows 8 -->\r
+            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\r
+            <!-- Windows 7 -->\r
+            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\r
+            <!-- Windows Vista -->\r
+            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> \r
+        </application>\r
+    </compatibility>\r
+       <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">\r
+               <security>\r
+                 <requestedPrivileges>\r
+                       <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>\r
+                 </requestedPrivileges>\r
+               </security>\r
+       </trustInfo>    \r
+</assembly>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/Vlnk64.manifest b/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/Vlnk64.manifest
new file mode 100644 (file)
index 0000000..a0559d7
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+       <dependency> \r
+    <dependentAssembly> \r
+        <assemblyIdentity \r
+            type="win32" \r
+            name="Microsoft.Windows.Common-Controls" \r
+            version="6.0.0.0" \r
+            processorArchitecture="amd64" \r
+            publicKeyToken="6595b64144ccf1df" \r
+            language="*" \r
+        /> \r
+    </dependentAssembly> \r
+       </dependency> \r
+    \r
+    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\r
+        <application>\r
+            <!-- Windows 10 -->\r
+            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\r
+            <!-- Windows 8.1 -->\r
+            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\r
+            <!-- Windows 8 -->\r
+            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\r
+            <!-- Windows 7 -->\r
+            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\r
+            <!-- Windows Vista -->\r
+            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> \r
+        </application>\r
+    </compatibility>\r
+    \r
+</assembly>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/VlnkArm.manifest b/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/VlnkArm.manifest
new file mode 100644 (file)
index 0000000..1856178
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+       <dependency> \r
+    <dependentAssembly> \r
+        <assemblyIdentity \r
+            type="win32" \r
+            name="Microsoft.Windows.Common-Controls" \r
+            version="6.0.0.0" \r
+            processorArchitecture="arm" \r
+            publicKeyToken="6595b64144ccf1df" \r
+            language="*" \r
+        /> \r
+    </dependentAssembly> \r
+       </dependency> \r
+    \r
+    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\r
+        <application>\r
+            <!-- Windows 10 -->\r
+            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\r
+            <!-- Windows 8.1 -->\r
+            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\r
+            <!-- Windows 8 -->\r
+            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\r
+            <!-- Windows 7 -->\r
+            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\r
+            <!-- Windows Vista -->\r
+            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> \r
+        </application>\r
+    </compatibility>\r
+    \r
+</assembly>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/VlnkArm64.manifest b/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/VlnkArm64.manifest
new file mode 100644 (file)
index 0000000..067e7f6
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+       <dependency> \r
+    <dependentAssembly> \r
+        <assemblyIdentity \r
+            type="win32" \r
+            name="Microsoft.Windows.Common-Controls" \r
+            version="6.0.0.0" \r
+            processorArchitecture="arm64" \r
+            publicKeyToken="6595b64144ccf1df" \r
+            language="*" \r
+        /> \r
+    </dependentAssembly> \r
+       </dependency> \r
+    \r
+    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\r
+        <application>\r
+            <!-- Windows 10 -->\r
+            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\r
+            <!-- Windows 8.1 -->\r
+            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\r
+            <!-- Windows 8 -->\r
+            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\r
+            <!-- Windows 7 -->\r
+            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\r
+            <!-- Windows Vista -->\r
+            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> \r
+        </application>\r
+    </compatibility>\r
+    \r
+</assembly>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/vlnk.ico b/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/vlnk.ico
new file mode 100644 (file)
index 0000000..615f2ae
Binary files /dev/null and b/Vlnk/vs/VentoyVlnk/VentoyVlnk/Res/vlnk.ico differ
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.aps b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.aps
new file mode 100644 (file)
index 0000000..b6021a9
Binary files /dev/null and b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.aps differ
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.rc b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.rc
new file mode 100644 (file)
index 0000000..13fc94b
Binary files /dev/null and b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.rc differ
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj
new file mode 100644 (file)
index 0000000..62de30c
--- /dev/null
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{9987D9FE-1A40-4C5F-835C-D66B0FEADA26}</ProjectGuid>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <RootNamespace>VentoyVlnk</RootNamespace>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <UseDebugLibraries>true</UseDebugLibraries>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <UseDebugLibraries>false</UseDebugLibraries>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <LinkIncremental>true</LinkIncremental>\r
+    <IncludePath>$(ProjectDir);$(SolutionDir)/../../src;$(IncludePath)</IncludePath>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <LinkIncremental>false</LinkIncremental>\r
+    <IncludePath>$(SolutionDir)/../../src;$(ProjectDir);$(IncludePath)</IncludePath>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <Optimization>Disabled</Optimization>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <SDLCheck>true</SDLCheck>\r
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
+    </ClCompile>\r
+    <Link>\r
+      <SubSystem>Windows</SubSystem>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>\r
+    </Link>\r
+    <Manifest>\r
+      <AdditionalManifestFiles>$(ProjectDir)\Res\Vlnk32.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\r
+    </Manifest>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <SDLCheck>true</SDLCheck>\r
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
+    </ClCompile>\r
+    <Link>\r
+      <SubSystem>Windows</SubSystem>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>\r
+    </Link>\r
+    <Manifest>\r
+      <AdditionalManifestFiles>$(ProjectDir)\Res\Vlnk32.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>\r
+    </Manifest>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\src\vlnk.h" />\r
+    <ClInclude Include="resource.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ResourceCompile Include="VentoyVlnk.rc" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\crc32.c" />\r
+    <ClCompile Include="..\..\..\src\main_windows.c" />\r
+    <ClCompile Include="..\..\..\src\vlnk.c" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Image Include="Res\vlnk.ico" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj.filters b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj.filters
new file mode 100644 (file)
index 0000000..0a1deb6
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="源文件">\r
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+    </Filter>\r
+    <Filter Include="头文件">\r
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
+    </Filter>\r
+    <Filter Include="资源文件">\r
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="resource.h">\r
+      <Filter>头文件</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\src\vlnk.h">\r
+      <Filter>源文件</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ResourceCompile Include="VentoyVlnk.rc">\r
+      <Filter>资源文件</Filter>\r
+    </ResourceCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\crc32.c">\r
+      <Filter>源文件</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\main_windows.c">\r
+      <Filter>源文件</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\vlnk.c">\r
+      <Filter>源文件</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Image Include="Res\vlnk.ico">\r
+      <Filter>资源文件</Filter>\r
+    </Image>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj.user b/Vlnk/vs/VentoyVlnk/VentoyVlnk/VentoyVlnk.vcxproj.user
new file mode 100644 (file)
index 0000000..418af1c
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <LocalDebuggerWorkingDirectory>K:\test\ventoy\ventoy-1.0.57</LocalDebuggerWorkingDirectory>\r
+    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\r
+  </PropertyGroup>\r
+</Project>
\ No newline at end of file
diff --git a/Vlnk/vs/VentoyVlnk/VentoyVlnk/resource.h b/Vlnk/vs/VentoyVlnk/VentoyVlnk/resource.h
new file mode 100644 (file)
index 0000000..449c71b
Binary files /dev/null and b/Vlnk/vs/VentoyVlnk/VentoyVlnk/resource.h differ
index e830ce7364e884d7c7cd20a7c501f8dee7a5280a..10308b2eeae138744e4eef2bbb8c35944bf92fe1 100644 (file)
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <linux/fs.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <linux/fs.h>
+#include <dirent.h>
 #include "biso.h"
 #include "biso_list.h"
 #include "biso_util.h"
 #include "biso_plat.h"
 #include "biso_9660.h"
 #include "biso.h"
 #include "biso_list.h"
 #include "biso_util.h"
 #include "biso_plat.h"
 #include "biso_9660.h"
+#include "vtoytool.h"
 
 #ifndef O_BINARY
 #define O_BINARY 0
 
 #ifndef O_BINARY
 #define O_BINARY 0
@@ -484,7 +486,7 @@ static int vtoydm_print_extract_iso
 
 
 
 
 
 
-static int vtoydm_print_linear_table(const char *img_map_file, const char *diskname)
+static int vtoydm_print_linear_table(const char *img_map_file, const char *diskname, int part, uint64_t offset)
 {
     int i;
     int len;
 {
     int i;
     int len;
@@ -511,15 +513,15 @@ static int vtoydm_print_linear_table(const char *img_map_file, const char *diskn
         #else
         if (strstr(diskname, "nvme") || strstr(diskname, "mmc") || strstr(diskname, "nbd"))
         {
         #else
         if (strstr(diskname, "nvme") || strstr(diskname, "mmc") || strstr(diskname, "nbd"))
         {
-            printf("%u %u linear %sp1 %llu\n", 
+            printf("%u %u linear %sp%d %llu\n", 
                (sector_start << 2), disk_sector_num, 
                (sector_start << 2), disk_sector_num, 
-               diskname, (unsigned long long)chunk[i].disk_start_sector - 2048);
+               diskname, part, (unsigned long long)chunk[i].disk_start_sector - offset);
         }
         else
         {
         }
         else
         {
-            printf("%u %u linear %s1 %llu\n", 
+            printf("%u %u linear %s%d %llu\n", 
                (sector_start << 2), disk_sector_num, 
                (sector_start << 2), disk_sector_num, 
-               diskname, (unsigned long long)chunk[i].disk_start_sector - 2048);
+               diskname, part, (unsigned long long)chunk[i].disk_start_sector - offset);
         }
         #endif
     }
         }
         #endif
     }
@@ -539,10 +541,98 @@ static int vtoydm_print_help(FILE *fp)
     return 0;        
 }
 
     return 0;        
 }
 
+static uint64_t vtoydm_get_part_start(const char *diskname, int part)
+{
+    int fd;
+    unsigned long long size = 0;
+    char diskpath[256] = {0};
+    char sizebuf[64] = {0};
+
+    if (strstr(diskname, "nvme") || strstr(diskname, "mmc") || strstr(diskname, "nbd"))
+    {
+        snprintf(diskpath, sizeof(diskpath) - 1, "/sys/class/block/%sp%d/start", diskname, part);
+    }
+    else
+    {
+        snprintf(diskpath, sizeof(diskpath) - 1, "/sys/class/block/%s%d/start", diskname, part);
+    }
+
+    if (access(diskpath, F_OK) >= 0)
+    {
+        debug("get part start from sysfs for %s %d\n", diskname, part);
+        
+        fd = open(diskpath, O_RDONLY | O_BINARY);
+        if (fd >= 0)
+        {
+            read(fd, sizebuf, sizeof(sizebuf));
+            size = strtoull(sizebuf, NULL, 10);
+            close(fd);
+            return size;
+        }
+    }
+    else
+    {
+        debug("%s not exist \n", diskpath);
+    }
+
+    return size;
+}
+
+static int vtoydm_vlnk_convert(char *disk, int len, int *part, uint64_t *offset)
+{
+    int rc = 1;
+    int cnt = 0;
+    int rdlen;
+    FILE *fp = NULL;
+    ventoy_os_param param;
+    char diskname[128] = {0};
+
+    fp = fopen("/ventoy/ventoy_os_param", "rb");
+    if (!fp)
+    {
+        debug("dm vlnk convert not exist %d\n", errno);
+        goto end;
+    }
+
+    memset(&param, 0, sizeof(param));
+    rdlen = (int)fread(&param, 1, sizeof(param), fp);
+    if (rdlen != (int)sizeof(param))
+    {
+        debug("fread failed %d %d\n", rdlen, errno);
+        goto end;
+    }
+
+    debug("dm vlnk convert vtoy_reserved=%d\n", param.vtoy_reserved[6]);
+
+    if (param.vtoy_reserved[6])
+    {
+        cnt = vtoy_find_disk_by_guid(&param, diskname);
+        debug("vtoy_find_disk_by_guid cnt=%d\n", cnt);        
+        if (cnt == 1)
+        {
+            *part = param.vtoy_disk_part_id;
+            *offset = vtoydm_get_part_start(diskname, *part);
+            
+            debug("VLNK <%s> <%s> <P%d> <%llu>\n", disk, diskname, *part, (unsigned long long)(*offset));
+
+            snprintf(disk, len, "/dev/%s", diskname);
+
+            rc = 0;
+        }
+    }
+
+end:
+    if (fp)
+        fclose(fp);
+    return rc;
+}
+
 int vtoydm_main(int argc, char **argv)
 {
     int ch;
     int cmd = 0;
 int vtoydm_main(int argc, char **argv)
 {
     int ch;
     int cmd = 0;
+    int part = 1;
+    uint64_t offset = 2048;
     unsigned long first_sector = 0;
     unsigned long long file_size = 0;
     char diskname[128] = {0};
     unsigned long first_sector = 0;
     unsigned long long file_size = 0;
     char diskname[128] = {0};
@@ -615,11 +705,13 @@ int vtoydm_main(int argc, char **argv)
     debug("cmd=%d file=<%s> disk=<%s> first_sector=%lu file_size=%llu\n", 
           cmd, filepath, diskname, first_sector, file_size);
 
     debug("cmd=%d file=<%s> disk=<%s> first_sector=%lu file_size=%llu\n", 
           cmd, filepath, diskname, first_sector, file_size);
 
+    vtoydm_vlnk_convert(diskname, sizeof(diskname), &part, &offset);
+    
     switch (cmd)
     {
         case CMD_PRINT_TABLE:
         {
     switch (cmd)
     {
         case CMD_PRINT_TABLE:
         {
-            return vtoydm_print_linear_table(filepath, diskname);
+            return vtoydm_print_linear_table(filepath, diskname, part, offset);
         }
         case CMD_CREATE_DM:
         {
         }
         case CMD_CREATE_DM:
         {
index e58cc868eb27ca9c4d1984ea1b8fd402ce567a7c..c090b7e68f27c267cbbfda26172c1e78a8445234 100644 (file)
 #include <sys/types.h>
 #include <linux/fs.h>
 #include <dirent.h>
 #include <sys/types.h>
 #include <linux/fs.h>
 #include <dirent.h>
-
-#define IS_DIGIT(x) ((x) >= '0' && (x) <= '9')
-
-#ifndef USE_DIET_C
-#ifndef __mips__
-typedef unsigned long long uint64_t;
-#endif
-typedef unsigned int    uint32_t;
-typedef unsigned short  uint16_t;
-typedef unsigned char   uint8_t;
-#endif
-
-#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
-
-typedef enum ventoy_fs_type
-{
-    ventoy_fs_exfat = 0, /* 0: exfat */
-    ventoy_fs_ntfs,      /* 1: NTFS */
-    ventoy_fs_ext,       /* 2: ext2/ext3/ext4 */
-    ventoy_fs_xfs,       /* 3: XFS */
-    ventoy_fs_udf,       /* 4: UDF */
-    ventoy_fs_fat,       /* 5: FAT */
-
-    ventoy_fs_max
-}ventoy_fs_type;
-
-#pragma pack(1)
-
-typedef struct ventoy_guid
-{
-    uint32_t   data1;
-    uint16_t   data2;
-    uint16_t   data3;
-    uint8_t    data4[8];
-}ventoy_guid;
-
-
-typedef struct ventoy_image_disk_region
-{
-    uint32_t   image_sector_count; /* image sectors contained in this region */
-    uint32_t   image_start_sector; /* image sector start */
-    uint64_t   disk_start_sector;  /* disk sector start */
-}ventoy_image_disk_region;
-
-typedef struct ventoy_image_location
-{
-    ventoy_guid  guid;
-    
-    /* image sector size, currently this value is always 2048 */
-    uint32_t   image_sector_size;
-
-    /* disk sector size, normally the value is 512 */
-    uint32_t   disk_sector_size;
-
-    uint32_t   region_count;
-    
-    /*
-     * disk region data
-     * If the image file has more than one fragments in disk, 
-     * there will be more than one region data here.
-     * You can calculate the region count by 
-     */
-    ventoy_image_disk_region regions[1];
-
-    /* ventoy_image_disk_region regions[2~region_count-1] */
-}ventoy_image_location;
-
-typedef struct ventoy_os_param
-{
-    ventoy_guid    guid;             // VENTOY_GUID
-    uint8_t        chksum;           // checksum
-
-    uint8_t   vtoy_disk_guid[16];
-    uint64_t  vtoy_disk_size;       // disk size in bytes
-    uint16_t  vtoy_disk_part_id;    // begin with 1
-    uint16_t  vtoy_disk_part_type;  // 0:exfat   1:ntfs  other: reserved
-    char      vtoy_img_path[384];   // It seems to be enough, utf-8 format
-    uint64_t  vtoy_img_size;        // image file size in bytes
-
-    /* 
-     * Ventoy will write a copy of ventoy_image_location data into runtime memory
-     * this is the physically address and length of that memory.
-     * Address 0 means no such data exist.
-     * Address will be aligned by 4KB.
-     *
-     */
-    uint64_t  vtoy_img_location_addr;
-    uint32_t  vtoy_img_location_len;
-
-    uint64_t  vtoy_reserved[4];     // Internal use by ventoy
-
-    uint8_t   vtoy_disk_signature[4];
-    
-    uint8_t   reserved[27];
-}ventoy_os_param;
-
-#pragma pack()
+#include "vtoytool.h"
 
 #ifndef O_BINARY
 #define O_BINARY 0
 
 #ifndef O_BINARY
 #define O_BINARY 0
@@ -234,8 +138,16 @@ static void vtoy_dump_os_param(ventoy_os_param *param)
     printf("param->vtoy_img_size = <%llu>\n", (unsigned long long)param->vtoy_img_size);
     printf("param->vtoy_img_location_addr = <0x%llx>\n", (unsigned long long)param->vtoy_img_location_addr);
     printf("param->vtoy_img_location_len = <%u>\n", param->vtoy_img_location_len);
     printf("param->vtoy_img_size = <%llu>\n", (unsigned long long)param->vtoy_img_size);
     printf("param->vtoy_img_location_addr = <0x%llx>\n", (unsigned long long)param->vtoy_img_location_addr);
     printf("param->vtoy_img_location_len = <%u>\n", param->vtoy_img_location_len);
-    printf("param->vtoy_reserved[0] = 0x%llx\n", (unsigned long long)param->vtoy_reserved[0]);
-    printf("param->vtoy_reserved[1] = 0x%llx\n", (unsigned long long)param->vtoy_reserved[1]);
+    printf("param->vtoy_reserved = %02x %02x %02x %02x %02x %02x %02x %02x\n", 
+        param->vtoy_reserved[0],
+        param->vtoy_reserved[1],
+        param->vtoy_reserved[2],
+        param->vtoy_reserved[3],
+        param->vtoy_reserved[4],
+        param->vtoy_reserved[5],
+        param->vtoy_reserved[6],
+        param->vtoy_reserved[7]
+        );
     
     printf("\n");
 }
     
     printf("\n");
 }
@@ -392,7 +304,7 @@ static int vtoy_find_disk_by_size(unsigned long long size, char *diskname)
     return rc;    
 }
 
     return rc;    
 }
 
-static int vtoy_find_disk_by_guid(ventoy_os_param *param, char *diskname)
+int vtoy_find_disk_by_guid(ventoy_os_param *param, char *diskname)
 {
     int rc = 0;
     int count = 0;
 {
     int rc = 0;
     int count = 0;
@@ -416,6 +328,7 @@ static int vtoy_find_disk_by_guid(ventoy_os_param *param, char *diskname)
         }
     
         memset(vtguid, 0, sizeof(vtguid));
         }
     
         memset(vtguid, 0, sizeof(vtguid));
+        memset(vtsig, 0, sizeof(vtsig));
         rc = vtoy_get_disk_guid(p->d_name, vtguid, vtsig);
         if (rc == 0 && memcmp(vtguid, param->vtoy_disk_guid, 16) == 0 && 
             memcmp(vtsig, param->vtoy_disk_signature, 4) == 0)
         rc = vtoy_get_disk_guid(p->d_name, vtguid, vtsig);
         if (rc == 0 && memcmp(vtguid, param->vtoy_disk_guid, 16) == 0 && 
             memcmp(vtsig, param->vtoy_disk_signature, 4) == 0)
@@ -429,6 +342,43 @@ static int vtoy_find_disk_by_guid(ventoy_os_param *param, char *diskname)
     return count;    
 }
 
     return count;    
 }
 
+static int vtoy_find_disk_by_sig(uint8_t *sig, char *diskname)
+{
+    int rc = 0;
+    int count = 0;
+    DIR* dir = NULL;
+    struct dirent* p = NULL;
+    uint8_t vtguid[16];
+    uint8_t vtsig[16];
+
+    dir = opendir("/sys/block");
+    if (!dir)
+    {
+        return 0;
+    }
+    
+    while ((p = readdir(dir)) != NULL)
+    {
+        if (!vtoy_is_possible_blkdev(p->d_name))
+        {
+            debug("disk %s is filted by name\n", p->d_name);        
+            continue;
+        }
+
+        memset(vtguid, 0, sizeof(vtguid));
+        memset(vtsig, 0, sizeof(vtsig));
+        rc = vtoy_get_disk_guid(p->d_name, vtguid, vtsig);
+        if (rc == 0 && memcmp(vtsig, sig, 4) == 0)
+        {
+            sprintf(diskname, "%s", p->d_name);
+            count++;
+        }
+    }
+    closedir(dir);
+    
+    return count;    
+}
+
 static int vtoy_printf_iso_path(ventoy_os_param *param)
 {
     printf("%s\n", param->vtoy_img_path);
 static int vtoy_printf_iso_path(ventoy_os_param *param)
 {
     printf("%s\n", param->vtoy_img_path);
@@ -453,6 +403,47 @@ static int vtoy_printf_fs(ventoy_os_param *param)
     return 0;
 }
 
     return 0;
 }
 
+static int vtoy_vlnk_printf(ventoy_os_param *param, char *diskname)
+{
+    int cnt = 0;
+    uint8_t disk_sig[4];
+    uint8_t mbr[512];
+    int fd = -1;
+    char diskpath[128];
+    uint8_t check[8] = { 0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44 };
+    
+    memcpy(disk_sig, param->vtoy_reserved + 7, 4);
+
+    debug("vlnk disk sig: %02x %02x %02x %02x \n", disk_sig[0], disk_sig[1], disk_sig[2], disk_sig[3]);
+
+    cnt = vtoy_find_disk_by_sig(disk_sig, diskname);
+    if (cnt == 1)
+    {
+        snprintf(diskpath, sizeof(diskpath), "/dev/%s", diskname);
+        fd = open(diskpath, O_RDONLY | O_BINARY);
+        if (fd >= 0)
+        {
+            memset(mbr, 0, sizeof(mbr));
+            read(fd, mbr, sizeof(mbr));
+            close(fd);
+
+            if (memcmp(mbr + 0x190, check, 8) == 0)
+            {
+                printf("/dev/%s", diskname);
+                return 0;                
+            }
+            else
+            {
+                debug("check data failed /dev/%s\n", diskname);
+            }
+        }
+    }
+
+    debug("find count=%d\n", cnt);
+    printf("unknown");
+    return 1;
+}
+
 static int vtoy_check_device(ventoy_os_param *param, const char *device)
 {
     unsigned long long size; 
 static int vtoy_check_device(ventoy_os_param *param, const char *device)
 {
     unsigned long long size; 
@@ -524,7 +515,7 @@ static int vtoy_print_os_param(ventoy_os_param *param, char *diskname)
             snprintf(diskpath, sizeof(diskpath) - 1, "/sys/class/block/%s2/size", diskname);
         }
 
             snprintf(diskpath, sizeof(diskpath) - 1, "/sys/class/block/%s2/size", diskname);
         }
 
-        if (access(diskpath, F_OK) >= 0)
+        if (param->vtoy_reserved[6] == 0 && access(diskpath, F_OK) >= 0)
         {
             debug("get part size from sysfs for %s\n", diskpath);
 
         {
             debug("get part size from sysfs for %s\n", diskpath);
 
@@ -570,12 +561,13 @@ int vtoydump_main(int argc, char **argv)
     int ch;
     int print_path = 0;
     int print_fs = 0;
     int ch;
     int print_path = 0;
     int print_fs = 0;
+    int vlnk_print = 0;
     char filename[256] = {0};
     char diskname[256] = {0};
     char device[64] = {0};
     ventoy_os_param *param = NULL;
 
     char filename[256] = {0};
     char diskname[256] = {0};
     char device[64] = {0};
     ventoy_os_param *param = NULL;
 
-    while ((ch = getopt(argc, argv, "c:f:p:s:v::")) != -1)
+    while ((ch = getopt(argc, argv, "c:f:p:t:s:v::")) != -1)
     {
         if (ch == 'f')
         {
     {
         if (ch == 'f')
         {
@@ -594,6 +586,11 @@ int vtoydump_main(int argc, char **argv)
             print_path = 1;
             strncpy(filename, optarg, sizeof(filename) - 1);
         }
             print_path = 1;
             strncpy(filename, optarg, sizeof(filename) - 1);
         }
+        else if (ch == 't')
+        {
+            vlnk_print = 1;
+            strncpy(filename, optarg, sizeof(filename) - 1);
+        }
         else if (ch == 's')
         {
             print_fs = 1;
         else if (ch == 's')
         {
             print_fs = 1;
@@ -655,6 +652,10 @@ int vtoydump_main(int argc, char **argv)
     {
         rc = vtoy_printf_fs(param);
     }
     {
         rc = vtoy_printf_fs(param);
     }
+    else if (vlnk_print)
+    {
+        rc = vtoy_vlnk_printf(param, diskname);
+    }
     else if (device[0])
     {
         rc = vtoy_check_device(param, device);
     else if (device[0])
     {
         rc = vtoy_check_device(param, device);
diff --git a/VtoyTool/vtoytool.h b/VtoyTool/vtoytool.h
new file mode 100644 (file)
index 0000000..e2ddce3
--- /dev/null
@@ -0,0 +1,123 @@
+/******************************************************************************
+ * vtoytool.h
+ *
+ * Copyright (c) 2022, longpanda <admin@ventoy.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef __VTOYTOOL_H__
+#define __VTOYTOOL_H__
+
+#define IS_DIGIT(x) ((x) >= '0' && (x) <= '9')
+
+#ifndef USE_DIET_C
+#ifndef __mips__
+typedef unsigned long long uint64_t;
+#endif
+typedef unsigned int    uint32_t;
+typedef unsigned short  uint16_t;
+typedef unsigned char   uint8_t;
+#endif
+
+#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
+
+typedef enum ventoy_fs_type
+{
+    ventoy_fs_exfat = 0, /* 0: exfat */
+    ventoy_fs_ntfs,      /* 1: NTFS */
+    ventoy_fs_ext,       /* 2: ext2/ext3/ext4 */
+    ventoy_fs_xfs,       /* 3: XFS */
+    ventoy_fs_udf,       /* 4: UDF */
+    ventoy_fs_fat,       /* 5: FAT */
+
+    ventoy_fs_max
+}ventoy_fs_type;
+
+#pragma pack(1)
+
+typedef struct ventoy_guid
+{
+    uint32_t   data1;
+    uint16_t   data2;
+    uint16_t   data3;
+    uint8_t    data4[8];
+}ventoy_guid;
+
+
+typedef struct ventoy_image_disk_region
+{
+    uint32_t   image_sector_count; /* image sectors contained in this region */
+    uint32_t   image_start_sector; /* image sector start */
+    uint64_t   disk_start_sector;  /* disk sector start */
+}ventoy_image_disk_region;
+
+typedef struct ventoy_image_location
+{
+    ventoy_guid  guid;
+    
+    /* image sector size, currently this value is always 2048 */
+    uint32_t   image_sector_size;
+
+    /* disk sector size, normally the value is 512 */
+    uint32_t   disk_sector_size;
+
+    uint32_t   region_count;
+    
+    /*
+     * disk region data
+     * If the image file has more than one fragments in disk, 
+     * there will be more than one region data here.
+     * You can calculate the region count by 
+     */
+    ventoy_image_disk_region regions[1];
+
+    /* ventoy_image_disk_region regions[2~region_count-1] */
+}ventoy_image_location;
+
+typedef struct ventoy_os_param
+{
+    ventoy_guid    guid;             // VENTOY_GUID
+    uint8_t        chksum;           // checksum
+
+    uint8_t   vtoy_disk_guid[16];
+    uint64_t  vtoy_disk_size;       // disk size in bytes
+    uint16_t  vtoy_disk_part_id;    // begin with 1
+    uint16_t  vtoy_disk_part_type;  // 0:exfat   1:ntfs  other: reserved
+    char      vtoy_img_path[384];   // It seems to be enough, utf-8 format
+    uint64_t  vtoy_img_size;        // image file size in bytes
+
+    /* 
+     * Ventoy will write a copy of ventoy_image_location data into runtime memory
+     * this is the physically address and length of that memory.
+     * Address 0 means no such data exist.
+     * Address will be aligned by 4KB.
+     *
+     */
+    uint64_t  vtoy_img_location_addr;
+    uint32_t  vtoy_img_location_len;
+
+    uint8_t  vtoy_reserved[32];     // Internal use by ventoy
+
+    uint8_t   vtoy_disk_signature[4];
+    
+    uint8_t   reserved[27];
+}ventoy_os_param;
+
+#pragma pack()
+
+int vtoy_find_disk_by_guid(ventoy_os_param *param, char *diskname);
+#endif
+
index 0b430bd97527792550ae913fbe85ae4d10b5f98b..aeddab281a2c4666b1137e41bcbcd3128df84986 100644 (file)
Binary files a/VtoyTool/vtoytool/00/vtoytool_32 and b/VtoyTool/vtoytool/00/vtoytool_32 differ
index 7680fe37dd35363faec0fc86bbd18b4d069008e3..dab47d6af4c98b90ded942389462a5152fba9867 100644 (file)
Binary files a/VtoyTool/vtoytool/00/vtoytool_64 and b/VtoyTool/vtoytool/00/vtoytool_64 differ
index c3ce4004e7fda51f7f95bfd2a0ae146d9eb0031c..2debdf7f8fb5613a324c05483b414d90af21731d 100644 (file)
Binary files a/VtoyTool/vtoytool/00/vtoytool_aa64 and b/VtoyTool/vtoytool/00/vtoytool_aa64 differ
index d4d03d52b278952f704a9854f9eff472bfef9fe2..a410f17f56c3fc102b2f05531cb788c9d50e724f 100644 (file)
Binary files a/VtoyTool/vtoytool/00/vtoytool_m64e and b/VtoyTool/vtoytool/00/vtoytool_m64e differ
index b9d82cb0a6f132b4f1a491c50ff3ddb416531099..c2ab0a120e7856c0c402d4b1a83fc5b048f05b53 100644 (file)
@@ -40,6 +40,10 @@ static CHAR g_prog_full_path[MAX_PATH];
 static CHAR g_prog_dir[MAX_PATH];\r
 static CHAR g_prog_name[MAX_PATH];\r
 \r
 static CHAR g_prog_dir[MAX_PATH];\r
 static CHAR g_prog_name[MAX_PATH];\r
 \r
+#define VTOY_PECMD_PATH      "X:\\Windows\\system32\\ventoy\\PECMD.EXE"\r
+#define ORG_PECMD_PATH       "X:\\Windows\\system32\\PECMD.EXE"\r
+#define ORG_PECMD_BK_PATH    "X:\\Windows\\system32\\PECMD.EXE_BACK.EXE"\r
+\r
 #define AUTO_RUN_BAT    "X:\\VentoyAutoRun.bat"\r
 #define AUTO_RUN_LOG    "X:\\VentoyAutoRun.log"\r
 \r
 #define AUTO_RUN_BAT    "X:\\VentoyAutoRun.bat"\r
 #define AUTO_RUN_LOG    "X:\\VentoyAutoRun.log"\r
 \r
@@ -431,7 +435,7 @@ out:
     return bRet;\r
 }\r
 \r
     return bRet;\r
 }\r
 \r
-static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent)\r
+static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, UINT32 *DiskSig, DISK_EXTENT *DiskExtent)\r
 {\r
        BOOL Ret;\r
        DWORD dwSize;\r
 {\r
        BOOL Ret;\r
        DWORD dwSize;\r
@@ -466,8 +470,9 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *Dis
        }\r
        CloseHandle(Handle);\r
 \r
        }\r
        CloseHandle(Handle);\r
 \r
-       memcpy(DiskExtent, DiskExtents.Extents, sizeof(DiskExtent));\r
-       Log("%C: is in PhysicalDrive%d ", LogicalDrive, DiskExtents.Extents[0].DiskNumber);\r
+    memcpy(DiskExtent, DiskExtents.Extents, sizeof(DISK_EXTENT));\r
+    Log("%C: is in PhysicalDrive%d Offset:%llu", LogicalDrive, DiskExtents.Extents[0].DiskNumber, \r
+        (ULONGLONG)(DiskExtents.Extents[0].StartingOffset.QuadPart));\r
 \r
        sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskExtents.Extents[0].DiskNumber);\r
        Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
 \r
        sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskExtents.Extents[0].DiskNumber);\r
        Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
@@ -485,6 +490,11 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *Dis
        }\r
        \r
        memcpy(UUID, SectorBuf + 0x180, 16);\r
        }\r
        \r
        memcpy(UUID, SectorBuf + 0x180, 16);\r
+    if (DiskSig)\r
+    {\r
+        memcpy(DiskSig, SectorBuf + 0x1B8, 4);\r
+    }\r
+\r
        CloseHandle(Handle);\r
        return 0;\r
 }\r
        CloseHandle(Handle);\r
        return 0;\r
 }\r
@@ -1413,11 +1423,16 @@ static int VentoyHook(ventoy_os_param *param)
     int i;\r
     int rc;\r
     BOOL find = FALSE;\r
     int i;\r
     int rc;\r
     BOOL find = FALSE;\r
+    BOOL vtoyfind = FALSE;\r
     CHAR Letter;\r
     CHAR MntLetter;\r
     CHAR Letter;\r
     CHAR MntLetter;\r
+    CHAR VtoyLetter;\r
     DWORD Drives;\r
     DWORD NewDrives;\r
     DWORD Drives;\r
     DWORD NewDrives;\r
+    UINT32 DiskSig;\r
+    UINT32 VtoySig;\r
        DISK_EXTENT DiskExtent;\r
        DISK_EXTENT DiskExtent;\r
+    DISK_EXTENT VtoyDiskExtent;\r
        UINT8 UUID[16];\r
        CHAR IsoPath[MAX_PATH];\r
 \r
        UINT8 UUID[16];\r
        CHAR IsoPath[MAX_PATH];\r
 \r
@@ -1442,7 +1457,7 @@ static int VentoyHook(ventoy_os_param *param)
                 if (IsFileExist("%s", IsoPath))\r
                 {\r
                     Log("File exist under %C:", Letter);\r
                 if (IsFileExist("%s", IsoPath))\r
                 {\r
                     Log("File exist under %C:", Letter);\r
-                    if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0)\r
+                    if (GetPhyDiskUUID(Letter, UUID, NULL, &DiskExtent) == 0)\r
                     {\r
                         if (memcmp(UUID, param->vtoy_disk_guid, 16) == 0)\r
                         {\r
                     {\r
                         if (memcmp(UUID, param->vtoy_disk_guid, 16) == 0)\r
                         {\r
@@ -1481,6 +1496,60 @@ static int VentoyHook(ventoy_os_param *param)
 \r
        Log("Find ISO file <%s>", IsoPath);\r
     \r
 \r
        Log("Find ISO file <%s>", IsoPath);\r
     \r
+    //Find VtoyLetter in Vlnk Mode\r
+    if (g_os_param_reserved[6] == 1)\r
+    {\r
+        memcpy(&VtoySig, g_os_param_reserved + 7, 4);\r
+        for (i = 0; i < 5; i++)\r
+        {\r
+            VtoyLetter = 'A';\r
+            Drives = GetLogicalDrives();\r
+            Log("Logic Drives: 0x%x  VentoySig:%08X", Drives, VtoySig);\r
+\r
+            while (Drives)\r
+            {\r
+                if (Drives & 0x01)\r
+                {\r
+                    if (GetPhyDiskUUID(VtoyLetter, UUID, &DiskSig, &VtoyDiskExtent) == 0)\r
+                    {\r
+                        Log("DiskSig=%08X PartStart=%lld", DiskSig, VtoyDiskExtent.StartingOffset.QuadPart);\r
+                        if (DiskSig == VtoySig && VtoyDiskExtent.StartingOffset.QuadPart == SIZE_1MB)\r
+                        {\r
+                            Log("Ventoy Disk Sig match");\r
+                            vtoyfind = TRUE;\r
+                            break;\r
+                        }\r
+                    }\r
+                }\r
+\r
+                Drives >>= 1;\r
+                VtoyLetter++;\r
+            }\r
+\r
+            if (vtoyfind)\r
+            {\r
+                Log("Find Ventoy Letter: %C", VtoyLetter);\r
+                break;\r
+            }\r
+            else\r
+            {\r
+                Log("Now wait and retry ...");\r
+                Sleep(1000);\r
+            }\r
+        }\r
+\r
+        if (vtoyfind == FALSE)\r
+        {\r
+            Log("Failed to find ventoy disk");\r
+            return 1;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        VtoyLetter = Letter;\r
+        Log("No vlnk mode %C", Letter);\r
+    }\r
+\r
     Drives = GetLogicalDrives();\r
     Log("Drives before mount: 0x%x", Drives);\r
 \r
     Drives = GetLogicalDrives();\r
     Log("Drives before mount: 0x%x", Drives);\r
 \r
@@ -1519,12 +1588,12 @@ static int VentoyHook(ventoy_os_param *param)
     }\r
 \r
     // for protect\r
     }\r
 \r
     // for protect\r
-    rc = DeleteVentoyPart2MountPoint(DiskExtent.DiskNumber);\r
+    rc = DeleteVentoyPart2MountPoint(VtoyDiskExtent.DiskNumber);\r
     Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED");\r
     \r
     if (g_windows_data.auto_install_script[0])\r
     {\r
     Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED");\r
     \r
     if (g_windows_data.auto_install_script[0])\r
     {\r
-        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.auto_install_script);\r
+        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.auto_install_script);\r
         if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("use auto install script %s...", IsoPath);\r
         if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("use auto install script %s...", IsoPath);\r
@@ -1542,11 +1611,11 @@ static int VentoyHook(ventoy_os_param *param)
 \r
     if (g_windows_data.injection_archive[0])\r
     {\r
 \r
     if (g_windows_data.injection_archive[0])\r
     {\r
-        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);\r
+        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.injection_archive);\r
         if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("decompress injection archive %s...", IsoPath);\r
         if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("decompress injection archive %s...", IsoPath);\r
-            DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
+            DecompressInjectionArchive(IsoPath, VtoyDiskExtent.DiskNumber);\r
 \r
             if (IsFileExist("%s", AUTO_RUN_BAT))\r
             {\r
 \r
             if (IsFileExist("%s", AUTO_RUN_BAT))\r
             {\r
@@ -1886,6 +1955,14 @@ int real_main(int argc, char **argv)
        return 0;\r
 }\r
 \r
        return 0;\r
 }\r
 \r
+static void VentoyToUpper(CHAR *str)\r
+{\r
+    int i;\r
+    for (i = 0; str[i]; i++)\r
+    {\r
+        str[i] = (CHAR)toupper(str[i]);\r
+    }\r
+}\r
 \r
 int main(int argc, char **argv)\r
 {\r
 \r
 int main(int argc, char **argv)\r
 {\r
@@ -1920,12 +1997,24 @@ int main(int argc, char **argv)
        }\r
        else if (_stricmp(g_prog_name, "PECMD.exe") == 0)\r
        {\r
        }\r
        else if (_stricmp(g_prog_name, "PECMD.exe") == 0)\r
        {\r
-               Log("We need to rejump for pecmd ...");\r
+        strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_dir);\r
+        VentoyToUpper(NewArgv0);\r
+        \r
+        if (NULL == strstr(NewArgv0, "SYSTEM32") && IsFileExist(ORG_PECMD_BK_PATH))\r
+        {\r
+            Log("Just call original pecmd.exe");\r
+            strcpy_s(CallParam, sizeof(CallParam), ORG_PECMD_PATH);\r
+        }\r
+        else\r
+        {\r
+            Log("We need to rejump for pecmd ...");\r
 \r
 \r
-               ventoy_check_create_directory();\r
-               CopyFileA(g_prog_full_path, "ventoy\\WinLogon.exe", TRUE);\r
+            ventoy_check_create_directory();\r
+            CopyFileA(g_prog_full_path, "ventoy\\WinLogon.exe", TRUE);\r
 \r
 \r
-               sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe %s", g_prog_full_path);\r
+            sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe %s", g_prog_full_path);\r
+        }\r
+               \r
                for (i = 1; i < argc; i++)\r
                {\r
                        strcat_s(CallParam, sizeof(CallParam), " ");\r
                for (i = 1; i < argc; i++)\r
                {\r
                        strcat_s(CallParam, sizeof(CallParam), " ");\r