X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/7bf85a1ef8e4af080aa30b06a323b101603af5cb..e79dc57ebe8d1818fac798d90567915cc4609a13:/INSTALL/grub/grub.cfg diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 487dae0..a53de0a 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -599,34 +599,35 @@ function ventoy_unix_comm_proc { function uefi_windows_menu_func { vt_windows_reset - if [ "$ventoy_compatible" = "NO" ]; then - - if [ "$ventoy_fs_probe" = "iso9660" ]; then - loopback -d loop - vt_iso9660_nojoliet 1 - loopback loop "$1$2" - fi - - for file in "efi/microsoft/boot/bcd"; do - vt_windows_collect_wim_patch bcd (loop)/$file - done + if vt_check_mode 4 "$vt_chosen_name"; then + vt_windows_chain_data "${1}${chosen_path}" + ventoy_debug_pause + vtoy_wimboot_func + else + if [ "$ventoy_compatible" = "NO" ]; then + + if [ "$ventoy_fs_probe" = "iso9660" ]; then + loopback -d loop + vt_iso9660_nojoliet 1 + loopback loop "$1$2" + fi + + for file in "efi/microsoft/boot/bcd"; do + vt_windows_collect_wim_patch bcd (loop)/$file + done - vt_windows_count_wim_patch vt_wim_cnt - if [ $vt_wim_cnt -eq 0 ]; then - distro_specify_wim_patch_phase2 + vt_windows_count_wim_patch vt_wim_cnt + if [ $vt_wim_cnt -eq 0 ]; then + distro_specify_wim_patch_phase2 + fi + + ventoy_debug_pause + locate_wim "${chosen_path}" fi - - ventoy_debug_pause - locate_wim "${chosen_path}" + vt_windows_chain_data "${1}${chosen_path}" + ventoy_debug_pause fi - vt_windows_chain_data "${1}${chosen_path}" - ventoy_debug_pause - - if vt_check_mode 4 "$vt_chosen_name"; then - vtoy_windows_wimboot_func - fi - if [ -n "$vtoy_chain_mem_addr" ]; then ventoy_acpi_param ${vtoy_chain_mem_addr} 2048 ventoy_cli_console @@ -942,8 +943,7 @@ function uefi_iso_memdisk { ventoy_gui_console } - -function vtoy_windows_wimboot_func { +function vtoy_windows_wimboot { if [ -f (loop)/x86/sources/boot.wim -a -f (loop)/x64/sources/boot.wim ]; then vt_sel_wimboot vtoy_wimboot_bit if [ "$vtoy_wimboot_bit" = "32" ]; then @@ -961,7 +961,7 @@ function vtoy_windows_wimboot_func { fi if [ -n "${vtdebug_flag}" ]; then - echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit + echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit vt_wimkernel=$vt_wimkernel fi for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do @@ -971,33 +971,24 @@ function vtoy_windows_wimboot_func { done if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then - vt_windows_wimboot_data + vt_windows_wimboot_data "$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe else return fi if [ "$grub_platform" = "pc" ]; then - set vt_wimkernel=wimboot.x86_64.xz - linux16 "$vtoy_path/$vt_wimkernel" quiet ventoy_debug_pause vt_set_wim_load_prompt 1 "Loading files......" - initrd16 newc:vtoyjump.exe:$vtoy_path/vtoyjump${vtoy_wimboot_bit}.exe \ - newc:wimboot.data:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \ - newc:winpeshl.ini:mem:${vtoy_winpeshl_ini_addr}:size:${vtoy_winpeshl_ini_size} \ + initrd16 newc:winpeshl.exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \ + newc:vtoy_wimboot:$vtoy_wimboot_prefix/boot/bcd \ newc:bcd:$vtoy_wimboot_prefix/boot/bcd \ newc:boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi \ newc:boot.wim:$vtoy_wimboot_prefix/sources/boot.wim vt_set_wim_load_prompt 0 boot else - if [ "$grub_cpu" = "i386" ]; then - set vt_wimkernel=wimboot.i386.efi.xz - else - set vt_wimkernel=wimboot.x86_64.xz - fi - vt_set_wim_load_prompt 1 "Loading files......" vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/sources/boot.wim vtoy_wimfile_mem vt_set_wim_load_prompt 0 @@ -1010,9 +1001,8 @@ function vtoy_windows_wimboot_func { ventoy_cli_console chainloader "$vtoy_path/$vt_wimkernel" quiet \ - "vf=wimboot.data:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \ - "vf=winpeshl.ini:mem:${vtoy_winpeshl_ini_addr}:size:${vtoy_winpeshl_ini_size}" \ - "vf=vtoyjump.exe:$vtoy_path/vtoyjump${vtoy_wimboot_bit}.exe" \ + "vf=winpeshl.exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \ + "vf=vtoy_wimboot:$vtoy_wimboot_prefix/boot/bcd" \ "vf=bcd:$vtoy_wimboot_prefix/boot/bcd" \ "vf=boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi" \ "vf=boot.wim:$vtoy_wimfile_path" \ @@ -1023,37 +1013,118 @@ function vtoy_windows_wimboot_func { fi } -function legacy_windows_menu_func { - vt_windows_reset +function vtoy_winpe_wimboot { + unset vtoy_boot_mgr_exe + unset vtoy_boot_mgr_efi + set vtoy_wimboot_prefix=(loop) + set vtoy_bcd_path="$1" + set vtoy_sdi_path="$2" + set vtoy_wim_path="$3" + set vtoy_mgr_flag="$4" - if [ "$ventoy_compatible" = "NO" ]; then - - if [ "$ventoy_fs_probe" = "iso9660" ]; then - loopback -d loop - vt_iso9660_nojoliet 1 - loopback loop "$1$2" + if [ $vtoy_mgr_flag -eq 1 ]; then + set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5" + elif [ $vtoy_mgr_flag -eq 2 ]; then + set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$5" + elif [ $vtoy_mgr_flag -eq 3 ]; then + set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5" + set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$6" + fi + + vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe + + if [ "$grub_platform" = "pc" ]; then + linux16 "$vtoy_path/$vt_wimkernel" quiet + ventoy_debug_pause + + vt_set_wim_load_prompt 1 "Loading files......" + initrd16 newc:$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \ + $vtoy_boot_mgr_exe \ + newc:vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path \ + newc:bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path \ + newc:boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path \ + newc:boot.wim:$vtoy_wimboot_prefix/$vtoy_wim_path + vt_set_wim_load_prompt 0 + boot + else + vt_set_wim_load_prompt 1 "Loading files......" + vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_wimfile_mem + vt_set_wim_load_prompt 0 + + if [ $? -eq 0 ]; then + set vtoy_wimfile_path=mem:${vtoy_wimfile_mem_addr}:size:${vtoy_wimfile_mem_size} + else + set vtoy_wimfile_path=$vtoy_wimboot_prefix/$vtoy_wim_path fi - - for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do - vt_windows_collect_wim_patch bcd (loop)/$file - done - - distro_specify_wim_patch - vt_windows_count_wim_patch vt_wim_cnt - if [ $vt_wim_cnt -eq 0 ]; then - distro_specify_wim_patch_phase2 + ventoy_cli_console + chainloader "$vtoy_path/$vt_wimkernel" quiet \ + "vf=$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \ + "vf=vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path" \ + "$vtoy_boot_mgr_efi" \ + "vf=bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path" \ + "vf=boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path" \ + "vf=boot.wim:$vtoy_wimfile_path" \ + pfsize=$vtoy_chain_file_size \ + pfread=$vtoy_chain_file_read + boot + ventoy_gui_console + fi +} + +function vtoy_wimboot_func { + echo -e "\n===================== VENTOY WIMBOOT ===================\n" + + if [ "$grub_platform" = "pc" ]; then + set vt_wimkernel=wimboot.x86_64.xz + else + if [ "$grub_cpu" = "i386" ]; then + set vt_wimkernel=wimboot.i386.efi.xz + else + set vt_wimkernel=wimboot.x86_64.xz fi - - ventoy_debug_pause - locate_wim "${chosen_path}" fi - vt_windows_chain_data "${1}${chosen_path}" - ventoy_debug_pause + if vt_str_begin "$vt_volume_id" "Modified-Win10PEx64"; then + vtoy_winpe_wimboot 'Boot/bcd' 'Boot/boot.sdi' 'sources/boot.wim' 1 'bootmgr.exe' + else + vtoy_windows_wimboot + fi +} +function legacy_windows_menu_func { + vt_windows_reset + if vt_check_mode 4 "$vt_chosen_name"; then - vtoy_windows_wimboot_func + vt_windows_chain_data "${1}${chosen_path}" + ventoy_debug_pause + vtoy_wimboot_func + else + if [ "$ventoy_compatible" = "NO" ]; then + + if [ "$ventoy_fs_probe" = "iso9660" ]; then + loopback -d loop + vt_iso9660_nojoliet 1 + loopback loop "$1$2" + fi + + for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do + vt_windows_collect_wim_patch bcd (loop)/$file + done + + distro_specify_wim_patch + + vt_windows_count_wim_patch vt_wim_cnt + if [ $vt_wim_cnt -eq 0 ]; then + distro_specify_wim_patch_phase2 + fi + + ventoy_debug_pause + locate_wim "${chosen_path}" + fi + + vt_windows_chain_data "${1}${chosen_path}" + ventoy_debug_pause fi if [ -n "$vtoy_chain_mem_addr" ]; then