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[] =
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") : " ";
}
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;
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;
{
return g_ventoy_grub2_mode ? 0 : 1;
}
+ else if (args[0][0] == '4')
+ {
+ return g_ventoy_wimboot_mode ? 0 : 1;
+ }
return 1;
}
{ "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 },
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);
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;
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;
}
+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
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}
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"
+ 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
--- /dev/null
+[LaunchApps]\r
+vtoyjump.exe
\ No newline at end of file
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.
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
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
}\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
</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>