+ for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do
+ if [ ! -f $vtoy_wimboot_prefix/$wmfile ]; then
+ return
+ fi
+ done
+
+ if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then
+ vt_windows_wimboot_data
+ else
+ return
+ fi
+
+ 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 {
+ 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 "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD"; 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
+ fi
+
+ 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
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} ibft mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+function legacy_linux_menu_func {
+ if [ "$ventoy_compatible" = "NO" ]; then
+
+ if [ "$ventoy_fs_probe" = "udf" ]; then
+ loopback -d loop
+ set ventoy_fs_probe=iso9660
+ loopback loop "$1$2"
+ fi
+
+ vt_load_cpio $vtoy_path "$2" "$1" "busybox=$ventoy_busybox_ver"
+
+ vt_linux_clear_initrd
+
+ if [ -d (loop)/pmagic ]; then
+ vt_linux_specify_initrd_file /pmagic/initrd.img
+ else
+ for dir in "isolinux" "boot/isolinux" "boot/x86_64/loader" "syslinux" "boot/syslinux"; do
+ if [ -d (loop)/$dir ]; then
+ vt_linux_parse_initrd_isolinux (loop)/$dir/
+ fi
+ done
+ fi
+
+ # special process for special distros
+ #archlinux
+ if [ -d (loop)/arch/boot/syslinux ]; then
+ vt_linux_parse_initrd_isolinux (loop)/arch/boot/syslinux/ /arch/
+ vt_linux_parse_initrd_isolinux (loop)/arch/boot/syslinux/ /arch/boot/syslinux/
+ elif [ -d (loop)/anarchy/boot/syslinux ]; then
+ vt_linux_parse_initrd_isolinux (loop)/anarchy/boot/syslinux/ /anarchy/
+
+ #manjaro
+ elif [ -d (loop)/manjaro ]; then
+ if [ -e (loop)/boot/grub/kernels.cfg ]; then
+ vt_linux_parse_initrd_grub file (loop)/boot/grub/kernels.cfg
+ fi
+ elif [ -e (loop)/boot/grub/grub.cfg ]; then
+ vt_linux_parse_initrd_grub file (loop)/boot/grub/grub.cfg
+ fi
+
+ distro_specify_initrd_file
+
+ vt_linux_initrd_count vtcount
+ if [ $vtcount -eq 0 ]; then
+ if [ -d (loop)/rancheros ]; then
+ vt_linux_parse_initrd_isolinux (loop)/boot/ /boot/isolinux/
+ fi
+
+ distro_specify_initrd_file_phase2
+ fi
+
+ locate_initrd
+ fi
+
+ vt_linux_chain_data "${1}${chosen_path}"
+ ventoy_debug_pause
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ if vt_check_mode 3; then
+ ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
+ ventoy_cli_console
+
+ # fallback
+ set vtback_root=$root
+ vt_push_last_entry
+ set vtback_theme=$theme
+ unset theme
+
+ vt_trailer_cpio "$vtoy_iso_part" "$vt_chosen_path" noinit
+ vt_set_boot_opt rdinit=/vtoy/vtoy
+
+ set root=(loop)
+ set vtback_cfg_find=0
+ for cfg in "/boot/grub/grub.cfg" "/EFI/BOOT/grub.cfg" "/EFI/debian/grub.cfg" "EFI/boot/grub.cfg" "efi/boot/grub.cfg" "/grub/grub.cfg" "EFI/BOOT/BOOTX64.conf"; do
+ if [ -e "$cfg" ]; then
+ set vtback_cfg_find=1
+ configfile "$cfg"
+ break
+ fi
+ done
+
+ vt_unset_boot_opt
+ set root=$vtback_root
+ set theme=$vtback_theme
+ vt_pop_last_entry
+ ventoy_gui_console
+ else
+ ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ fi
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+
+function legacy_unix_menu_func {
+ ventoy_unix_comm_proc $1 "${chosen_path}"
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ #ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+
+function legacy_iso_menu_func {
+
+ if [ -d (loop)/ ]; then
+ loopback -d loop
+ fi
+
+ set chosen_path="$2"
+
+ vt_select_auto_install "${chosen_path}"
+ vt_select_persistence "${chosen_path}"
+
+ if vt_is_udf "${1}${chosen_path}"; then
+ set ventoy_fs_probe=udf
+ else
+ set ventoy_fs_probe=iso9660
+ ventoy_reset_nojoliet
+ fi
+
+ loopback loop "${1}${chosen_path}"
+
+ get_os_type (loop)
+
+ if [ -n "$vtcompat" ]; then
+ set ventoy_compatible=YES
+ unset vtcompat
+ elif vt_check_mode 1; then
+ set ventoy_compatible=YES
+ else
+ vt_check_compatible (loop)
+ fi
+
+ vt_img_sector "${1}${chosen_path}"
+
+ if [ "$ventoy_fs_probe" = "iso9660" ]; then
+ vt_select_conf_replace "${1}" "${chosen_path}"
+ fi
+
+ if [ "$vtoy_os" = "Windows" ]; then
+ vt_check_compatible_pe (loop)
+ legacy_windows_menu_func "$1" "${chosen_path}"
+ elif [ "$vtoy_os" = "Unix" ]; then
+ legacy_unix_menu_func "$1" "${chosen_path}"
+ else
+ legacy_linux_menu_func "$1" "${chosen_path}"
+ fi
+}
+
+function legacy_iso_memdisk {
+
+ linux16 $vtoy_path/memdisk iso raw
+ echo "Loading ISO file to memory ..."
+ initrd16 "${1}${2}"
+ boot
+}
+
+
+function iso_endless_os_proc {
+ if [ -d (loop)/ ]; then
+ loopback -d loop
+ fi
+
+ loopback loop "${1}${2}"
+ vt_img_sector "${1}${2}"
+
+ vt_load_cpio $vtoy_path "$2" "$1" "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio "$1" "$2" noinit
+
+ ventoy_debug_pause
+
+ vt_set_boot_opt '@kparams' rdinit=/vtoy/vtoy
+
+ set eosimage=loop
+ set ventoy_bls_bootdev=/boot
+ set ventoy_loading_tip="Loading files ......"
+
+ export eosimage
+ configfile (loop)/endless/grub/grub.cfg
+
+ unset eosimage
+ unset ventoy_bls_bootdev
+ unset ventoy_loading_tip
+
+ vt_unset_boot_opt
+}
+
+
+function ventoy_iso_busybox_ver {
+
+ if [ "$VTOY_EFI_ARCH" = "aa64" ]; then
+ set ventoy_busybox_ver=a64
+ elif [ "$VTOY_EFI_ARCH" = "mips" ]; then
+ set ventoy_busybox_ver=m64
+ else
+ set ventoy_busybox_ver=32
+
+ #special process for deepin-live iso
+ if [ "$vt_chosen_size" = "403701760" ]; then
+ if vt_str_str "$vt_chosen_path" "/deepin-live"; then
+ set ventoy_busybox_ver=64
+ fi
+ elif vt_str_begin "$vt_volume_id" "PHOTON_"; then
+ set ventoy_busybox_ver=64
+ elif vt_str_begin "$vt_volume_id" "smgl-test-quinq-x86_64"; then
+ set ventoy_busybox_ver=64
+ elif vt_str_begin "$vt_volume_id" "LDiagBootable"; then
+ set ventoy_busybox_ver=64
+
+ fi
+ fi
+}
+
+
+function iso_common_menuentry {
+ unset vt_system_id
+ unset vt_volume_id
+
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ vt_parse_iso_volume "${vtoy_iso_part}${vt_chosen_path}" vt_system_id vt_volume_id vt_volume_space
+ if [ $vt_volume_space -ne $vt_chosen_size ]; then
+ vt_mod $vt_chosen_size 2048 vt_chosen_size_mod
+ if [ $vt_chosen_size_mod -ne 0 ]; then
+ echo -e "\n $vt_volume_space $vt_chosen_size $vt_chosen_size_mod\n"
+ echo -e "\n The size of the iso file \"$vt_chosen_size\" is invalid. File corrupted ?\n"
+ echo -e " 此ISO文件的大小 \"$vt_chosen_size\" 有问题,请确认文件是否损坏。\n"
+ echo -e "\n press ENTER to exit (请按 回车 键返回) ..."
+ read vtInputKey
+ return
+ fi
+ fi
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ if vt_str_begin "$vt_volume_id" "Avira"; then
+ vt_skip_svd "${vtoy_iso_part}${vt_chosen_path}"
+ fi
+
+ ventoy_iso_busybox_ver
+
+ #special process for Endless OS
+ if vt_str_begin "$vt_volume_id" "Endless-OS"; then
+ iso_endless_os_proc $vtoy_iso_part "$vt_chosen_path"
+ elif vt_str_begin "$vt_volume_id" "TENS-Public"; then
+ set vtcompat=1
+ fi
+
+ if [ "$grub_platform" = "pc" ]; then
+ if vt_check_mode 0; then
+ legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ else
+ legacy_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
+ fi
+ else
+ if vt_check_mode 0; then
+ uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ else
+ uefi_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
+ fi
+ fi
+}
+
+function miso_common_menuentry {
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ echo "memdisk mode boot for $vt_chosen_path"
+ echo ""
+ ventoy_debug_pause
+
+ if [ "$grub_platform" = "pc" ]; then
+ legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ else
+ uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ fi
+}
+
+
+function common_unsupport_menuentry {
+ echo -e "\n The name of the iso file could NOT contain space or non-ascii characters. \n"
+ echo -e " 文件名中不能有中文或空格 \n"
+ echo -e "\npress ENTER to exit (请按 回车 键返回) ..."
+ read vtInputKey
+}
+
+function miso_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+function iso_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+function wim_common_menuentry {
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ if vt_wim_check_bootable "${vtoy_iso_part}${vt_chosen_path}"; then
+ vt_wim_chain_data "${vtoy_iso_part}${vt_chosen_path}"
+ else
+ echo -e "\n This is NOT a bootable WIM file. \n"
+ echo -e " 这不是一个可启动的 WIM 文件。\n"
+ fi
+
+ ventoy_debug_pause
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ if [ "$grub_platform" = "pc" ]; then
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ else
+ ventoy_cli_console
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ ventoy_gui_console
+ fi
+ boot
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+function wim_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+function efi_common_menuentry {
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ vt_concat_efi_iso "${vtoy_iso_part}${vt_chosen_path}" vtoy_iso_buf
+
+ ventoy_debug_pause
+
+ ventoy_cli_console
+
+ unset vtoy_dotefi_retry
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi memdisk env_param=${env_param} dotefi isoefi=on ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
+ boot
+
+ if [ -n "$vtoy_dotefi_retry" ]; then
+ unset vtoy_dotefi_retry
+ chainloader "${vtoy_iso_part}${vt_chosen_path}"
+ boot
+ fi
+
+ ventoy_gui_console
+}
+
+function efi_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+function vhdboot_common_func {
+ vt_patch_vhdboot "$1"
+
+ ventoy_debug_pause
+
+ if [ -n "$vtoy_vhd_buf_addr" ]; then
+ if [ "$grub_platform" = "pc" ]; then
+ ventoy_cli_console
+ linux16 $vtoy_path/memdisk iso raw
+ initrd16 mem:${vtoy_vhd_buf_addr}:size:${vtoy_vhd_buf_size}
+ boot
+ ventoy_gui_console
+ else
+ ventoy_cli_console
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_vhd_buf_addr}:size:${vtoy_vhd_buf_size}
+ boot
+ ventoy_gui_console
+ fi
+ else
+ echo "Please put the right ventoy_vhdboot.img file to the 1st partition"
+ ventoy_pause
+ fi
+}
+
+function vhd_common_menuentry {
+
+ if [ "$VTOY_VHD_NO_WARNING" != "1" ]; then
+ if [ "$vtoy_iso_fs" != "ntfs" ]; then
+ echo -e "!!! WARNING !!!\n"
+ echo -e "\nPartition1 ($vtoy_iso_fs) is NOT ntfs, the VHD(x) file may not boot normally \n"
+ echo -e "\nVHD(x) 文件所在分区不是 ntfs 格式, 可能无法正常启动 \n\n"
+ echo -n "press ENTER to continue boot (请按 回车 键继续) ..."
+ read vtInputKey
+ fi
+ fi
+
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ vhdboot_common_func "${vt_chosen_path}"
+}
+
+function vhd_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+function vtoyboot_common_func {
+ set AltBootPart=0
+ set vtoysupport=0
+
+ vt_get_vtoy_type "${1}" vtoytype parttype AltBootPart
+
+ if vt_str_begin $vtoytype vhd; then
+ set vtoysupport=1
+ elif [ "$vtoytype" = "raw" ]; then
+ set vtoysupport=1
+ elif [ "$vtoytype" = "vdi" ]; then
+ set vtoysupport=1
+ fi
+
+ if [ $vtoysupport -eq 1 ]; then
+ if [ "$grub_platform" = "pc" ]; then
+ if [ "$parttype" = "gpt" -a $AltBootPart -eq 0 ]; then
+ echo "The OS in the vdisk was created in UEFI mode, but current is Legacy BIOS mode."
+ echo "虚拟磁盘内的系统是在UEFI模式下创建的,而当前系统是Legacy BIOS模式,可能无法正常启动。"
+ ventoy_pause
+ fi
+ else
+ if [ "$parttype" = "mbr" -a $AltBootPart -eq 0 ]; then
+ echo "The OS in the vdisk was created in Legacy BIOS mode, but current is UEFI mode."
+ echo "虚拟磁盘内的系统是在Legacy BIOS模式下创建的,而当前系统是UEFI模式,可能无法正常启动。"
+ ventoy_pause
+ fi
+ fi
+
+ vt_img_sector "${1}"
+ vt_raw_chain_data "${1}"
+
+ ventoy_debug_pause
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ if [ "$grub_platform" = "pc" ]; then
+ vt_acpi_param ${vtoy_chain_mem_addr} 512
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} bios80 sector512 mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ else
+ if vt_check_secureboot_var; then
+ vt_acpi_param ${vtoy_chain_mem_addr} 512
+ fi
+ ventoy_cli_console
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi sector512 env_param=${ventoy_env_param} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ ventoy_gui_console
+ fi
+ else
+ echo "chain empty failed!"
+ ventoy_pause
+ fi
+ else
+ echo "Unsupported vtoy type $vtoytype"
+ ventoy_pause
+ fi
+}
+
+function vtoy_common_menuentry {
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ vtoyboot_common_func "${vtoy_iso_part}${vt_chosen_path}"
+}
+
+function vtoy_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+#
+#============================================================#
+# IMG file boot process #
+#============================================================#
+#
+
+
+function ventoy_img_easyos {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ loopback easysfs (vtimghd,1)/easy.sfs
+ vt_get_lib_module_ver (easysfs) /lib/modules/ vt_module_ver
+
+ if [ -n "$vt_module_ver" ]; then
+ for mod in "kernel/drivers/md/dm-mod.ko" "kernel/drivers/dax/dax.ko"; do
+ vt_img_extra_initrd_append (easysfs)/lib/modules/$vt_module_ver/$mod
+ done
+ fi
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy
+ vt_img_hook_root
+
+ syslinux_configfile (vtimghd,1)/syslinux.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+ loopback -d easysfs
+}
+
+function ventoy_img_volumio {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy imgpart=/dev/ventoy2 bootpart=/dev/ventoy1
+ vt_img_hook_root
+
+ syslinux_configfile (vtimghd,1)/syslinux.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_openelec {
+ elec_ver=$1
+
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ loopback vtloopex $vtoy_efi_part/ventoy/vtloopex.cpio
+ vt_img_extra_initrd_append (vtloopex)/$elec_ver/vtloopex.tar.xz
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=$elec_ver
+ vt_img_hook_root
+
+ set root=(vtimghd,1)
+ syslinux_configfile (vtimghd,1)/syslinux.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+ loopback -d vtloopex
+}
+
+
+function ventoy_img_freedombox {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ vt_get_lib_module_ver (vtimghd,1) /lib/modules/ vt_module_ver
+ if [ -n "$vt_module_ver" ]; then
+ vt_img_extra_initrd_append (vtimghd,1)/lib/modules/$vt_module_ver/kernel/drivers/md/dm-mod.ko
+ fi
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=freedombox
+ vt_img_hook_root
+
+ configfile (vtimghd,1)/boot/grub/grub.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_paldo {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=paldo
+ vt_img_hook_root
+
+ vt_fs_enum_1st_file (vtimghd,1) /loader/entries/ vt_paldo_entry_conf
+ vt_file_basename $vt_paldo_entry_conf vtPaldoVer
+
+ echo loading file...
+ linux (vtimghd,1)/linux-${vtPaldoVer} root=/dev/ventoy1 rootfstype=vfat
+ initrd (vtimghd,1)/initramfs-${vtPaldoVer}
+ boot
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_ubos {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ vt_get_lib_module_ver (vtimghd,3) /lib/modules/ vt_module_ver
+ if [ -n "$vt_module_ver" ]; then
+ vt_img_extra_initrd_append (vtimghd,3)/lib/modules/$vt_module_ver/kernel/drivers/md/dm-mod.ko.xz
+ fi
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=ubos
+ vt_img_hook_root
+
+ echo loading file...
+ linux (vtimghd,2)/vmlinuz-linux root=/dev/ventoy3 rw
+ initrd (vtimghd,2)/initramfs-linux.img
+ boot
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_recalbox {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=recalbox
+ vt_img_hook_root
+
+ set root=(vtimghd,1)
+ configfile (vtimghd,1)/boot/grub/grub.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_batocera {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=batocera
+ vt_img_hook_root
+
+ set root=(vtimghd,1)
+ syslinux_configfile (vtimghd,1)/boot/syslinux/syslinux.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_openwrt {
+ if [ -e (vtimghd,2)/lib64 ]; then
+ set ventoy_busybox_ver=64
+ fi
+
+ if [ ! -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then
+ ventoy_gui_console
+ echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n"
+ echo -e " 未找到 ventoy_openwrt.xz 文件。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n"
+ echo -e "\n press ENTER to exit (请按 回车 键返回) ..."
+ read vtInputKey
+ ventoy_cli_console
+ return
+ fi
+
+ if vt_img_check_range "${vtoy_iso_part}${vt_chosen_path}"; then
+ ventoy_debug_pause
+ else
+ ventoy_gui_console
+ echo -e "\n IMG file need processed. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n"
+ echo -e " 此 IMG 文件必须处理之后才能支持。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n"
+ echo -e "\n press ENTER to exit (请按 回车 键返回) ..."
+ read vtInputKey
+ ventoy_cli_console
+ return
+ fi
+
+
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ vt_img_extra_initrd_append ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz
+
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=openwrt
+ vt_img_hook_root
+
+ set root=(vtimghd,1)
+ configfile (vtimghd,1)/boot/grub/grub.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_tails {
+ vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
+ vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
+
+ ventoy_debug_pause
+
+ #boot image file
+ vt_set_boot_opt rdinit=/vtoy/vtoy live-media=/dev/dm-1 ventoyos=tails
+ vt_img_hook_root
+
+ set root=(vtimghd,1)
+ configfile (vtimghd,1)/efi/debian/grub.cfg
+
+ vt_img_unhook_root
+ vt_unset_boot_opt
+}
+
+function ventoy_img_memtest86 {
+ chainloader (vtimghd,1)/efi/boot/BOOTX64.efi
+ boot
+}
+
+function img_unsupport_tip {
+ echo -e "\n This IMG file is NOT supported now. \n"
+ echo -e " 当前不支持启动此 IMG 文件 \n"
+ echo -e "\npress ENTER to exit (请按 回车 键返回) ..."
+ read vtInputKey
+}
+
+function img_common_menuentry {
+ set ventoy_compatible=YES
+ set ventoy_busybox_ver=32
+
+ vt_chosen_img_path vt_chosen_path vt_chosen_size
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ if [ -d (vtimghd)/ ]; then
+ loopback -d vtimghd
+ fi
+
+ loopback vtimghd "${vtoy_iso_part}${vt_chosen_path}"
+ vt_img_sector "${vtoy_iso_part}${vt_chosen_path}"
+
+ vt_img_part_info (vtimghd)
+
+ set vtback_root=$root
+ ventoy_cli_console
+ vt_push_last_entry
+ set vtback_theme=$theme
+ unset theme
+
+ vt_img_extra_initrd_reset
+
+
+ vt_get_fs_label (vtimghd,1) vtImgHd1Label
+ if [ -d (vtimghd,2)/lib ]; then
+ vt_get_fs_label (vtimghd,2) vtImgHd2Label
+ fi
+
+ if [ -e (vtimghd,1)/etc/hostname ]; then
+ vt_1st_line (vtimghd,1)/etc/hostname vtImgHostname
+ fi
+
+
+ if [ -e (vtimghd,1)/easy.sfs ]; then
+ ventoy_img_easyos
+ elif [ -e (vtimghd,1)/volumio.initrd ]; then
+ ventoy_img_volumio
+ elif vt_str_begin "$vtImgHd1Label" "LAKKA"; then
+ ventoy_img_openelec lakka
+ elif vt_str_begin "$vtImgHd1Label" "LIBREELEC"; then
+ ventoy_img_openelec LibreELEC
+ elif vt_str_begin "$vtImgHd1Label" "paldo-live"; then
+ ventoy_img_paldo
+ elif vt_str_begin "$vtImgHostname" "freedombox"; then
+ ventoy_img_freedombox
+ elif vt_str_begin "$vtImgHd1Label" "BATOCERA"; then
+ ventoy_img_batocera
+ elif vt_str_begin "$vtImgHd1Label" "Tails"; then
+ ventoy_img_tails
+ elif [ "$vtImgHd2Label" = "RECALBOX" ]; then
+ ventoy_img_recalbox
+ elif [ -f (vtimghd,2)/loader/entries/ubos.conf ]; then
+ ventoy_img_ubos
+ elif [ -f (vtimghd,2)/etc/openwrt_version ]; then
+ ventoy_img_openwrt
+ elif [ -f (vtimghd,1)/efi/boot/mt86.png ]; then
+ if [ "$grub_platform" = "pc" ]; then
+ img_unsupport_tip
+ else
+ ventoy_img_memtest86
+ fi
+ else
+ vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}"
+ ventoy_acpi_param ${vtoy_chain_mem_addr} 512
+ if [ "$grub_platform" = "pc" ]; then
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} sector512 mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ else
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi sector512 env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ fi
+ fi
+
+ set root=$vtback_root
+ vt_pop_last_entry
+ set theme=$vtback_theme
+ ventoy_gui_console
+ set ventoy_compatible=NO
+}
+
+function img_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+#############################################################