]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Add WIMBOOT mode
authorlongpanda <admin@ventoy.net>
Wed, 12 May 2021 14:49:12 +0000 (22:49 +0800)
committerlongpanda <admin@ventoy.net>
Wed, 12 May 2021 14:49:12 +0000 (22:49 +0800)
14 files changed:
GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/gui_label.c
GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu.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_windows.c
INSTALL/grub/grub.cfg
INSTALL/grub/themes/ventoy/theme.txt
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump64.exe
INSTALL/ventoy/wimboot [new file with mode: 0644]
INSTALL/ventoy/winpeshl.ini [new file with mode: 0644]
License/license-wimboot.txt
vtoyjump/vtoyjump/vtoyjump.c
vtoyjump/vtoyjump/vtoyjump.vcxproj

index 3fd1390abb1a9e1be99463ba2983a3ff9f377f19..5e448d27a915a4267c980f736dcb1ef3f8e25fae 100644 (file)
@@ -29,6 +29,7 @@
 extern int g_ventoy_memdisk_mode;
 extern int g_ventoy_iso_raw;
 extern int g_ventoy_grub2_mode;
+extern int g_ventoy_wimboot_mode;
 extern int g_ventoy_iso_uefi_drv;
 
 static const char *align_options[] =
@@ -209,6 +210,9 @@ label_set_property (void *vself, const char *name, const char *value)
        else if (grub_strcmp (value, "@VTOY_GRUB2_MODE@") == 0) {
             value = g_ventoy_grub2_mode ? grub_env_get("VTOY_GRUB2_MODE_STR") : " ";
        }
+       else if (grub_strcmp (value, "@VTOY_WIMBOOT_MODE@") == 0) {
+            value = g_ventoy_wimboot_mode ? grub_env_get("VTOY_WIMBOOT_MODE_STR") : " ";
+       }
        else if (grub_strcmp (value, "@VTOY_ISO_UEFI_DRV@") == 0) {
             value = g_ventoy_iso_uefi_drv ? grub_env_get("VTOY_ISO_UEFI_DRV_STR") : " ";
        }
index f682fa8ad0731935b7c137094e30a1207be9de2d..14e3dac5b6edf9eeb4bab1b5fb48bd4d3274148e 100644 (file)
@@ -38,6 +38,7 @@ int g_ventoy_menu_refresh = 0;
 int g_ventoy_memdisk_mode = 0;
 int g_ventoy_iso_raw = 0;
 int g_ventoy_grub2_mode = 0;
+int g_ventoy_wimboot_mode = 0;
 int g_ventoy_iso_uefi_drv = 0;
 int g_ventoy_last_entry = -1;
 int g_ventoy_suppress_esc = 0;
@@ -904,6 +905,12 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
             g_ventoy_menu_refresh = 1;
             goto refresh;
             
+        case (GRUB_TERM_CTRL | 'w'):
+            menu_fini ();
+            g_ventoy_wimboot_mode = 1 - g_ventoy_wimboot_mode;
+            g_ventoy_menu_refresh = 1;
+            goto refresh;
+            
         case (GRUB_TERM_CTRL | 'u'):
             menu_fini ();
             g_ventoy_iso_uefi_drv = 1 - g_ventoy_iso_uefi_drv;
index 9f0a8b8ffdbdf8b0dcacb2a2e069643c0b126e71..3a9b7718023c297ccb4b7d38793a513def1c396d 100644 (file)
@@ -3163,6 +3163,10 @@ static grub_err_t ventoy_cmd_check_mode(grub_extcmd_context_t ctxt, int argc, ch
     {
         return g_ventoy_grub2_mode ? 0 : 1;
     }
+    else if (args[0][0] == '4')
+    {
+        return g_ventoy_wimboot_mode ? 0 : 1;
+    }
 
     return 1;
 }
@@ -4426,6 +4430,7 @@ static cmd_para ventoy_cmds[] =
 
     { "vt_windows_reset",      ventoy_cmd_wimdows_reset, 0, NULL, "", "", NULL },
     { "vt_windows_chain_data", ventoy_cmd_windows_chain_data, 0, NULL, "", "", NULL },
+    { "vt_windows_wimboot_data", ventoy_cmd_windows_wimboot_data, 0, NULL, "", "", NULL },
     { "vt_windows_collect_wim_patch", ventoy_cmd_collect_wim_patch, 0, NULL, "", "", NULL },
     { "vt_windows_locate_wim_patch", ventoy_cmd_locate_wim_patch, 0, NULL, "", "", NULL },
     { "vt_windows_count_wim_patch", ventoy_cmd_wim_patch_count, 0, NULL, "", "", NULL },
index 5e7e11d2c6fea194512a0e1d28c61a67f5e0db97..3aff72b2fbb9bc22584121fde2688a7f514896c1 100644 (file)
@@ -555,6 +555,7 @@ 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);
 grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
+grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
@@ -916,6 +917,7 @@ extern int g_ventoy_last_entry;
 extern int g_ventoy_memdisk_mode;
 extern int g_ventoy_iso_raw;
 extern int g_ventoy_grub2_mode;
+extern int g_ventoy_wimboot_mode;
 extern int g_ventoy_iso_uefi_drv;
 extern int g_ventoy_case_insensitive;
 extern grub_uint8_t g_ventoy_chain_type;
index f6d4d26acd7495f134baff2850a6eed756c86c82..d21533a55bb67bf6a51c33a280f1045d7fd955fa 100644 (file)
@@ -1330,6 +1330,54 @@ end:
     return rc;
 }
 
+grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    grub_uint32_t size = 0;
+    const char *addr = NULL;
+    ventoy_chain_head *chain = NULL;
+    ventoy_os_param *param = NULL;
+    char envbuf[64];
+
+    (void)ctxt;
+    (void)argc;
+    (void)args;
+
+    addr = grub_env_get("vtoy_chain_mem_addr");
+    if (!addr)
+    {
+        debug("Failed to find vtoy_chain_mem_addr\n");
+        return 1;
+    }
+
+    chain = (ventoy_chain_head *)(void *)grub_strtoul(addr, NULL, 16);
+
+    if (grub_memcmp(&g_ventoy_guid, &chain->os_param.guid, 16) != 0)
+    {
+        debug("os_param.guid not match\n");
+        return 1;
+    }
+
+    size = sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);
+    param = (ventoy_os_param *)grub_zalloc(size);
+    if (!param)
+    {
+        return 1;
+    }
+
+    grub_memcpy(param, &chain->os_param, sizeof(ventoy_os_param));
+    ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path);
+
+    grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)param);
+    grub_env_set("vtoy_wimboot_mem_addr", envbuf);
+    debug("vtoy_wimboot_mem_addr: %s\n", envbuf);
+    
+    grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
+    grub_env_set("vtoy_wimboot_mem_size", envbuf);
+    debug("vtoy_wimboot_mem_size: %s\n", envbuf);
+    
+    VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+
 grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     int unknown_image = 0;
index a8f70b2bb0d037b977bc697f497deccdc5e4d44c..f57a20c979ba779d85123697a5b0266a27f7bd86 100644 (file)
@@ -805,6 +805,25 @@ function uefi_iso_memdisk {
 }
 
 
+function legacy_windows_wimboot_func {
+    set wimbootfile=(loop)/sources/boot.wim
+    set wimbit=64
+
+    vt_windows_wimboot_data
+
+    linux16  $vtoy_efi_part/ventoy/wimboot quiet
+    ventoy_debug_pause
+    
+    echo Loading files...... (This may take a few minutes, please wait.)
+    initrd16 newc:vtoyjump.exe:$vtoy_efi_part/ventoy/vtoyjump${wimbit}.exe \
+         newc:wimboot.data:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \
+         newc:winpeshl.ini:$vtoy_efi_part/ventoy/winpeshl.ini \
+         newc:bcd:(loop)/boot/bcd \
+         newc:boot.sdi:(loop)/boot/boot.sdi \
+         newc:boot.wim:$wimbootfile
+    boot
+}
+
 function legacy_windows_menu_func {
     vt_windows_reset
     
@@ -833,7 +852,11 @@ function legacy_windows_menu_func {
 
     vt_windows_chain_data "${1}${chosen_path}"
     ventoy_debug_pause    
-    
+
+    if vt_check_mode 4; then
+        legacy_windows_wimboot_func
+    fi
+
     if [ -n "$vtoy_chain_mem_addr" ]; then
         ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
         linux16   $vtoy_path/ipxe.krn ${vtdebug_flag} ibft mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}        
@@ -1721,6 +1744,7 @@ set VTOY_DEFAULT_MENU_MODE=0
 set VTOY_MEM_DISK_STR="[Memdisk]"
 set VTOY_ISO_RAW_STR="Compatible Mode"
 set VTOY_GRUB2_MODE_STR="GRUB2 Mode"
+set VTOY_WIMBOOT_MODE_STR="WIMBOOT Mode"
 set VTOY_ISO_UEFI_DRV_STR="UEFI FS"
 
 set VTOY_F2_CMD="ventoy_power"
index 708acd2583ba3f82a4d290fdd36e82fceee620e2..f8815065f9d43d8fdeed40c1e2e254e5ace6781f 100644 (file)
@@ -78,6 +78,14 @@ terminal-box: "terminal_box_*.png"
     + label {text = "@VTOY_GRUB2_MODE@" color = "red" align = "left"} 
 }
 
++ hbox{ 
+    left = 30%+200
+    top = 95%-25
+    width = 10%
+    height = 25
+    + label {text = "@VTOY_WIMBOOT_MODE@" color = "red" align = "left"} 
+}
+
 + hbox{ 
     left = 90%
     top = 55 
index bcff924051adcd309b3105452a146d86c30b9b31..6019aa44a256dcf5632f54001997dad3f7fe9242 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ
index 4edb6de39484296a52bbc3bc6d57592c67d2bb92..c2e80a77a1b99578449749c2dbf972a2ef9e9f2c 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ
diff --git a/INSTALL/ventoy/wimboot b/INSTALL/ventoy/wimboot
new file mode 100644 (file)
index 0000000..e02ed65
Binary files /dev/null and b/INSTALL/ventoy/wimboot differ
diff --git a/INSTALL/ventoy/winpeshl.ini b/INSTALL/ventoy/winpeshl.ini
new file mode 100644 (file)
index 0000000..2302fea
--- /dev/null
@@ -0,0 +1,2 @@
+[LaunchApps]\r
+vtoyjump.exe
\ No newline at end of file
index 9179d0356acc91ad77b3390416a0a90804bb10bd..8ab4754e062dcb5afd3c93e22978e0ad23754dd4 100644 (file)
@@ -1,5 +1,4 @@
 wimboot follows GPLv2+ license (see gpl-2.0.txt)
 
-Ventoy use the lzx decompress file from wimboot. These code follow the same license as wimboot.
-
+Ventoy modified the code and follow the same license as wimboot.
 
index f5e404164e5c00a1f49f9468867712da8a1a9967..e8f9f5a89aa9cdab9f7a602b35cd7253135684e1 100644 (file)
@@ -1105,6 +1105,64 @@ const char * GetFileNameInPath(const char *fullpath)
        return fullpath;\r
 }\r
 \r
+int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)\r
+{\r
+    int rc = 1;\r
+    char *buf = NULL;\r
+    DWORD size = 0;\r
+    DWORD Pos;\r
+\r
+#ifdef VTOY_32\r
+    g_64bit_system = FALSE;\r
+#else\r
+    g_64bit_system = TRUE;\r
+#endif\r
+    \r
+    Log("VentoyJumpWimboot 64bit:%u", g_64bit_system);\r
+\r
+    sprintf_s(LunchFile, MAX_PATH, "X:\\setup.exe");\r
+\r
+    ReadWholeFile2Buf("wimboot.data", &buf, &size);\r
+    Log("wimboot.data size:%d", size);\r
+\r
+    memcpy(&g_os_param, buf, sizeof(ventoy_os_param));\r
+    memcpy(&g_windows_data, buf + sizeof(ventoy_os_param), sizeof(ventoy_windows_data));\r
+    memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved));\r
+\r
+    if (g_os_param_reserved[0] == 1)\r
+    {\r
+        Log("break here for debug .....");\r
+        goto End;\r
+    }\r
+\r
+    // convert / to \\   \r
+    for (Pos = 0; Pos < sizeof(g_os_param.vtoy_img_path) && g_os_param.vtoy_img_path[Pos]; Pos++)\r
+    {\r
+        if (g_os_param.vtoy_img_path[Pos] == '/')\r
+        {\r
+            g_os_param.vtoy_img_path[Pos] = '\\';\r
+        }\r
+    }\r
+\r
+    if (g_os_param_reserved[0] == 2)\r
+    {\r
+        Log("skip hook for debug .....");\r
+        rc = 0;\r
+        goto End;\r
+    }\r
+\r
+    rc = VentoyHook(&g_os_param);\r
+\r
+End:\r
+\r
+    if (buf)\r
+    {\r
+        free(buf);\r
+    }\r
+\r
+    return rc;\r
+}\r
+\r
 int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
 {\r
        int rc = 1;\r
@@ -1241,7 +1299,15 @@ int main(int argc, char **argv)
     GetStartupInfoA(&Si);\r
 \r
     memset(LunchFile, 0, sizeof(LunchFile));\r
-    rc = VentoyJump(argc, argv, LunchFile);\r
+\r
+    if (strstr(argv[0], "vtoyjump.exe"))\r
+    {\r
+        rc = VentoyJumpWimboot(argc, argv, LunchFile);\r
+    }\r
+    else\r
+    {\r
+        rc = VentoyJump(argc, argv, LunchFile);\r
+    }\r
 \r
     if (g_os_param_reserved[0] == 3)\r
     {\r
@@ -1250,11 +1316,17 @@ int main(int argc, char **argv)
     }\r
     else\r
     {\r
-        Si.dwFlags |= STARTF_USESHOWWINDOW;\r
-        Si.wShowWindow = SW_HIDE;\r
+        if (NULL == strstr(LunchFile, "setup.exe"))\r
+        {\r
+            Log("Not setup.exe, hide windows.");\r
+            Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+            Si.wShowWindow = SW_HIDE;\r
+        }\r
+        \r
         Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
     }\r
-\r
+    \r
+    Log("Now launch <%s> ...", LunchFile);\r
        CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
 \r
     while (rc)\r
index a0a67b1fb9ec74b10ddd7556b5a4c974a47d6b15..eeef6d987cc45db749999a4d05f2732095f7adef 100644 (file)
@@ -92,7 +92,7 @@
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>FATFS_INC_FORMAT_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>VTOY_32;FATFS_INC_FORMAT_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
     </ClCompile>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>FATFS_INC_FORMAT_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>VTOY_64;FATFS_INC_FORMAT_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
     </ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>VTOY_32;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
     </ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>VTOY_64;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
     </ClCompile>