]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - INSTALL/grub/grub.cfg
1. Optimization for WIMBOOT mode.
[Ventoy.git] / INSTALL / grub / grub.cfg
index f57a20c979ba779d85123697a5b0266a27f7bd86..d62b71df239da21fd320518bbd90fa9009243fbe 100644 (file)
@@ -535,6 +535,10 @@ function uefi_windows_menu_func {
     vt_windows_chain_data "${1}${chosen_path}"
     ventoy_debug_pause
     
+    if vt_check_mode 4; then
+        vtoy_windows_wimboot_func
+    fi
+    
     if [ -n "$vtoy_chain_mem_addr" ]; then
         ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
         ventoy_cli_console
@@ -805,23 +809,81 @@ function uefi_iso_memdisk {
 }
 
 
-function legacy_windows_wimboot_func {
-    set wimbootfile=(loop)/sources/boot.wim
-    set wimbit=64
+function vtoy_windows_wimboot_func {
+    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
+            set vtoy_wimboot_prefix=(loop)/x86
+        else
+            set vtoy_wimboot_prefix=(loop)/x64
+        fi
+    else
+        set vtoy_wimboot_prefix=(loop)
+        if vt_is_pe64 $vtoy_wimboot_prefix/setup.exe; then
+            set vtoy_wimboot_bit=64
+        else
+            set vtoy_wimboot_bit=32
+        fi
+    fi
+
+    if [ -n "${vtdebug_flag}" ]; then
+        echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit
+    fi
 
-    vt_windows_wimboot_data
+    for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do
+        if [ ! -f $vtoy_wimboot_prefix/$wmfile ]; then
+            return
+        fi
+    done
 
-    linux16  $vtoy_efi_part/ventoy/wimboot quiet
-    ventoy_debug_pause
+    if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then
+        vt_windows_wimboot_data
+    else
+        return
+    fi
     
-    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
+    if [ "$grub_platform" = "pc" ]; then
+        set vt_wimkernel=wimboot.x86_64.xz
+        
+        linux16  "$vtoy_path/$vt_wimkernel"  quiet
+        ventoy_debug_pause
+
+        echo Loading files...... (This may take a few minutes, please wait)
+        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} \
+             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
+        boot
+    else
+        if [ "$grub_cpu" = "i386" ]; then
+            set vt_wimkernel=wimboot.i386.efi.xz
+        else
+            set vt_wimkernel=wimboot.x86_64.xz
+        fi
+
+        echo Loading files...... (This may take a few minutes, please wait)
+        vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/sources/boot.wim vtoy_wimfile_mem
+        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/sources/boot.wim
+        fi
+
+        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=bcd:$vtoy_wimboot_prefix/boot/bcd" \
+            "vf=boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi" \
+            "vf=boot.wim:$vtoy_wimfile_path" \
+            pfsize=$vtoy_chain_file_size  \
+            pfread=$vtoy_chain_file_read
+        boot
+        ventoy_gui_console
+    fi
 }
 
 function legacy_windows_menu_func {
@@ -854,7 +916,7 @@ function legacy_windows_menu_func {
     ventoy_debug_pause    
 
     if vt_check_mode 4; then
-        legacy_windows_wimboot_func
+        vtoy_windows_wimboot_func
     fi
 
     if [ -n "$vtoy_chain_mem_addr" ]; then