]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - INSTALL/grub/grub.cfg
wimboot mode support Bob.Ombs.Modified.Win10PEx64 (#1842)
[Ventoy.git] / INSTALL / grub / grub.cfg
index 487dae0d10c21e025dd72532a3848136e3102401..a53de0a05af0b95f8e0c1d7e152f75656269b2df 100644 (file)
@@ -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