]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
1.0.27 release v1.0.27
authorlongpanda <admin@ventoy.net>
Sat, 31 Oct 2020 11:06:30 +0000 (19:06 +0800)
committerlongpanda <admin@ventoy.net>
Sat, 31 Oct 2020 11:06:30 +0000 (19:06 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
INSTALL/EFI/BOOT/grubx64_real.efi
INSTALL/grub/debug.cfg
INSTALL/grub/grub.cfg
INSTALL/grub/i386-pc/core.img
INSTALL/grub/localboot.cfg
INSTALL/ventoy/ventoy.cpio
INSTALL/ventoy/vtloopex.cpio

index 6e8c28e6b86abdd125104a4c86a152c5aedcf48a..7c47357da77c84d3284918119eb02de30ab54bcc 100644 (file)
@@ -96,6 +96,12 @@ char *g_wimiso_path = NULL;
 
 int g_vhdboot_enable = 0;
 
+grub_uint64_t g_conf_replace_offset = 0;
+conf_replace *g_conf_replace_node = NULL;
+grub_uint8_t *g_conf_replace_new_buf = NULL;
+int g_conf_replace_new_len = 0;
+int g_conf_replace_new_len_align = 0;
+
 ventoy_gpt_info *g_ventoy_part_info = NULL;
 
 static char *g_tree_script_buf = NULL;
@@ -2362,6 +2368,9 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
         return grub_error(GRUB_ERR_BAD_ARGUMENT, "Can't open file %s\n", args[0]); 
     }
 
+    g_conf_replace_node = NULL;
+    g_conf_replace_offset = 0;
+    
     if (g_img_chunk_list.chunk)
     {
         grub_free(g_img_chunk_list.chunk);
@@ -2400,6 +2409,75 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
+static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    grub_uint64_t offset = 0;
+    grub_uint32_t align = 0;
+    grub_file_t file = NULL;
+    conf_replace *node = NULL;
+        
+    (void)ctxt;
+    (void)argc;
+    (void)args;
+
+    debug("select conf replace argc:%d\n", argc);
+
+    if (argc < 2)
+    {
+        return 0;
+    }
+
+    node = ventoy_plugin_find_conf_replace(args[1]);
+    if (!node)
+    {
+        debug("Conf replace not found for %s\n", args[1]);
+        goto end;
+    }
+
+    debug("Find conf replace for %s\n", args[1]);
+
+    file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", node->orgconf);
+    if (!file)
+    {
+        debug("<(loop)%s> NOT exist\n", node->orgconf);
+        goto end;
+    }
+
+    offset = grub_iso9660_get_last_file_dirent_pos(file);
+    grub_file_close(file);    
+
+    file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[0], node->newconf);
+    if (!file)
+    {
+        debug("New config file <%s%s> NOT exist\n", args[0], node->newconf);
+        goto end;
+    }
+
+    align = ((int)file->size + 2047) / 2048 * 2048;
+
+    if (align > vtoy_max_replace_file_size)
+    {
+        debug("New config file <%s%s> too big\n", args[0], node->newconf);
+        goto end;
+    }
+
+    grub_file_read(file, g_conf_replace_new_buf, file->size);
+    g_conf_replace_new_len = (int)file->size;
+    g_conf_replace_new_len_align = align;
+
+    g_conf_replace_node = node;
+    g_conf_replace_offset = offset + 2;
+
+    debug("conf_replace OK: newlen: %d\n", g_conf_replace_new_len);
+
+end:
+    if (file)
+    {
+        grub_file_close(file);        
+    }
+    VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+
 static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     int i = 0;
@@ -3829,6 +3907,7 @@ static int ventoy_env_init(void)
     g_part_list_buf = grub_malloc(VTOY_PART_BUF_LEN);
     g_tree_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
     g_list_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
+    g_conf_replace_new_buf = grub_malloc(vtoy_max_replace_file_size); 
 
     ventoy_filt_register(0, ventoy_wrapper_open);
 
@@ -3897,6 +3976,7 @@ static cmd_para ventoy_cmds[] =
     { "vt_dump_persistence", ventoy_cmd_dump_persistence, 0, NULL, "", "", NULL },
     { "vt_select_auto_install", ventoy_cmd_sel_auto_install, 0, NULL, "", "", NULL },
     { "vt_select_persistence", ventoy_cmd_sel_persistence, 0, NULL, "", "", NULL },
+    { "vt_select_conf_replace", ventoy_select_conf_replace, 0, NULL, "", "", NULL },
 
     { "vt_iso9660_nojoliet", ventoy_cmd_iso9660_nojoliet, 0, NULL, "", "", NULL },
     { "vt_is_udf", ventoy_cmd_is_udf, 0, NULL, "", "", NULL },
@@ -3961,7 +4041,7 @@ GRUB_MOD_INIT(ventoy)
     cmd_para *cur = NULL;
 
     ventoy_env_init();
-    
+
     for (i = 0; i < ARRAY_SIZE(ventoy_cmds); i++)
     {
         cur = ventoy_cmds + i;
index b3512843d496fefb6d9dd12c3a3e4c2583a218eb..207aee965285057a81a0ba3fd24c23eb7d9752f8 100644 (file)
@@ -770,6 +770,17 @@ typedef struct menu_class
     struct menu_class *next;
 }menu_class;
 
+#define vtoy_max_replace_file_size  (2 * 1024 * 1024)
+typedef struct conf_replace
+{
+    int pathlen;
+    char isopath[256];
+    char orgconf[256];
+    char newconf[256];
+
+    struct conf_replace *next;
+}conf_replace;
+
 typedef struct injection_config
 {
     int pathlen;
@@ -806,6 +817,11 @@ extern grub_uint8_t g_ventoy_chain_type;
 extern int g_vhdboot_enable;
 extern int g_plugin_image_list;
 extern ventoy_gpt_info *g_ventoy_part_info;
+extern grub_uint64_t g_conf_replace_offset;
+extern conf_replace *g_conf_replace_node;
+extern grub_uint8_t *g_conf_replace_new_buf;
+extern int g_conf_replace_new_len;
+extern int g_conf_replace_new_len_align;
 
 #define ventoy_unix_fill_virt(new_data, new_len) \
 { \
@@ -838,6 +854,7 @@ const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
 const char * ventoy_plugin_get_menu_class(int type, const char *name);
 int ventoy_plugin_check_memdisk(const char *isopath);
 int ventoy_plugin_get_image_list_index(int type, const char *name);
+conf_replace * ventoy_plugin_find_conf_replace(const char *iso);
 int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
 int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
 void ventoy_plugin_dump_persistence(void);
index 29c368bb10aef07eb9ade53687944fb203e13106..1718e19dea0a23f3f7136e6b87190473b7a4a498 100644 (file)
@@ -333,6 +333,7 @@ end:
 static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
 {
     int i = 0;
+    int dollar = 0;
     grub_file_t file = NULL;
     char *buf = NULL;
     char *start = NULL;
@@ -388,13 +389,18 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
             {
                 break;
             }
-            
+
+            dollar = 0;
             for (i = 0; i < 255 && (0 == ventoy_is_word_end(*start)); i++)
             {
                 img->name[i] = *start++;
+                if (img->name[i] == '$')
+                {
+                    dollar = 1;
+                }
             }
 
-            if (ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
+            if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
             {
                 grub_free(img);
             }
@@ -625,9 +631,30 @@ int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, co
     return headlen;
 }
 
+static grub_uint32_t ventoy_linux_get_virt_chunk_count(void)
+{
+    grub_uint32_t count = g_valid_initrd_count;
+    
+    if (g_conf_replace_offset > 0)
+    {
+        count++;
+    }
+    
+    return count;
+}
+
 static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
 {
-    return (sizeof(ventoy_virt_chunk) + g_ventoy_cpio_size) * g_valid_initrd_count;
+    grub_uint32_t size;
+    
+    size = (sizeof(ventoy_virt_chunk) + g_ventoy_cpio_size) * g_valid_initrd_count;
+    
+    if (g_conf_replace_offset > 0)
+    {
+        size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align;
+    }
+
+    return size;
 }
 
 static void ventoy_linux_fill_virt_data(    grub_uint64_t isosize, ventoy_chain_head *chain)
@@ -646,7 +673,7 @@ static void ventoy_linux_fill_virt_data(    grub_uint64_t isosize, ventoy_chain_
     sector = (isosize + 2047) / 2048;
     cpio_secs = g_ventoy_cpio_size / 2048;
 
-    offset = g_valid_initrd_count * sizeof(ventoy_virt_chunk);
+    offset = ventoy_linux_get_virt_chunk_count() * sizeof(ventoy_virt_chunk);
     cur = (ventoy_virt_chunk *)override;
 
     for (node = g_initrd_img_list; node; node = node->next)
@@ -682,12 +709,51 @@ static void ventoy_linux_fill_virt_data(    grub_uint64_t isosize, ventoy_chain_
         cur++;
     }
 
+    if (g_conf_replace_offset > 0)
+    {
+        cpio_secs = g_conf_replace_new_len_align / 2048;
+    
+        cur->mem_sector_start   = sector;
+        cur->mem_sector_end     = cur->mem_sector_start + cpio_secs;
+        cur->mem_sector_offset  = offset;
+        cur->remap_sector_start = 0;
+        cur->remap_sector_end   = 0;
+        cur->org_sector_start   = 0;
+
+        grub_memcpy(override + offset, g_conf_replace_new_buf, g_conf_replace_new_len);
+
+        chain->virt_img_size_in_bytes += g_conf_replace_new_len_align;
+
+        offset += g_conf_replace_new_len_align;
+        sector += cpio_secs;
+        cur++;
+    }
+
     return;
 }
 
+static grub_uint32_t ventoy_linux_get_override_chunk_count(void)
+{
+    grub_uint32_t count = g_valid_initrd_count;
+    
+    if (g_conf_replace_offset > 0)
+    {
+        count++;
+    }
+    
+    return count;
+}
+
 static grub_uint32_t ventoy_linux_get_override_chunk_size(void)
 {
-    return sizeof(ventoy_override_chunk) * g_valid_initrd_count;
+    int count = g_valid_initrd_count;
+    
+    if (g_conf_replace_offset > 0)
+    {
+        count++;
+    }
+
+    return sizeof(ventoy_override_chunk) * count;
 }
 
 static void ventoy_linux_fill_override_data(    grub_uint64_t isosize, void *override)
@@ -697,6 +763,8 @@ static void ventoy_linux_fill_override_data(    grub_uint64_t isosize, void *ove
     grub_uint32_t newlen;
     grub_uint64_t sector;
     ventoy_override_chunk *cur;
+    ventoy_iso9660_override *dirent;
+    ventoy_udf_override *udf;
 
     sector = (isosize + 2047) / 2048;
 
@@ -712,12 +780,12 @@ static void ventoy_linux_fill_override_data(    grub_uint64_t isosize, void *ove
         mod = newlen % 4; 
         if (mod > 0)
         {
-            newlen += 4 - mod;
+            newlen += 4 - mod; /* cpio must align with 4 */
         }
 
         if (node->iso_type == 0)
         {
-            ventoy_iso9660_override *dirent = (ventoy_iso9660_override *)node->override_data;
+            dirent = (ventoy_iso9660_override *)node->override_data;
 
             node->override_length   = sizeof(ventoy_iso9660_override);
             dirent->first_sector    = (grub_uint32_t)sector;
@@ -729,7 +797,7 @@ static void ventoy_linux_fill_override_data(    grub_uint64_t isosize, void *ove
         }
         else
         {
-            ventoy_udf_override *udf = (ventoy_udf_override *)node->override_data;
+            udf = (ventoy_udf_override *)node->override_data;
             
             node->override_length = sizeof(ventoy_udf_override);
             udf->length   = newlen;
@@ -744,6 +812,23 @@ static void ventoy_linux_fill_override_data(    grub_uint64_t isosize, void *ove
         cur++;
     }
 
+    if (g_conf_replace_offset > 0)
+    {        
+        cur->img_offset = g_conf_replace_offset;
+        cur->override_size = sizeof(ventoy_iso9660_override);
+
+        newlen = (grub_uint32_t)(g_conf_replace_new_len);
+
+        dirent = (ventoy_iso9660_override *)cur->override_data;
+        dirent->first_sector    = (grub_uint32_t)sector;
+        dirent->size            = newlen;
+        dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector);
+        dirent->size_be         = grub_swap_bytes32(dirent->size);
+
+        sector += (dirent->size + 2047) / 2048;
+        cur++;
+    }
+    
     return;
 }
 
@@ -1241,7 +1326,9 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
     grub_uint64_t isosize = 0;
     grub_uint32_t boot_catlog = 0;
     grub_uint32_t img_chunk_size = 0;
+    grub_uint32_t override_count = 0;
     grub_uint32_t override_size = 0;
+    grub_uint32_t virt_chunk_count = 0;
     grub_uint32_t virt_chunk_size = 0;
     grub_file_t file;
     grub_disk_t disk;
@@ -1294,6 +1381,9 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
     }
     
     img_chunk_size = g_img_chunk_list.cur_chunk * sizeof(ventoy_img_chunk);
+
+    override_count = ventoy_linux_get_override_chunk_count();
+    virt_chunk_count = ventoy_linux_get_virt_chunk_count();
     
     if (ventoy_compatible)
     {
@@ -1360,20 +1450,21 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
         return 0;
     }
 
-    if (g_valid_initrd_count == 0)
+    /* part 4: override chunk */
+    if (override_count > 0)
     {
-        return 0;
+        chain->override_chunk_offset = chain->img_chunk_offset + img_chunk_size;
+        chain->override_chunk_num = override_count;
+        ventoy_linux_fill_override_data(isosize, (char *)chain + chain->override_chunk_offset);        
     }
 
-    /* part 4: override chunk */
-    chain->override_chunk_offset = chain->img_chunk_offset + img_chunk_size;
-    chain->override_chunk_num = g_valid_initrd_count;
-    ventoy_linux_fill_override_data(isosize, (char *)chain + chain->override_chunk_offset);
-
     /* part 5: virt chunk */
-    chain->virt_chunk_offset = chain->override_chunk_offset + override_size;
-    chain->virt_chunk_num = g_valid_initrd_count;
-    ventoy_linux_fill_virt_data(isosize, chain);
+    if (virt_chunk_count > 0)
+    {        
+        chain->virt_chunk_offset = chain->override_chunk_offset + override_size;
+        chain->virt_chunk_num = virt_chunk_count;
+        ventoy_linux_fill_virt_data(isosize, chain);
+    }
 
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
index bf9f75c8904aa74ae43357d2debb17e799579c60..a5c2c030dc42cb4323270764e0f3dfd14114dcac 100644 (file)
@@ -47,6 +47,7 @@ static menu_class *g_menu_class_head = NULL;
 static injection_config *g_injection_head = NULL;
 static auto_memdisk *g_auto_memdisk_head = NULL;
 static image_list *g_image_list_head = NULL;
+static conf_replace *g_conf_replace_head = NULL;
 
 static int ventoy_plugin_control_check(VTOY_JSON *json, const char *isodisk)
 {
@@ -1020,6 +1021,146 @@ static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk)
     return 0;
 }
 
+static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk)
+{
+    const char *isof = NULL;
+    const char *orgf = NULL;
+    const char *newf = NULL;
+    VTOY_JSON *pNode = NULL;
+    conf_replace *tail = NULL;
+    conf_replace *node = NULL;
+    conf_replace *next = NULL;
+
+    (void)isodisk;
+
+    if (json->enDataType != JSON_TYPE_ARRAY)
+    {
+        debug("Not array %d\n", json->enDataType);
+        return 0;
+    }
+
+    if (g_conf_replace_head)
+    {
+        for (node = g_conf_replace_head; node; node = next)
+        {
+            next = node->next;
+            grub_free(node);
+        }
+
+        g_conf_replace_head = NULL;
+    }
+
+    for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
+    {
+        isof = vtoy_json_get_string_ex(pNode->pstChild, "iso");
+        orgf = vtoy_json_get_string_ex(pNode->pstChild, "org");
+        newf = vtoy_json_get_string_ex(pNode->pstChild, "new");
+        if (isof && orgf && newf && isof[0] == '/' && orgf[0] == '/' && newf[0] == '/')
+        {
+            node = grub_zalloc(sizeof(conf_replace));
+            if (node)
+            {
+                node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", isof);
+                grub_snprintf(node->orgconf, sizeof(node->orgconf), "%s", orgf);
+                grub_snprintf(node->newconf, sizeof(node->newconf), "%s", newf);
+
+                if (g_conf_replace_head)
+                {
+                    tail->next = node;
+                }
+                else
+                {
+                    g_conf_replace_head = node;
+                }
+                tail = node;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk)
+{
+    const char *isof = NULL;
+    const char *orgf = NULL;
+    const char *newf = NULL;
+    VTOY_JSON *pNode = NULL;
+    grub_file_t file = NULL;
+    char cmd[256];
+
+    (void)isodisk;
+
+    if (json->enDataType != JSON_TYPE_ARRAY)
+    {
+        grub_printf("Not array %d\n", json->enDataType);
+        return 1;
+    }
+
+    for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
+    {
+        isof = vtoy_json_get_string_ex(pNode->pstChild, "iso");
+        orgf = vtoy_json_get_string_ex(pNode->pstChild, "org");
+        newf = vtoy_json_get_string_ex(pNode->pstChild, "new");
+        if (isof && orgf && newf && isof[0] == '/' && orgf[0] == '/' && newf[0] == '/')
+        {
+            if (ventoy_check_file_exist("%s%s", isodisk, isof))
+            {
+                grub_printf("iso:<%s> [OK]\n", isof);
+                
+                grub_snprintf(cmd, sizeof(cmd), "loopback vtisocheck %s%s", isodisk, isof);
+                grub_script_execute_sourcecode(cmd);
+
+                file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(vtisocheck)/%s", orgf);
+                if (file)
+                {
+                    if (grub_strcmp(file->fs->name, "iso9660") == 0)
+                    {
+                        grub_printf("org:<%s> [OK]\n", orgf);
+                    }
+                    else
+                    {
+                        grub_printf("org:<%s> [Exist But NOT ISO9660]\n", orgf);
+                    }
+                    grub_file_close(file);
+                }
+                else
+                {
+                    grub_printf("org:<%s> [NOT Exist]\n", orgf);
+                }
+                
+                grub_script_execute_sourcecode("loopback -d vtisocheck");
+            }
+            else
+            {
+                grub_printf("iso:<%s> [NOT Exist]\n", isof);
+                grub_printf("org:<%s>\n", orgf);
+            }
+
+            file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", isodisk, newf);
+            if (file)
+            {
+                if (file->size > vtoy_max_replace_file_size)
+                {
+                    grub_printf("new:<%s> [Too Big %lu] \n", newf, (ulong)file->size);
+                }
+                else
+                {
+                    grub_printf("new:<%s> [OK]\n", newf);                    
+                }
+                grub_file_close(file);
+            }
+            else
+            {
+                grub_printf("new:<%s> [NOT Exist]\n", newf);   
+            }
+            grub_printf("\n");
+        }
+    }
+
+    return 0;
+}
+
 static int ventoy_plugin_auto_memdisk_entry(VTOY_JSON *json, const char *isodisk)
 {
     VTOY_JSON *pNode = NULL;
@@ -1191,6 +1332,7 @@ static plugin_entry g_plugin_entries[] =
     { "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check },
     { "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check },
     { "image_list", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check },
+    { "conf_replace", ventoy_plugin_conf_replace_entry, ventoy_plugin_conf_replace_check },
 };
 
 static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
@@ -1596,6 +1738,29 @@ int ventoy_plugin_get_image_list_index(int type, const char *name)
     return 0;
 }
 
+conf_replace * ventoy_plugin_find_conf_replace(const char *iso)
+{
+    int len;
+    conf_replace *node;
+
+    if (!g_conf_replace_head)
+    {
+        return NULL;
+    }
+
+    len = (int)grub_strlen(iso);
+    
+    for (node = g_conf_replace_head; node; node = node->next)
+    {
+        if (node->pathlen == len && grub_strncmp(iso, node->isopath, len) == 0)
+        {
+            return node;
+        }
+    }
+    
+    return NULL;
+}
+
 grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     int i = 0;
index 75bd8999cad9882185efe2ffb014d4ae895441bb..5ed0b688d875848483421130d5729987efe73f13 100644 (file)
Binary files a/INSTALL/EFI/BOOT/grubx64_real.efi and b/INSTALL/EFI/BOOT/grubx64_real.efi differ
index 46ee3956d4598c91484f20123a5cff3fde6a851b..d62d26becd7746b726fd3d7c116b361a67f2dfb9 100644 (file)
@@ -85,6 +85,15 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
         unset pager
     }
     
+    menuentry 'Check boot conf replace plugin configuration' --class=debug_bootconf_replace {
+        set pager=1
+        vt_check_plugin_json $vt_plugin_path conf_replace $vtoy_iso_part
+        
+        echo -e "\npress ENTER to exit ..."
+        read vtInputKey
+        unset pager
+    }
+    
     menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
         echo 'Return ...'
     }
@@ -116,7 +125,17 @@ submenu "Resolution Configuration" --class=debug_resolution {
     done
 }
 
-
+submenu "Screen Display Mode" --class=debug_screen_mode {
+    menuentry 'Force Text Mode' --class=debug_text_mode {
+        terminal_output console
+    }
+    menuentry 'Force Graphics Mode' --class=debug_gui_mode {
+        terminal_output gfxterm
+    }
+    menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
+        echo 'Return ...'
+    }
+}
 
 if [ "$grub_platform" != "pc" ]; then
     submenu 'Ventoy UEFI Utilities' --class=debug_util {
index ed372d04c944eab395325377ef9cc3ad827bc20d..bafba8d034ca2d02f85307f73da4bd0c2291ea27 100644 (file)
@@ -265,6 +265,12 @@ function distro_specify_initrd_file_phase2 {
         fi
     elif [ -f (loop)/blackarch/boot/x86_64/archiso.img ]; then 
         vt_linux_specify_initrd_file /blackarch/boot/x86_64/archiso.img
+        
+    elif [ -f (loop)/install.amd/initrd.gz ]; then
+        vt_linux_specify_initrd_file /live/initrd2.img
+        vt_linux_specify_initrd_file /install.amd/initrd.gz
+        vt_linux_specify_initrd_file /install.amd/gtk/initrd.gz
+        
     fi
 }
 
@@ -619,6 +625,10 @@ function uefi_iso_menu_func {
     
     vt_img_sector ${1}${chosen_path}
     
+    if [ "$ventoy_fs_probe" = "iso9660" ]; then
+        vt_select_conf_replace ${1} ${chosen_path}
+    fi
+    
     if [ "$vtoy_os" = "Windows" ]; then
         vt_check_compatible_pe (loop)        
         uefi_windows_menu_func  $1 ${chosen_path}
@@ -782,7 +792,7 @@ function legacy_iso_menu_func {
     loopback loop ${1}${chosen_path}
     
     get_os_type (loop)
-
+    
     if [ -n "$vtcompat" ]; then
         set ventoy_compatible=YES
         unset vtcompat
@@ -794,6 +804,10 @@ function legacy_iso_menu_func {
     
     vt_img_sector ${1}${chosen_path}
 
+    if [ "$ventoy_fs_probe" = "iso9660" ]; then
+        vt_select_conf_replace ${1} ${chosen_path}
+    fi
+
     if [ "$vtoy_os" = "Windows" ]; then
         vt_check_compatible_pe (loop)        
         legacy_windows_menu_func  $1 ${chosen_path}
@@ -1344,7 +1358,7 @@ function img_unsupport_menuentry {
 #############################################################
 #############################################################
 
-set VENTOY_VERSION="1.0.26"
+set VENTOY_VERSION="1.0.27"
 
 #ACPI not compatible with Window7/8, so disable by default
 set VTOY_PARAM_NO_ACPI=1
index 239f89fcbba35704e820c15c11994362ce1bbb34..9ef0b8f8ab6e0c1ba534f17735a378b28482bd8c 100644 (file)
Binary files a/INSTALL/grub/i386-pc/core.img and b/INSTALL/grub/i386-pc/core.img differ
index ff834169778ae81d4d52a4c6c6d926e31b23cbbf..8400886527d9bbe6a70d9e6f0c8164ea2deca1ff 100644 (file)
@@ -21,7 +21,12 @@ if [ "$grub_platform" = "pc" ]; then
         if search -n -s -f /Boot/BCD; then
             for bt in bootmgr BOOTMGR Bootmgr BootMGR; do
                 if [ -f /$bt ]; then
-                    ntldr /$bt
+                    if regexp '^hd0' $root; then
+                        ntldr /$bt
+                    else
+                        drivemap -s hd0 $root
+                        ntldr /$bt
+                    fi
                     break
                 fi
             done
index bddd5d7fc7173340c8f258ac818432c3e4fc6f80..7f235a838ec00f9c2633c3ef54854ce93dba5b7f 100644 (file)
Binary files a/INSTALL/ventoy/ventoy.cpio and b/INSTALL/ventoy/ventoy.cpio differ
index 3e99a086a6bc72c02d263c5bc2cbbee13b137d59..056ce8c128f36763c72c87c1a271d8e2cab450ba 100644 (file)
Binary files a/INSTALL/ventoy/vtloopex.cpio and b/INSTALL/ventoy/vtloopex.cpio differ