]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Fix a bug that Windows ISO in local disk can not install when boot through F2 browser...
authorlongpanda <admin@ventoy.net>
Thu, 28 Apr 2022 14:07:30 +0000 (22:07 +0800)
committerlongpanda <admin@ventoy.net>
Thu, 28 Apr 2022 14:07:30 +0000 (22:07 +0800)
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_windows.c
INSTALL/ventoy/ipxe.krn
IPXE/ipxe_mod_code/ipxe-3fe683e/src/arch/x86/core/ventoy_vdisk.c
IPXE/ipxe_mod_code/ipxe-3fe683e/src/arch/x86/interface/pcbios/ventoy_int13.c
IPXE/ipxe_mod_code/ipxe-3fe683e/src/include/ventoy.h

index 711c3fdd4cb1584e00357822e52f8276f0123dc1..5bde7a3ddd2e602ece7e679aa9a7a522dc635115 100644 (file)
@@ -113,6 +113,7 @@ grub_uint8_t *g_conf_replace_new_buf = NULL;
 int g_conf_replace_new_len = 0;
 int g_conf_replace_new_len_align = 0;
 
 int g_conf_replace_new_len = 0;
 int g_conf_replace_new_len_align = 0;
 
+int g_ventoy_disk_bios_id = 0;
 ventoy_gpt_info *g_ventoy_part_info = NULL;
 grub_uint64_t g_ventoy_disk_size = 0;
 grub_uint64_t g_ventoy_disk_part_size[2];
 ventoy_gpt_info *g_ventoy_part_info = NULL;
 grub_uint64_t g_ventoy_disk_size = 0;
 grub_uint64_t g_ventoy_disk_part_size[2];
@@ -4526,6 +4527,8 @@ int ventoy_load_part_table(const char *diskname)
 
     g_ventoy_disk_size = disk->total_sectors * (1U << disk->log_sector_size);
 
 
     g_ventoy_disk_size = disk->total_sectors * (1U << disk->log_sector_size);
 
+    g_ventoy_disk_bios_id = disk->id;
+
     grub_disk_read(disk, 0, 0, sizeof(ventoy_gpt_info), g_ventoy_part_info);
     grub_disk_close(disk);
 
     grub_disk_read(disk, 0, 0, sizeof(ventoy_gpt_info), g_ventoy_part_info);
     grub_disk_close(disk);
 
index 5f90ba7aed1232f848182129c344f0839e6ee718..27209da60747fd1afe15a7ba53e9fc445cb6089b 100644 (file)
@@ -1034,6 +1034,7 @@ 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;
 extern grub_uint8_t *g_conf_replace_new_buf;
 extern int g_conf_replace_new_len;
 extern int g_conf_replace_new_len_align;
+extern int g_ventoy_disk_bios_id;
 extern grub_uint64_t g_ventoy_disk_size;
 extern grub_uint64_t g_ventoy_disk_part_size[2];
 extern grub_uint32_t g_ventoy_plat_data;
 extern grub_uint64_t g_ventoy_disk_size;
 extern grub_uint64_t g_ventoy_disk_part_size[2];
 extern grub_uint32_t g_ventoy_plat_data;
index c854ad4a1e09d2378ea5878b0dfeae72f37273c5..ba956080bc442dc91a44e7cb79bb89995f6f4c57 100644 (file)
@@ -1651,24 +1651,39 @@ static void ventoy_windows_fill_virt_data(    grub_uint64_t isosize, ventoy_chai
     return;
 }
 
     return;
 }
 
-static int ventoy_windows_drive_map(ventoy_chain_head *chain)
+static int ventoy_windows_drive_map(ventoy_chain_head *chain, int vlnk)
 {
 {
+    int hd1 = 0;
     grub_disk_t disk;
         
     grub_disk_t disk;
         
-    debug("drive map begin <%p> ...\n", chain);
+    debug("drive map begin <%p> <%d> ...\n", chain, vlnk);
 
 
-    if (chain->disk_drive == 0x80)
+    disk = grub_disk_open("hd1");
+    if (disk)
     {
     {
-        disk = grub_disk_open("hd1");
-        if (disk)
+        grub_disk_close(disk);
+        hd1 = 1;
+        debug("BIOS hd1 exist\n");
+    }
+    else
+    {
+        debug("failed to open disk %s\n", "hd1");
+    }
+
+    if (vlnk)
+    {
+        if (g_ventoy_disk_bios_id == 0x80 && hd1)
         {
         {
-            grub_disk_close(disk);
-            debug("drive map needed %p\n", disk);
+            debug("drive map needed vlnk %p\n", disk);
             chain->drive_map = 0x81;
         }
             chain->drive_map = 0x81;
         }
-        else
+    }
+    else if (chain->disk_drive == 0x80)
+    {
+        if (hd1)
         {
         {
-            debug("failed to open disk %s\n", "hd1");
+            debug("drive map needed normal %p\n", disk);
+            chain->drive_map = 0x81;
         }
     }
     else
         }
     }
     else
@@ -1961,7 +1976,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
 
     if (ventoy_is_efi_os() == 0)
     {
 
     if (ventoy_is_efi_os() == 0)
     {
-        ventoy_windows_drive_map(chain);        
+        ventoy_windows_drive_map(chain, file->vlnk);        
     }
 
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
     }
 
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
@@ -2203,7 +2218,7 @@ static grub_err_t ventoy_vlnk_wim_chain_data(grub_file_t wimfile)
 
     if (ventoy_is_efi_os() == 0)
     {
 
     if (ventoy_is_efi_os() == 0)
     {
-        ventoy_windows_drive_map(chain);        
+        ventoy_windows_drive_map(chain, 0);        
     }
 
     grub_file_close(file);
     }
 
     grub_file_close(file);
@@ -2357,7 +2372,7 @@ static grub_err_t ventoy_normal_wim_chain_data(grub_file_t wimfile)
 
     if (ventoy_is_efi_os() == 0)
     {
 
     if (ventoy_is_efi_os() == 0)
     {
-        ventoy_windows_drive_map(chain);        
+        ventoy_windows_drive_map(chain, 0);        
     }
 
     grub_file_close(file);
     }
 
     grub_file_close(file);
index aebf3bbd8e7dc9555ec103bf32e00c93a12da614..b983382cfab2bd593029ec71ede9386eb73f9970 100644 (file)
Binary files a/INSTALL/ventoy/ipxe.krn and b/INSTALL/ventoy/ipxe.krn differ
index 074f1afeb17a33262c4c41e5248cc1f8ecb027a1..0150ad78258b7b68477ab387fbc17c2cda5d6624 100644 (file)
@@ -616,10 +616,9 @@ static void ventoy_dump_chain(ventoy_chain_head *chain)
     printf("os_param->vtoy_disk_part_type=%u\n",  chain->os_param.vtoy_disk_part_type);
     printf("os_param->vtoy_img_path=<%s>\n",      chain->os_param.vtoy_img_path);
     printf("os_param->vtoy_img_size=<%llu>\n",    chain->os_param.vtoy_img_size);
     printf("os_param->vtoy_disk_part_type=%u\n",  chain->os_param.vtoy_disk_part_type);
     printf("os_param->vtoy_img_path=<%s>\n",      chain->os_param.vtoy_img_path);
     printf("os_param->vtoy_img_size=<%llu>\n",    chain->os_param.vtoy_img_size);
-    printf("os_param->vtoy_reserve[0]=<%u>\n",    vtoy_reserve[0]);
-    printf("os_param->vtoy_reserve[1]=<%u>\n",    vtoy_reserve[1]);
-    printf("os_param->vtoy_reserve[2]=<%u>\n",    vtoy_reserve[2]);
-    printf("os_param->vtoy_reserve[3]=<%u>\n",    vtoy_reserve[3]);
+    printf("os_param->vtoy_reserve[ ]=<%u %u %u %u %u %u %u>\n",  
+        vtoy_reserve[0], vtoy_reserve[1], vtoy_reserve[2], vtoy_reserve[3], 
+        vtoy_reserve[4], vtoy_reserve[5], vtoy_reserve[6]);
     printf("os_param->vtoy_img_location_addr=<0x%llx>\n", chain->os_param.vtoy_img_location_addr);
     printf("os_param->vtoy_img_location_len=<%u>\n",   chain->os_param.vtoy_img_location_len);
     ventoy_debug_pause();
     printf("os_param->vtoy_img_location_addr=<0x%llx>\n", chain->os_param.vtoy_img_location_addr);
     printf("os_param->vtoy_img_location_len=<%u>\n",   chain->os_param.vtoy_img_location_len);
     ventoy_debug_pause();
index 2671761da9fef9574e82010fdefcc6656659eabd..eef81a81463e07baf4d4a332f70208b7d0056e8e 100644 (file)
@@ -1441,7 +1441,12 @@ unsigned int ventoy_int13_hook (ventoy_chain_head *chain)
         natural_drive = 0xE0; /* just set a cdrom drive number 224 */
     }
 
         natural_drive = 0xE0; /* just set a cdrom drive number 224 */
     }
 
-    if (chain->disk_drive >= 0x80 && chain->drive_map >= 0x80)
+    if (chain->os_param.vtoy_reserved[6])
+    {
+        g_drive_map1 = 0x80;
+        g_drive_map2 = 0x81;
+    }
+    else if (chain->disk_drive >= 0x80 && chain->drive_map >= 0x80)
     {
         g_drive_map1 = chain->disk_drive;
         g_drive_map2 = chain->drive_map;
     {
         g_drive_map1 = chain->disk_drive;
         g_drive_map2 = chain->drive_map;
index b10534d4a93b1e9edf5125baa324d5d4419ed22d..b759e9f54e6830e0dc3e026727779ff86fb4f7de 100644 (file)
@@ -86,7 +86,7 @@ typedef struct ventoy_os_param
     grub_uint64_t  vtoy_img_location_addr;
     grub_uint32_t  vtoy_img_location_len;
 
     grub_uint64_t  vtoy_img_location_addr;
     grub_uint32_t  vtoy_img_location_len;
 
-    grub_uint64_t  vtoy_reserved[4];     // Internal use by ventoy
+    grub_uint8_t   vtoy_reserved[32];    // Internal use by ventoy
 
     grub_uint8_t   vtoy_disk_signature[4];
     
 
     grub_uint8_t   vtoy_disk_signature[4];