+
+ vt_unix_replace_ko $vt_unix_mod_path ${vtoy_path}/dragonfly.mfs.xz
+ vt_unix_fill_image_desc
+ vt_unix_gzip_new_ko
+ vt_unix_replace_conf DragonFly "${1}${chosen_path}"
+}
+
+function ventoy_unix_comm_proc {
+ vt_unix_reset
+
+ vt_unix_check_vlnk "${1}${chosen_path}"
+
+ if [ "$ventoy_compatible" = "NO" ]; then
+ loopback vtunix $vtoy_efi_part/ventoy/ventoy_unix.cpio
+
+ if [ "$vt_unix_type" = "FreeBSD" ]; then
+ ventoy_freebsd_proc "$1" "${chosen_path}"
+ elif [ "$vt_unix_type" = "DragonFly" ]; then
+ ventoy_dragonfly_proc "$1" "${chosen_path}"
+ elif [ "$vt_unix_type" = "NetBSD" ]; then
+ echo "NetBSD not supported"
+
+
+ else
+ if [ -n "${vtdebug_flag}" ]; then
+ echo "Unknown unix type"
+ fi
+ fi
+ fi
+
+ vt_unix_chain_data "${1}${chosen_path}"
+ ventoy_debug_pause
+}
+
+
+function uefi_windows_menu_func {
+ vt_windows_reset
+
+ unset vt_cur_wimboot_mode
+ if vt_check_mode 4 "$vt_chosen_name"; then
+ set vt_cur_wimboot_mode=1
+ fi
+
+ if [ "$ventoy_compatible" = "NO" -o "$vt_cur_wimboot_mode" = "1" ]; 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
+ fi
+
+ ventoy_debug_pause
+ locate_wim "${chosen_path}"
+ fi
+
+ vt_windows_chain_data "${1}${chosen_path}"
+ ventoy_debug_pause
+
+ if [ "$vt_cur_wimboot_mode" = "1" ]; then
+ vtoy_wimboot_func
+ fi
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
+ ventoy_cli_console
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} iso_${ventoy_fs_probe} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+function uefi_find_replace_initrd {
+ if vt_get_efi_vdisk_offset "${1}${2}" vt_efivdisk_offset; then
+ loopback -s $vt_efivdisk_offset vtefivdisk "${1}${2}"
+
+ unset vt_rp_initrd
+ vt_search_replace_initrd (vtefivdisk) vt_rp_initrd
+
+ if [ -n "$vt_rp_initrd" ]; then
+ vt_add_replace_file $3 "$vt_rp_initrd"
+ fi
+
+ loopback -d vtefivdisk
+ ventoy_debug_pause
+ fi
+}
+
+function uefi_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 file in "boot/grub/grub.cfg" "EFI/BOOT/grub.cfg" "EFI/boot/grub.cfg" "efi/boot/grub.cfg" "EFI/BOOT/BOOTX64.conf" "/grub/grub.cfg"; do
+ if [ -e (loop)/$file ]; then
+ vt_linux_parse_initrd_grub file (loop)/$file
+ fi
+ done
+ fi
+
+ # special process for special distros
+ if [ -d (loop)/loader/entries ]; then
+ vt_linux_parse_initrd_grub dir (loop)/loader/entries/
+ elif [ -d (loop)/boot/grub ]; then
+ vt_linux_parse_initrd_grub dir (loop)/boot/grub/
+ fi
+
+ distro_specify_initrd_file
+
+ vt_linux_initrd_count vtcount
+
+ if [ $vtcount -eq 0 ]; then
+ if [ -e (loop)/EFI/boot/livegrub.cfg ]; then
+ vt_linux_parse_initrd_grub file (loop)/EFI/boot/livegrub.cfg
+ fi
+ distro_specify_initrd_file_phase2
+
+ if [ "$vt_efi_dir" = "NO" ]; then
+ if [ -f (loop)/efi.img ]; then
+ vt_add_replace_file 0 "initrd"
+ fi
+ fi
+ fi
+
+ locate_initrd
+
+ if [ -d (loop)/loader/entries ]; then
+ vt_linux_get_main_initrd_index vtindex
+
+ if [ -d (loop)/arch ]; then
+ if [ -f (loop)/arch/boot/x86_64/archiso.img ]; then
+ vt_add_replace_file $vtindex "EFI\\archiso\\archiso.img"
+ elif [ -f (loop)/arch/boot/x86_64/initramfs-linux.img ]; then
+ vt_add_replace_file $vtindex "arch\\boot\\x86_64\\initramfs-linux.img"
+ elif [ -f (loop)/boot/initramfs_x86_64.img ]; then
+ vt_add_replace_file $vtindex "boot\\initramfs_x86_64.img"
+ fi
+ elif [ -d (loop)/blackarch ]; then
+ if [ -f (loop)/blackarch/boot/x86_64/archiso.img ]; then
+ vt_add_replace_file $vtindex "EFI\\archiso\\archiso.img"
+ elif [ -f (loop)/blackarch/boot/x86_64/initramfs-linux.img ]; then
+ vt_add_replace_file $vtindex "blackarch\\boot\\x86_64\\initramfs-linux.img"
+ fi
+ elif [ -d (loop)/anarchy ]; then
+ if [ -f (loop)/anarchy/boot/x86_64/initramfs-linux.img ]; then
+ vt_add_replace_file $vtindex "anarchy\\boot\\x86_64\\initramfs-linux.img"
+ fi
+ elif [ -d (loop)/parabola ]; then
+ if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
+ vt_add_replace_file $vtindex "EFI\\parabolaiso\\parabolaiso.img"
+ elif [ -f (loop)/parabola/boot/x86_64/initramfs-linux-libre.img ]; then
+ vt_add_replace_file $vtindex "parabola\\boot\\x86_64\\initramfs-linux-libre.img"
+ fi
+ elif [ -f (loop)/EFI/BOOT/initrd.gz ]; then
+ vt_add_replace_file $vtindex "EFI\\BOOT\\initrd.gz"
+ elif [ -f (loop)/loader/entries/thinstation.conf ]; then
+ vt_add_replace_file $vtindex "boot\\initrd"
+ elif [ -f (loop)/loader/entries/pisi-efi-x86_64.conf ]; then
+ vt_add_replace_file $vtindex "EFI\\pisi\\initrd.img"
+ fi
+
+ vt_get_replace_file_cnt vt_replace_cnt
+ if [ $vt_replace_cnt -eq 0 ]; then
+ uefi_find_replace_initrd "$1" "$2" $vtindex
+ fi
+ elif [ -d (loop)/EFI/boot/entries ]; then
+ if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
+ vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
+ elif [ -f (loop)/hyperbola/boot/x86_64/hyperiso.img ]; then
+ vt_add_replace_file 0 "EFI\\hyperiso\\hyperiso.img"
+ fi
+ elif [ -d (loop)/EFI/BOOT/entries ]; then
+ vt_linux_get_main_initrd_index vtindex
+
+ if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
+ vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
+ elif [ -f (loop)/parabola/boot/x86_64/initramfs-linux-libre.img ]; then
+ vt_add_replace_file $vtindex "parabola\\boot\\x86_64\\initramfs-linux-libre.img"
+ fi
+ elif [ -e (loop)/syslinux/alt0/full.cz ]; then
+ vt_add_replace_file 0 "EFI\\BOOT\\full.cz"
+ set FirstTryBootFile='@EFI@BOOT@grubx64.efi'
+
+ elif vt_str_begin "$vt_volume_id" "SolusLive"; then
+ vt_add_replace_file 0 "initrd"
+
+ fi
+
+ fi
+
+ vt_linux_chain_data "${1}${chosen_path}"
+
+ if [ -n "$LoadIsoEfiDriver" -a $vt_chosen_size -LT 104857600 ]; then
+ if [ -f (loop)/efi/clover/cloverx64.efi ]; then
+ unset LoadIsoEfiDriver
+ fi
+ fi
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
+ ventoy_cli_console
+
+ unset vtGrub2Mode
+ if vt_check_mode 3 "$vt_chosen_name"; then
+ set vtGrub2Mode=1
+ elif vt_str_begin "$vt_volume_id" "HOLO_"; then
+ if [ -d (loop)/loader/entries ]; then
+ set vtGrub2Mode=1
+ fi
+ elif vt_str_begin "$vt_volume_id" "KRD"; then
+ if [ -f (loop)/boot/grub/grub.cfg.sig ]; then
+ set vtGrub2Mode=1
+ fi
+ fi
+
+ if [ -n "$vtGrub2Mode" ]; then
+ ventoy_debug_pause
+ else
+ if [ "$VTOY_EFI_ARCH" != "mips" ]; then
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi fallback env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ fi
+ fi
+
+ # 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
+ if [ $vtback_cfg_find -eq 0 ]; then
+ if [ -f (loop)/loader/loader.conf -a -d (loop)/loader/entries ]; then
+ if vt_str_begin "$vt_volume_id" "HOLO_"; then
+ set root=(loop,2)
+ vt_systemd_menu (loop,2) vt_sys_menu_mem
+ else
+ vt_systemd_menu (loop) vt_sys_menu_mem
+ fi
+ set vtback_cfg_find=1
+ configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}"
+ fi
+ fi
+
+ if [ "$vtback_cfg_find" = "0" ]; then
+ echo " "
+ echo "No bootfile found for UEFI!"
+ echo "Maybe the image does not support $VTOY_EFI_ARCH UEFI"
+ echo " "
+ sleep 30
+ fi
+
+ vt_unset_boot_opt
+ set root=$vtback_root
+ set theme=$vtback_theme
+ vt_pop_last_entry
+ ventoy_gui_console
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+function uefi_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
+ ventoy_cli_console
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ boot
+ else
+ echo "chain empty failed"
+ ventoy_pause
+ fi
+}
+
+function ventoy_reset_nojoliet {
+ if vt_str_begin "$vt_volume_id" "ARCARESCUE"; then
+ vt_iso9660_nojoliet 1
+ else
+ vt_iso9660_nojoliet 0
+ fi
+
+ vt_append_extra_sector 0
+}
+
+function uefi_iso_menu_func {
+
+ if [ -d (loop)/ ]; then
+ loopback -d loop
+ fi
+
+ if [ -n "$vtisouefi" ]; then
+ set LoadIsoEfiDriver=on
+ unset vtisouefi
+ elif vt_check_mode 2 "$vt_chosen_name"; then
+ set LoadIsoEfiDriver=on
+ else
+ unset LoadIsoEfiDriver
+ 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
+
+ # Lenovo EasyStartup need an addional sector for boundary check
+ if vt_str_begin "$vt_volume_id" "EasyStartup"; then
+ vt_skip_svd "${vtoy_iso_part}${vt_chosen_path}"
+ vt_append_extra_sector 1
+ fi
+ fi
+
+ loopback loop "${1}${chosen_path}"
+ get_os_type (loop)
+
+ if [ -d (loop)/EFI ]; then
+ set vt_efi_dir=YES
+ elif [ -d (loop)/efi ]; then
+ set vt_efi_dir=YES
+ else
+ set vt_efi_dir=NO
+ fi
+
+ if [ -n "$vtcompat" ]; then
+ set ventoy_compatible=YES
+ unset vtcompat
+ elif vt_check_mode 1 "$vt_chosen_name"; then
+ set ventoy_compatible=YES
+ else
+ vt_check_compatible (loop)
+ fi
+
+ if vt_need_secondary_menu "$vt_chosen_name"; then
+ vt_show_secondary_menu "$vt_chosen_path" "$vtoy_os" $vt_chosen_size
+ if vt_check_mode 0 "$vt_chosen_name"; then
+ uefi_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ vt_secondary_recover_mode
+ return
+ fi
+ 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)
+ uefi_windows_menu_func "$1" "${chosen_path}"
+ elif [ "$vtoy_os" = "Unix" ]; then
+ uefi_unix_menu_func "$1" "${chosen_path}"
+ else
+ vt_check_compatible_linux (loop)
+ uefi_linux_menu_func "$1" "${chosen_path}"
+ fi
+
+ ventoy_gui_console
+ vt_secondary_recover_mode
+}
+
+function uefi_iso_memdisk {
+ echo 'Loading ISO file to memory ...'
+ vt_load_img_memdisk "${1}${2}" vtoy_iso_buf
+
+ ventoy_cli_console
+ chainloader ${vtoy_path}/ventoy_${VTOY_EFI_ARCH}.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
+ boot
+
+ ventoy_gui_console
+}
+
+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
+ 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 vt_wimkernel=$vt_wimkernel
+ fi
+
+ vt_windows_wimboot_data "$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe vtoy_wim_bit
+
+ if [ "$grub_platform" = "pc" ]; then
+ linux16 "$vtoy_path/$vt_wimkernel" quiet
+ ventoy_debug_pause
+
+ vt_set_wim_load_prompt 1 "Loading files......"
+ 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
+ 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
+
+ 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=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" \
+ pfsize=$vtoy_chain_file_size \
+ pfread=$vtoy_chain_file_read
+ boot
+ ventoy_gui_console
+ fi
+}
+
+function vtoy_winpe_wimboot {
+ unset vtoy_boot_sdi_legacy
+ unset vtoy_boot_sdi_efi
+
+ set vtoy_wimboot_prefix=(loop)
+ set vtoy_wim_path="$1"
+
+ if [ -n "${vtdebug_flag}" ]; then
+ echo "winpe_wimboot $1 $2 $3"
+ fi
+
+ if [ "$2" != "0" ]; then
+ set vtoy_boot_sdi_legacy="newc:boot.sdi:$vtoy_wimboot_prefix/$2"
+ set vtoy_boot_sdi_efi="vf=boot.sdi:$vtoy_wimboot_prefix/$2"
+ fi
+
+ vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe vtoy_wim_bit
+
+ 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} \
+ newc:vtoy_wimboot:$vtoy_path/$vt_wimkernel \
+ newc:bootmgr.exe:mem:${vtoy_pe_bootmgr_mem_addr}:size:${vtoy_pe_bootmgr_mem_size} \
+ newc:bcd:mem:${vtoy_pe_bcd_mem_addr}:size:${vtoy_pe_bcd_mem_size} \
+ $vtoy_boot_sdi_legacy \
+ newc:boot.wim:$vtoy_wimboot_prefix/$vtoy_wim_path
+ vt_set_wim_load_prompt 0
+ boot
+ else
+ if [ "$VTOY_EFI_ARCH" = "x64" -a "$vtoy_wim_bit" = "32" ]; then
+ echo -e "\nThis is 32bit Windows and does NOT support x86_64 UEFI firmware.\n"
+ echo -e "这是32位的 Windows 系统,不支持当前的64位 UEFI 环境。\n"
+ fi
+
+ 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
+
+ unset vtoy_boot_efi_path
+ if [ -F (loop)/efi/boot/boot${VTOY_EFI_ARCH}.efi ]; then
+ set vtoy_boot_efi_path="vf=bootx64.efi:(loop)/efi/boot/boot${VTOY_EFI_ARCH}.efi"
+ fi
+
+ 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_path/$vt_wimkernel" \
+ "vf=bcd:mem:${vtoy_pe_bcd_mem_addr}:size:${vtoy_pe_bcd_mem_size}" \
+ "$vtoy_boot_sdi_efi" \
+ "$vtoy_boot_efi_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 {
+ 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
+ fi
+
+ if vt_is_standard_winiso (loop); then
+ echo -e "\n==================== VENTOY WIMBOOT ==================\n"
+ vtoy_windows_wimboot
+ else
+ vt_sel_winpe_wim (loop)
+ if [ -n "$vtoy_pe_wim_path" ]; then
+ echo -e "\n==================== VENTOY WIMBOOT ==================\n"
+
+ vt_fs_ignore_case 1
+ vt_load_file_to_mem "auto" $vtoy_path/common_bcd.xz vtoy_pe_bcd_mem
+
+ set vt_sdi_path=0
+ for vsdi in "boot/boot.sdi" "2K10/FONTS/boot.sdi" "SSTR/boot.sdi" "ISPE/BOOT.SDI" \
+ "boot/uqi.sdi" "ISYL/boot.sdi" "WEPE/WEPE.SDI" ; do
+ if [ -F "(loop)/$vsdi" ]; then
+ set vt_sdi_path=$vsdi
+ break
+ fi
+ done
+
+ if [ "$grub_platform" = "pc" ]; then
+ vt_load_file_to_mem "auto" $vtoy_path/common_bootmgr.xz vtoy_pe_bootmgr_mem
+ vtoy_winpe_wimboot "$vtoy_pe_wim_path" "$vt_sdi_path" 1
+ else
+ vtoy_winpe_wimboot "$vtoy_pe_wim_path" "$vt_sdi_path" 0
+ fi
+
+ vt_fs_ignore_case 0
+ fi
+ fi
+}
+
+function legacy_windows_menu_func {
+ vt_windows_reset
+
+ unset vt_cur_wimboot_mode
+ if vt_check_mode 4 "$vt_chosen_name"; then
+ set vt_cur_wimboot_mode=1
+ fi
+
+ if [ "$ventoy_compatible" = "NO" -o "$vt_cur_wimboot_mode" = "1" ]; 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
+ if [ -z "$vt_cur_wimboot_mode" ]; then
+ locate_wim "${chosen_path}"
+ fi
+ fi
+
+ vt_windows_chain_data "${1}${chosen_path}"
+ ventoy_debug_pause
+
+ if [ "$vt_cur_wimboot_mode" = "1" ]; then
+ vtoy_wimboot_func
+ fi
+
+ if [ -n "$vtoy_chain_mem_addr" ]; then
+ ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
+ if [ "$ventoy_compatible" = "NO" ]; then
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ else
+ linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} ibft mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
+ fi
+ 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
+
+
+ if vt_syslinux_need_nojoliet "$1$2"; then
+ vt_iso9660_nojoliet 1
+ loopback -d loop
+ 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
+ unset vtGrub2Mode
+ if vt_check_mode 3 "$vt_chosen_name"; then
+ set vtGrub2Mode=1
+ elif vt_str_begin "$vt_volume_id" "HOLO_"; then
+ if [ -d (loop)/loader/entries ]; then
+ set vtGrub2Mode=1
+ fi
+ fi
+
+ if [ -n "$vtGrub2Mode" ]; 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
+ if [ $vtback_cfg_find -eq 0 ]; then
+ if [ -f (loop)/loader/loader.conf -a -d (loop)/loader/entries ]; then
+ if vt_str_begin "$vt_volume_id" "HOLO_"; then
+ set root=(loop,2)
+ vt_systemd_menu (loop,2) vt_sys_menu_mem
+ else
+ vt_systemd_menu (loop) vt_sys_menu_mem
+ fi
+ set vtback_cfg_find=1
+ configfile "mem:${vt_sys_menu_mem_addr}:size:${vt_sys_menu_mem_size}"
+ fi
+ fi
+
+ 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 "$vt_chosen_name"; then
+ set ventoy_compatible=YES
+ else
+ vt_check_compatible (loop)
+ fi
+
+ if vt_need_secondary_menu "$vt_chosen_name"; then
+ vt_show_secondary_menu "$vt_chosen_path" "$vtoy_os" $vt_chosen_size
+ if vt_check_mode 0 "$vt_chosen_name"; then
+ legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ vt_secondary_recover_mode
+ return
+ fi
+ 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
+ vt_check_compatible_linux (loop)
+ legacy_linux_menu_func "$1" "${chosen_path}"
+ fi
+ vt_secondary_recover_mode
+}
+
+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_chosen_name
+
+ 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 continue (请按 回车 键继续) ..."
+ read vtInputKey
+ 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
+
+
+ # auto memdisk mode for some special ISO files
+ vt_iso_vd_id_parse "${vtoy_iso_part}${vt_chosen_path}"
+ unset vtMemDiskBoot
+ if vt_check_mode 0 "$vt_chosen_name"; then
+ set vtMemDiskBoot=1
+ else
+ if [ "$grub_platform" = "pc" ]; then
+ if vt_iso_vd_id_begin 1 0 "Memtest86+"; then
+ set vtMemDiskBoot=1
+ elif vt_iso_vd_id_begin 0 1 "KolibriOS"; then
+ set vtMemDiskBoot=1
+ fi
+ fi
+
+ #For iKuai8 (<64MB)
+ if [ $vt_chosen_size -LE 67108864 ]; then
+ if vt_str_begin "$vt_chosen_name" "iKuai"; then
+ set vtMemDiskBoot=1
+ fi
+ fi
+ fi
+ vt_iso_vd_id_clear
+
+
+ if [ "$grub_platform" = "pc" ]; then
+ if [ -n "$vtMemDiskBoot" ]; then
+ legacy_iso_memdisk $vtoy_iso_part "$vt_chosen_path"
+ else
+ legacy_iso_menu_func $vtoy_iso_part "$vt_chosen_path"
+ fi
+ else
+ if [ -n "$vtMemDiskBoot" ]; 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 vt_chosen_name
+
+ 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 vt_chosen_name
+
+ 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 vt_chosen_name
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ unset vt_vlnk_dst
+ if vt_is_vlnk_name "${vt_chosen_path}"; then
+ vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
+ if [ -z "$vt_vlnk_dst" ]; then
+ echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"
+ ventoy_pause
+ return
+ fi
+ else
+ vt_vlnk_dst="${vtoy_iso_part}${vt_chosen_path}"
+ fi
+
+ ventoy_debug_pause
+
+ ventoy_cli_console
+
+ #first try with chainload
+ set vtOldRoot=$root
+ set root=$vtoy_iso_part
+ chainloader "${vt_vlnk_dst}"
+ boot
+
+ #retry with isoboot
+ set root=$vtOldRoot
+ vt_concat_efi_iso "${vt_vlnk_dst}" vtoy_iso_buf
+ 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
+
+ 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 {
+ vt_chosen_img_path vt_chosen_path vt_chosen_size vt_chosen_name
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ unset vt_vlnk_dst
+ if vt_is_vlnk_name "${vt_chosen_path}"; then
+ vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
+ if [ -z "$vt_vlnk_dst" ]; then
+ echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"
+ ventoy_pause
+ return
+ fi
+ else
+ vt_vlnk_dst="${vt_chosen_path}"
+ 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
+ fi
+
+ vhdboot_common_func "${vt_vlnk_dst}"
+}
+
+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 vt_chosen_name
+
+ if vt_check_password "${vt_chosen_path}"; then
+ return
+ fi
+
+ if ventoy_vcfg_proc "${vt_chosen_path}"; then
+ return
+ fi
+
+ unset vt_vlnk_dst
+ if vt_is_vlnk_name "${vt_chosen_path}"; then
+ vt_get_vlnk_dst "${vtoy_iso_part}${vt_chosen_path}" vt_vlnk_dst
+ if [ -z "$vt_vlnk_dst" ]; then
+ echo -e "\n### VLNK FILE NOT FOUND ###\n### VLNK 文件不存在 ###\n"
+ ventoy_pause
+ return
+ fi
+ else
+ vt_vlnk_dst="${vtoy_iso_part}${vt_chosen_path}"
+ fi
+
+ vtoyboot_common_func "${vt_vlnk_dst}"
+}
+
+function vtoy_unsupport_menuentry {
+ common_unsupport_menuentry
+}
+
+#
+#============================================================#
+# IMG file boot process #
+#============================================================#
+#
+
+function only_uefi_tip {
+ echo -e "\n This IMG file is only supported in UEFI mode. \n"
+ echo -e "\n press ENTER to exit ..."
+ read vtInputKey
+}
+
+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
+ if [ -e (easysfs)/lib/modules/$vt_module_ver/$mod ]; then
+ vt_img_extra_initrd_append (easysfs)/lib/modules/$vt_module_ver/$mod
+ fi
+ 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