https://busybox.net/downloads/binaries/1.31.0-i686-uclibc/ busybox_ASH
SHA-256: 2943f02f85fee0c9551aec47110a558a73f919c032b3c51e56d6f197b5ec4d7b
+5.12 7za.exe
+ download from https://www.7-zip.org/a/7z1900-extra.7z
+ ISNTALL/ventoy/7z/64/7za.exe SHA-256: 8117e40ee7f824f63373a4f5625bb62749f69159d0c449b3ce2f35aad3b83549
+ ISNTALL/ventoy/7z/32/7za.exe SHA-256: ea308c76a2f927b160a143d94072b0dce232e04b751f0c6432a94e05164e716d
+
+
+
grub_err_t
grub_env_context_open (void)
{
- return grub_env_new_context (1);
+ return grub_env_new_context (grub_env_get("ventoy_new_context") ? 0 : 1);
}
int grub_extractor_level = 0;
}
break;
case GRUB_TERM_KEY_F6:
- cmdstr = grub_env_get("VTOY_F6_CMD");
- if (cmdstr)
- {
- menu_fini ();
- grub_script_execute_sourcecode(cmdstr);
- goto refresh;
+ if (0 == g_ventoy_fn_mutex) {
+ cmdstr = grub_env_get("VTOY_F6_CMD");
+ if (cmdstr)
+ {
+ menu_fini ();
+ g_ventoy_fn_mutex = 1;
+ grub_script_execute_sourcecode(cmdstr);
+ g_ventoy_fn_mutex = 0;
+ goto refresh;
+ }
}
break;
case GRUB_TERM_KEY_F7:
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s variable\n", cmd_raw_name);
}
- isopath = grub_env_get("iso_path");
+ isopath = grub_env_get("vtoy_iso_part");
if (!isopath)
{
debug("isopath is null %p\n", isopath);
char buf[64];
grub_env_set("vtdebug_flag", "");
- grub_env_export("vtdebug_flag");
-
-
g_tree_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
g_list_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
struct menu_class *next;
}menu_class;
+typedef struct injection_config
+{
+ int pathlen;
+ char isopath[256];
+ char archive[256];
+
+ struct injection_config *next;
+}injection_config;
+
extern int g_ventoy_menu_esc;
extern int g_ventoy_suppress_esc;
extern int g_ventoy_last_entry;
void ventoy_plugin_dump_auto_install(void);
int ventoy_fill_windows_rtdata(void *buf, char *isopath);
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
+const char * ventoy_plugin_get_injection(const char *isopath);
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
const char * ventoy_plugin_get_menu_class(int type, const char *name);
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
char *template_file = NULL;
char *template_buf = NULL;
char *persistent_buf = NULL;
+ char *injection_buf = NULL;
+ const char *injection_file = NULL;
grub_uint8_t *buf = NULL;
grub_uint32_t mod;
grub_uint32_t headlen;
grub_uint32_t img_chunk_size;
grub_uint32_t template_size = 0;
grub_uint32_t persistent_size = 0;
+ grub_uint32_t injection_size = 0;
grub_file_t file;
- grub_file_t scriptfile;
+ grub_file_t tmpfile;
ventoy_img_chunk_list chunk_list;
(void)ctxt;
if (template_file)
{
debug("auto install template: <%s>\n", template_file);
- scriptfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], template_file);
- if (scriptfile)
+ tmpfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], template_file);
+ if (tmpfile)
{
- debug("auto install script size %d\n", (int)scriptfile->size);
- template_size = scriptfile->size;
+ debug("auto install script size %d\n", (int)tmpfile->size);
+ template_size = tmpfile->size;
template_buf = grub_malloc(template_size);
if (template_buf)
{
- grub_file_read(scriptfile, template_buf, template_size);
+ grub_file_read(tmpfile, template_buf, template_size);
}
- grub_file_close(scriptfile);
+ grub_file_close(tmpfile);
}
else
{
debug("auto install script skipped or not configed %s\n", args[1]);
}
- g_ventoy_cpio_buf = grub_malloc(file->size + 4096 + template_size + persistent_size + img_chunk_size);
+ injection_file = ventoy_plugin_get_injection(args[1]);
+ if (injection_file)
+ {
+ debug("injection archive: <%s>\n", injection_file);
+ tmpfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], injection_file);
+ if (tmpfile)
+ {
+ debug("injection archive size:%d\n", (int)tmpfile->size);
+ injection_size = tmpfile->size;
+ injection_buf = grub_malloc(injection_size);
+ if (injection_buf)
+ {
+ grub_file_read(tmpfile, injection_buf, injection_size);
+ }
+
+ grub_file_close(tmpfile);
+ }
+ else
+ {
+ debug("Failed to open injection archive %s%s\n", args[2], injection_file);
+ }
+ }
+ else
+ {
+ debug("injection not configed %s\n", args[1]);
+ }
+
+ g_ventoy_cpio_buf = grub_malloc(file->size + 4096 + template_size + persistent_size + injection_size + img_chunk_size);
if (NULL == g_ventoy_cpio_buf)
{
grub_file_close(file);
persistent_buf = NULL;
}
+ if (injection_size > 0 && injection_buf)
+ {
+ headlen = ventoy_cpio_newc_fill_head(buf, injection_size, injection_buf, "ventoy/ventoy_injection");
+ buf += headlen + ventoy_align(injection_size, 4);
+
+ grub_free(injection_buf);
+ injection_buf = NULL;
+ }
+
/* step2: insert os param to cpio */
headlen = ventoy_cpio_newc_fill_head(buf, 0, NULL, "ventoy/ventoy_os_param");
padlen = sizeof(ventoy_os_param);
static persistence_config *g_persistence_head = NULL;
static menu_alias *g_menu_alias_head = NULL;
static menu_class *g_menu_class_head = NULL;
+static injection_config *g_injection_head = NULL;
static int ventoy_plugin_control_check(VTOY_JSON *json, const char *isodisk)
{
return 0;
}
+
+static int ventoy_plugin_injection_check(VTOY_JSON *json, const char *isodisk)
+{
+ const char *path = NULL;
+ const char *archive = NULL;
+ VTOY_JSON *pNode = NULL;
+
+ (void)isodisk;
+
+ if (json->enDataType != JSON_TYPE_ARRAY)
+ {
+ grub_printf("Not array %d\n", json->enDataType);
+ return 0;
+ }
+
+ for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
+ {
+ path = vtoy_json_get_string_ex(pNode->pstChild, "image");
+ if (!path)
+ {
+ grub_printf("image not found\n");
+ continue;
+ }
+
+ archive = vtoy_json_get_string_ex(pNode->pstChild, "archive");
+ if (!archive)
+ {
+ grub_printf("archive not found\n");
+ continue;
+ }
+
+ grub_printf("image: <%s> [%s]\n", path, ventoy_check_file_exist("%s%s", isodisk, path) ? "OK" : "NOT EXIST");
+ grub_printf("archive: <%s> [%s]\n\n", archive, ventoy_check_file_exist("%s%s", isodisk, archive) ? "OK" : "NOT EXIST");
+ }
+
+ return 0;
+}
+
+static int ventoy_plugin_injection_entry(VTOY_JSON *json, const char *isodisk)
+{
+ const char *path = NULL;
+ const char *archive = NULL;
+ VTOY_JSON *pNode = NULL;
+ injection_config *node = NULL;
+ injection_config *next = NULL;
+
+ (void)isodisk;
+
+ if (json->enDataType != JSON_TYPE_ARRAY)
+ {
+ debug("Not array %d\n", json->enDataType);
+ return 0;
+ }
+
+ if (g_injection_head)
+ {
+ for (node = g_injection_head; node; node = next)
+ {
+ next = node->next;
+ grub_free(node);
+ }
+
+ g_injection_head = NULL;
+ }
+
+ for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
+ {
+ path = vtoy_json_get_string_ex(pNode->pstChild, "image");
+ archive = vtoy_json_get_string_ex(pNode->pstChild, "archive");
+ if (path && path[0] == '/' && archive && archive[0] == '/')
+ {
+ node = grub_zalloc(sizeof(injection_config));
+ if (node)
+ {
+ node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", path);
+ grub_snprintf(node->archive, sizeof(node->archive), "%s", archive);
+
+ if (g_injection_head)
+ {
+ node->next = g_injection_head;
+ }
+
+ g_injection_head = node;
+ }
+ }
+ }
+
+ return 0;
+}
+
static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk)
{
int type;
{ "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check },
{ "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check },
{ "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check },
+ { "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check },
};
static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
return rc;
}
+const char * ventoy_plugin_get_injection(const char *isopath)
+{
+ injection_config *node = NULL;
+ int len = (int)grub_strlen(isopath);
+
+ for (node = g_injection_head; node; node = node->next)
+ {
+ if (node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0)
+ {
+ return node->archive;
+ }
+ }
+
+ return NULL;
+}
+
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath)
{
menu_alias *node = NULL;
{
debug("auto install script skipped or not configed %s\n", pos);
}
+
+ script = (char *)ventoy_plugin_get_injection(pos);
+ if (script)
+ {
+ debug("injection archive <%s>\n", script);
+ grub_snprintf(data->injection_archive, sizeof(data->injection_archive) - 1, "%s", script);
+ }
+ else
+ {
+ debug("injection archive not configed %s\n", pos);
+ }
return 0;
}
typedef struct ventoy_windows_data
{
char auto_install_script[384];
- grub_uint8_t reserved[128];
+ char injection_archive[384];
+ grub_uint8_t reserved[256];
}ventoy_windows_data;
all_extra_modules="elf macho offsetio regexp file"
if [ "$1" = "uefi" ]; then
- all_modules="$net_modules_uefi $all_modules_uefi $all_extra_modules"
+ all_modules="$net_modules_uefi $all_modules_uefi $all_extra_modules "
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/EFI/BOOT/grubx64_real.efi" --format 'x86_64-efi' --compression 'auto' $all_modules_uefi 'fat' 'part_msdos'
else
- all_modules="$net_modules_legacy $all_modules_legacy"
+ all_modules="$net_modules_legacy $all_modules_legacy "
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/grub/i386-pc/core.img" --format 'i386-pc' --compression 'auto' $all_modules_legacy 'fat' 'part_msdos' 'biosdisk'
fi
cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/core.efi $VT_DIR/GRUB2/NBP/core.efi || exit 1
rm -f $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod
- cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/normal.mod $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod || exit 1
+ cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/normal.mod $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod || exit 1
+
+ #copy other modules
+ ls -1 $VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi/ | egrep '\.(lst|mod)$' | while read line; do
+ if ! echo $all_modules | grep -q "${line%.mod} "; then
+ echo "Copy $line ..."
+ rm -f $VT_DIR/INSTALL/grub/x86_64-efi/$line
+ cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi/$line $VT_DIR/INSTALL/grub/x86_64-efi/
+ fi
+ done
else
rm -f $VT_DIR/GRUB2/NBP/core.0
cp -a $VT_DIR/GRUB2/PXE/grub2/i386-pc/core.0 $VT_DIR/GRUB2/NBP/core.0 || exit 1
- for md in $all_extra_modules; do
- rm -f $VT_DIR/INSTALL/grub/i386-pc/${md}.mod
- cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/${md}.mod $VT_DIR/INSTALL/grub/i386-pc/
- done
-
rm -f $VT_DIR/INSTALL/grub/i386-pc/boot.img
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/boot.img $VT_DIR/INSTALL/grub/i386-pc/boot.img || exit 1
+
+ #copy other modules
+ ls -1 $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/ | egrep '\.(lst|mod)$' | while read line; do
+ if ! echo $all_modules | grep -q "${line%.mod} "; then
+ echo "Copy $line ..."
+ rm -f $VT_DIR/INSTALL/grub/i386-pc/$line
+ cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/$line $VT_DIR/INSTALL/grub/i386-pc/
+ fi
+ done
fi
--- /dev/null
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished; then
+ exit 0
+fi
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+ vtlog "ventoy disk not found"
+ PATH=$VTPATH_OLD
+ exit 0
+fi
+
+
+vtoydm -i -f $VTOY_PATH/ventoy_image_map -d $vtdiskname > $VTOY_PATH/iso_file_list
+
+vtline=$(grep '[-][-] drivers-.*\.squashfs' $VTOY_PATH/iso_file_list)
+sector=$(echo $vtline | awk '{print $(NF-1)}')
+length=$(echo $vtline | awk '{print $NF}')
+
+vtoydm -e -f $VTOY_PATH/ventoy_image_map -d $vtdiskname -s $sector -l $length -o $VTOY_PATH/driver.squashfs
+mount -t squashfs $VTOY_PATH/driver.squashfs /lib/modules
+modprobe dm-mod
+
+umount /lib/modules
+rm -f $VTOY_PATH/driver.squashfs
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
+blkdev_dev=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
+vtDM=$(ventoy_find_dm_id ${blkdev_num})
+
+if ! [ -b /dev/$vtDM ]; then
+ mknod -m 0660 /dev/$vtDM b $blkdev_dev
+fi
+
+if mount /dev/$vtDM /media/ydfs; then
+ vtlog "mount success"
+else
+ vtlog "mount failed"
+fi
+
+PATH=$VTPATH_OLD
+
+set_ventoy_hook_finish
--- /dev/null
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+#************************************************************************************
+
+$SED "s#/busybox/bin/sleep 2#/busybox/bin/sleep 10#" -i /etc/init.d/tty1
+$SED "/install *-d *.media.ydfs/a return" -i /ydfs/detect/media
+$SED "/install *-d *.media.ydfs/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/linuxconsole-disk.sh" -i /ydfs/detect/media
+
if $GREP -q 'device-mapper' /proc/devices; then
vtlog "device mapper module is loaded"
else
- vtlog"device mapper module is NOT loaded, now load it..."
+ vtlog "device mapper module is NOT loaded, now load it..."
VER=$($BUSYBOX_PATH/uname -r)
KO=$($FIND /lib/modules/$VER/kernel/drivers/md -name "dm-mod*")
echo 'porteus'; return
fi
+ if $GREP -q 'linuxconsole' /proc/version; then
+ echo 'linuxconsole'; return
+ fi
+
echo 'default'
}
--- /dev/null
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+while [ -n "1" ]; do
+ if [ -e /dev/null ]; then
+ break
+ else
+ $SLEEP 0.5
+ fi
+done
+
+while [ -n "1" ]; do
+ if [ -e /sys/block ]; then
+ break
+ else
+ $SLEEP 0.5
+ fi
+done
+
+while [ -n "Y" ]; do
+ vtdiskname=$(get_ventoy_disk_name)
+ if [ "$vtdiskname" != "unknown" ]; then
+ break
+ else
+ $SLEEP 0.5
+ fi
+done
+
+vtshortdev=${vtdiskname#/dev/}
+
+if ! [ -b $vtdiskname ]; then
+ blkdev=$($CAT /sys/class/block/$vtshortdev/dev | $SED 's/:/ /g')
+ $BUSYBOX_PATH/mknod -m 0660 $vtdiskname b $blkdev
+fi
+
+if ! [ -b "${vtdiskname}2" ]; then
+ blkdev=$($CAT /sys/class/block/${vtshortdev}2/dev | $SED 's/:/ /g')
+ $BUSYBOX_PATH/mknod -m 0660 "${vtdiskname}2" b $blkdev
+fi
+
+$BUSYBOX_PATH/ls /dev/ > /dev/console
+
+$BUSYBOX_PATH/sh $VTOY_PATH/hook/vine/udev_disk_hook.sh "${vtdiskname#/dev/}2"
+
+
--- /dev/null
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+vtCheatLoop=loop6
+
+ventoy_os_install_dmsetup() {
+ vtlog "ventoy_os_install_dmsetup $1"
+
+ vt_usb_disk=$1
+
+ # dump iso file location
+ $VTOY_PATH/tool/vtoydm -i -f $VTOY_PATH/ventoy_image_map -d ${vt_usb_disk} > $VTOY_PATH/iso_file_list
+
+ # install dmsetup
+ LINE=$($GREP 'kernel-[0-9].*\.rpm' $VTOY_PATH/iso_file_list)
+ if [ $? -eq 0 ]; then
+ install_rpm_from_line "$LINE" ${vt_usb_disk}
+ fi
+
+ $BUSYBOX_PATH/modprobe dm-mod
+
+ vtlog "dmsetup install finish, now check it..."
+
+ dmsetup_path=/ventoy/tool/dmsetup
+ if [ -z "$dmsetup_path" ]; then
+ vterr "dmsetup still not found after install"
+ elif $dmsetup_path info >> $VTLOG 2>&1; then
+ vtlog "$dmsetup_path work ok"
+ else
+ vterr "$dmsetup_path not work"
+ fi
+}
+
+
+if is_ventoy_hook_finished || not_ventoy_disk "${1:0:-1}"; then
+ # /dev/vtCheatLoop come first
+ if [ "$1" = "$vtCheatLoop" ] && [ -b $VTOY_DM_PATH ]; then
+ ventoy_copy_device_mapper /dev/$vtCheatLoop
+ fi
+ exit 0
+fi
+
+ventoy_os_install_dmsetup "/dev/${1:0:-1}"
+
+ventoy_udev_disk_common_hook $* "noreplace"
+
+$BUSYBOX_PATH/mount $VTOY_DM_PATH /mnt/ventoy
+
+#
+# We do a trick for rhel6 series here.
+# Use /dev/$vtCheatLoop and wapper it as a removable cdrom with bind mount.
+# Then the anaconda installer will accept /dev/$vtCheatLoop as the install medium.
+#
+ventoy_copy_device_mapper /dev/$vtCheatLoop
+
+$BUSYBOX_PATH/cp -a /sys/devices/virtual/block/$vtCheatLoop /tmp/ >> $VTLOG 2>&1
+echo 19 > /tmp/$vtCheatLoop/capability
+$BUSYBOX_PATH/mount --bind /tmp/$vtCheatLoop /sys/block/$vtCheatLoop >> $VTLOG 2>&1
+
+# OK finish
+set_ventoy_hook_finish
--- /dev/null
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+#************************************************************************************
+
+. $VTOY_PATH/hook/ventoy-os-lib.sh
+
+$BUSYBOX_PATH/mkdir -p /etc/anaconda.repos.d /mnt/ventoy
+ventoy_print_yum_repo "ventoy" "file:///mnt/ventoy" > /etc/anaconda.repos.d/ventoy.repo
+
+
+$BUSYBOX_PATH/mknod -m 0660 /dev/null c 1 3
+$VTOY_PATH/hook/vine/dev-listen.sh &
+
####################################################################
# #
-# Step 3 : Hand over to ventoy.sh #
+# Step 3 : Extract injection archive #
+# #
+####################################################################
+if [ -e $VTOY_PATH/ventoy_injection ]; then
+ echo "decompress injection ..." >>$VTLOG
+
+ vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $VTOY_PATH/ventoy_injection)
+ echo "vtmagic=$vtmagic ..." >>$VTLOG
+
+ if [ "1F8B" = "vtmagic" ] || [ "1F9E" = "vtmagic" ]; then
+ zcat $VTOY_PATH/ventoy_injection | tar -xf -C /
+ elif [ "425A" = "vtmagic" ]; then
+ bzcat $VTOY_PATH/ventoy_injection | tar -xf -C /
+ elif [ "FD37" = "vtmagic" ]; then
+ xzcat $VTOY_PATH/ventoy_injection | tar -xf -C /
+ else
+ unzip -o -q $VTOY_PATH/ventoy_injection -d /
+ fi
+fi
+
+
+####################################################################
+# #
+# Step 4 : Hand over to ventoy.sh #
# #
####################################################################
echo "Now hand over to ventoy.sh" >>$VTLOG
echo 'kwort'; return
fi
+ if $GREP -q 'iwamoto' /proc/version; then
+ echo 'vine'; return
+ fi
echo "default"
}
exec $BUSYBOX_PATH/sh
fi
+
####################################################################
# #
# Step 4 : Hand over to real init #
--- /dev/null
+
+========== Ventoy2Disk.sh ===============
+
+sudo sh Ventoy2Disk.sh { -i | -I | -u } /dev/XXX XXX is the USB device, for example /dev/sdb.
+
+Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
+ CMD:
+ -i install ventoy to sdX (fail if disk already installed with ventoy)
+ -I force install ventoy to sdX (no matter installed or not)
+ -u update ventoy in sdX
+
+ OPTION: (optional)
+ -r SIZE_MB preserve some space at the bottom of the disk (only for install)
+ -s enable secure boot support (default is disabled)
+ -g use GPT partition style, default is MBR style (only for install)
+
+
+========== CreatePersistentImg.sh ===============
+
+sudo sh CreatePersistentImg.sh
+
+sh CreatePersistentImg.sh [ -s SIZE_IN_MB ] [ -t FSTYPE ] [ -l LABEL ] for example:
+
+sh CreatePersistentImg.sh ----> persistence.img in 1GB size and ext4 filesystem and casper-rw label
+sh CreatePersistentImg.sh -l MX-Persist ----> persistence.img in 1GB size and ext4 filesystem and MX-Persist label
+sh CreatePersistentImg.sh -s 2048 ----> persistence.img in 2GB size and ext4 filesystem and casper-rw label
+sh CreatePersistentImg.sh -s 4096 -t xfs ----> persistence.img in 4GB size and xfs filesystem (ext2/3/4 xfs are supported) and casper-rw label
+
submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
menuentry 'Check global control plugin configuration' --class=debug_control {
set pager=1
- vt_check_plugin_json $vt_plugin_path control $iso_path
+ vt_check_plugin_json $vt_plugin_path control $vtoy_iso_part
echo -e "\npress ENTER to exit ..."
read vtInputKey
menuentry 'Check theme plugin configuration' --class=debug_theme {
set pager=1
- vt_check_plugin_json $vt_plugin_path theme $iso_path
+ vt_check_plugin_json $vt_plugin_path theme $vtoy_iso_part
echo -e "\npress ENTER to exit ..."
read vtInputKey
menuentry 'Check auto install plugin configuration' --class=debug_autoinstall {
set pager=1
- vt_check_plugin_json $vt_plugin_path auto_install $iso_path
+ vt_check_plugin_json $vt_plugin_path auto_install $vtoy_iso_part
echo -e "\npress ENTER to exit ..."
read vtInputKey
menuentry 'Check persistence plugin configuration' --class=debug_persistence {
set pager=1
- vt_check_plugin_json $vt_plugin_path persistence $iso_path
+ vt_check_plugin_json $vt_plugin_path persistence $vtoy_iso_part
echo -e "\n############### dump persistence ###############"
vt_dump_persistence
menuentry 'Check menu alias plugin configuration' --class=debug_menualias {
set pager=1
- vt_check_plugin_json $vt_plugin_path menu_alias $iso_path
+ vt_check_plugin_json $vt_plugin_path menu_alias $vtoy_iso_part
echo -e "\npress ENTER to exit ..."
read vtInputKey
menuentry 'Check menu class plugin configuration' --class=debug_menuclass {
set pager=1
- vt_check_plugin_json $vt_plugin_path menu_class $iso_path
+ vt_check_plugin_json $vt_plugin_path menu_class $vtoy_iso_part
echo -e "\npress ENTER to exit ..."
read vtInputKey
unset pager
- }
+ }
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
echo 'Return ...'
configfile $prefix/localboot.cfg
}
+function ventoy_ext_menu {
+ #if [ -e $vt_plugin_path/ventoy/ventoy_grub.cfg ]; then
+ set ventoy_new_context=1
+ configfile $vt_plugin_path/ventoy/ventoy_grub.cfg
+ unset ventoy_new_context
+ #else
+ # echo "ventoy_grub.cfg NOT exist."
+ # echo -e "\npress ENTER to exit ..."
+ # read vtInputKey
+ #fi
+}
+
function get_os_type {
set vtoy_os=Linux
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"
fi
elif [ -d (loop)/EFI/boot/entries ]; then
if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
function iso_common_menuentry {
if [ "$grub_platform" = "pc" ]; then
if vt_check_mode 0; then
- legacy_iso_memdisk $iso_path
+ legacy_iso_memdisk $vtoy_iso_part
else
- legacy_iso_menu_func $iso_path
+ legacy_iso_menu_func $vtoy_iso_part
fi
else
if vt_check_mode 0; then
- uefi_iso_memdisk $iso_path
+ uefi_iso_memdisk $vtoy_iso_part
else
- uefi_iso_menu_func $iso_path
+ uefi_iso_menu_func $vtoy_iso_part
fi
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 "\n Will return to main menu after 10 seconds ...\n"
- sleep 10
+ echo -e " 文件名中不能有中文或空格 \n"
+ echo -e "\npress ENTER to exit (请按 回车 键返回) ..."
+ read vtInputKey
}
function iso_unsupport_menuentry {
function wim_common_menuentry {
vt_chosen_img_path chosen_path
- vt_wim_chain_data ${iso_path}${chosen_path}
+ vt_wim_chain_data ${vtoy_iso_part}${chosen_path}
ventoy_debug_pause
vt_chosen_img_path chosen_path
ventoy_cli_console
- chainloader ${iso_path}${chosen_path}
+ chainloader ${vtoy_iso_part}${chosen_path}
boot
ventoy_gui_console
}
#############################################################
#############################################################
-set VENTOY_VERSION="1.0.15"
+set VENTOY_VERSION="1.0.16"
# Default menu display mode, you can change it as you want.
# 0: List mode
set VTOY_F2_CMD="ventoy_power"
set VTOY_F4_CMD="ventoy_localboot"
set VTOY_F5_CMD="ventoy_diagnosis"
+set VTOY_F6_CMD="ventoy_ext_menu"
if [ "$grub_platform" = "pc" ]; then
set VTOY_TEXT_MENU_VER="Ventoy $VENTOY_VERSION BIOS www.ventoy.net"
set vtoy_path=($root)
for vtid in 0 1 2 3; do
if [ -d (hd$vtid,2)/ventoy ]; then
- set iso_path=(hd$vtid,1)
+ set vtoy_iso_part=(hd$vtid,1)
set vtoy_efi_part=(hd$vtid,2)
break
fi
done
loadfont ascii
- if [ -f $iso_path/ventoy/ventoy.json ]; then
- set vt_plugin_path=$iso_path
+ if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
+ set vt_plugin_path=$vtoy_iso_part
else
set vt_plugin_path=$prefix
vt_load_plugin $vt_plugin_path
set vtoy_path=($root)/ventoy
fi
- set iso_path=($vtoy_dev,1)
+ set vtoy_iso_part=($vtoy_dev,1)
set vtoy_efi_part=($vtoy_dev,2)
loadfont unicode
- set vt_plugin_path=$iso_path
+ set vt_plugin_path=$vtoy_iso_part
fi
#Load Plugin
-if [ -f $iso_path/ventoy/ventoy.json ]; then
- vt_load_plugin $iso_path
+if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
+ vt_load_plugin $vtoy_iso_part
fi
if [ -n "$VTOY_MENU_TIMEOUT" ]; then
unset timeout
fi
-if [ -f $iso_path/ventoy/ventoy_wimboot.img ]; then
- vt_load_wimboot $iso_path/ventoy/ventoy_wimboot.img
+if [ -f $vtoy_iso_part/ventoy/ventoy_wimboot.img ]; then
+ vt_load_wimboot $vtoy_iso_part/ventoy/ventoy_wimboot.img
elif [ -f $vtoy_efi_part/ventoy/ventoy_wimboot.img ]; then
vt_load_wimboot $vtoy_efi_part/ventoy/ventoy_wimboot.img
fi
if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then
set VTOY_F3_CMD="vt_dynamic_menu 1 1"
- set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Debug"
+ set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Debug F6:ExMenu"
else
set VTOY_F3_CMD="vt_dynamic_menu 1 0"
- set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Debug"
+ set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Debug F6:ExMenu"
fi
terminal_output gfxterm
fi
+#export necessary variable
+export theme
+export gfxmode
+export vtoy_dev
+export vtoy_iso_part
+export vtoy_efi_part
+export VENTOY_VERSION
+
+
+
+
#colect all image files (iso files)
set ventoy_img_count=0
-vt_list_img $iso_path ventoy_img_count
+vt_list_img $vtoy_iso_part ventoy_img_count
#Main menu
if [ $ventoy_img_count -gt 0 ]; then
--- /dev/null
+*acpi: acpi
+*all_functional_test: functional_test
+*background_image: gfxterm_background
+*cat: cat
+*cpuid: cpuid
+*crc: hashsum
+*cryptomount: cryptodisk
+*drivemap: drivemap
+*echo: echo
+*extract_syslinux_entries_configfile: syslinuxcfg
+*extract_syslinux_entries_source: syslinuxcfg
+*file: file
+*functional_test: functional_test
+*gettext: gettext
+*halt: halt
+*hashsum: hashsum
+*hdparm: hdparm
+*hello: hello
+*help: help
+*hexdump: hexdump
+*inb: iorw
+*inl: iorw
+*inw: iorw
+*keystatus: keystatus
+*kfreebsd: bsd
+*knetbsd: bsd
+*kopenbsd: bsd
+*list_env: loadenv
+*load_env: loadenv
+*loopback: loopback
+*ls: ls
+*lsacpi: lsacpi
+*lspci: lspci
+*md5sum: hashsum
+*menuentry: normal
+*pcidump: pcidump
+*plan9: plan9
+*probe: probe
+*rdmsr: rdmsr
+*read_byte: memrw
+*read_dword: memrw
+*read_word: memrw
+*regexp: regexp
+*save_env: loadenv
+*search: search
+*sendkey: sendkey
+*serial: serial
+*setpci: setpci
+*sha1sum: hashsum
+*sha256sum: hashsum
+*sha512sum: hashsum
+*sleep: sleep
+*submenu: normal
+*syslinux_configfile: syslinuxcfg
+*syslinux_source: syslinuxcfg
+*terminfo: terminfo
+*test_blockarg: test_blockarg
+*testspeed: testspeed
+*tr: tr
+*trust: pgp
+*verify_detached: pgp
+*xnu_splash: xnu
+*zfskey: zfscrypt
+.: configfile
+[: test
+authenticate: normal
+background_color: gfxterm_background
+backtrace: backtrace
+badram: mmap
+blocklist: blocklist
+boot: boot
+break: normal
+cat: minicmd
+cbmemc: cbmemc
+chainloader: chain
+clear: normal
+cmosclean: cmostest
+cmosdump: cmosdump
+cmosset: cmostest
+cmostest: cmostest
+cmp: cmp
+configfile: configfile
+continue: normal
+coreboot_boottime: cbtime
+cutmem: mmap
+date: date
+distrust: pgp
+dump: minicmd
+efiemu_loadcore: efiemu
+efiemu_prepare: efiemu
+efiemu_unload: efiemu
+eval: eval
+exit: minicmd
+export: normal
+extract_entries_configfile: configfile
+extract_entries_source: configfile
+extract_legacy_entries_configfile: legacycfg
+extract_legacy_entries_source: legacycfg
+false: true
+freedos: freedos
+gdbstub: gdb
+gdbstub_break: gdb
+gdbstub_stop: gdb
+gptsync: gptsync
+help: minicmd
+hexdump_random: random
+initrd16: linux16
+initrd: linux
+keymap: keylayouts
+kfreebsd_loadenv: bsd
+kfreebsd_module: bsd
+kfreebsd_module_elf: bsd
+knetbsd_module: bsd
+knetbsd_module_elf: bsd
+kopenbsd_ramdisk: bsd
+legacy_check_password: legacycfg
+legacy_configfile: legacycfg
+legacy_initrd: legacycfg
+legacy_initrd_nounzip: legacycfg
+legacy_kernel: legacycfg
+legacy_password: legacycfg
+legacy_source: legacycfg
+linux16: linux16
+linux: linux
+list_trusted: pgp
+loadfont: font
+lsapm: lsapm
+lscoreboot: cbls
+lsfonts: font
+lsmmap: lsmmap
+lsmod: minicmd
+macppcbless: macbless
+mactelbless: macbless
+module2: multiboot2
+module: multiboot
+multiboot2: multiboot2
+multiboot: multiboot
+nativedisk: nativedisk
+net_add_addr: net
+net_add_dns: net
+net_add_route: net
+net_bootp: net
+net_del_addr: net
+net_del_dns: net
+net_del_route: net
+net_dhcp: net
+net_get_dhcp_option: net
+net_ipv6_autoconf: net
+net_ls_addr: net
+net_ls_cards: net
+net_ls_dns: net
+net_ls_routes: net
+net_nslookup: net
+normal: normal
+normal_exit: normal
+ntldr: ntldr
+outb: iorw
+outl: iorw
+outw: iorw
+parttool: parttool
+password: password
+password_pbkdf2: password_pbkdf2
+play: play
+pxechainloader: pxechain
+read: read
+reboot: reboot
+return: normal
+rmmod: minicmd
+search.file: search_fs_file
+search.fs_label: search_label
+search.fs_uuid: search_fs_uuid
+setparams: normal
+shift: normal
+source: configfile
+terminal_input: terminal
+terminal_output: terminal
+test: test
+testload: testload
+time: time
+true: true
+truecrypt: truecrypt
+usb: usbtest
+vbeinfo: videoinfo
+vbetest: videotest
+videoinfo: videoinfo
+videotest: videotest
+write_byte: memrw
+write_dword: memrw
+write_word: memrw
+wrmsr: wrmsr
+xnu_devprop_load: xnu
+xnu_kernel64: xnu
+xnu_kernel: xnu
+xnu_kext: xnu
+xnu_kextdir: xnu
+xnu_mkext: xnu
+xnu_ramdisk: xnu
+xnu_resume: xnu
+xnu_uuid: xnu_uuid
+zfs-bootfs: zfsinfo
+zfsinfo: zfsinfo
--- /dev/null
+RIJNDAEL: gcry_rijndael
+RIJNDAEL192: gcry_rijndael
+RIJNDAEL256: gcry_rijndael
+AES128: gcry_rijndael
+AES-128: gcry_rijndael
+AES-192: gcry_rijndael
+AES-256: gcry_rijndael
+ADLER32: adler32
+CRC64: crc64
+ARCFOUR: gcry_arcfour
+BLOWFISH: gcry_blowfish
+CAMELLIA128: gcry_camellia
+CAMELLIA192: gcry_camellia
+CAMELLIA256: gcry_camellia
+CAST5: gcry_cast5
+CRC32: gcry_crc
+CRC32RFC1510: gcry_crc
+CRC24RFC2440: gcry_crc
+DES: gcry_des
+3DES: gcry_des
+DSA: gcry_dsa
+IDEA: gcry_idea
+MD4: gcry_md4
+MD5: gcry_md5
+RFC2268_40: gcry_rfc2268
+AES: gcry_rijndael
+AES192: gcry_rijndael
+AES256: gcry_rijndael
+RIPEMD160: gcry_rmd160
+RSA: gcry_rsa
+SEED: gcry_seed
+SERPENT128: gcry_serpent
+SERPENT192: gcry_serpent
+SERPENT256: gcry_serpent
+SHA1: gcry_sha1
+SHA224: gcry_sha256
+SHA256: gcry_sha256
+SHA512: gcry_sha512
+SHA384: gcry_sha512
+TIGER192: gcry_tiger
+TIGER: gcry_tiger
+TIGER2: gcry_tiger
+TWOFISH: gcry_twofish
+TWOFISH128: gcry_twofish
+WHIRLPOOL: gcry_whirlpool
--- /dev/null
+affs
+afs
+bfs
+btrfs
+cbfs
+cpio
+cpio_be
+exfat
+ext2
+f2fs
+fat
+hfs
+hfsplus
+iso9660
+jfs
+minix
+minix2
+minix2_be
+minix3
+minix3_be
+minix_be
+newc
+nilfs2
+ntfs
+odc
+procfs
+reiserfs
+romfs
+sfs
+squash4
+tar
+udf
+ufs1
+ufs1_be
+ufs2
+xfs
+zfs
--- /dev/null
+videotest: font video gfxmenu
+odc: archelp
+loopback: extcmd
+macho:
+gcry_des: crypto
+memrw: extcmd
+terminfo: extcmd
+f2fs: fshelp
+part_gpt:
+romfs: fshelp
+read:
+aout:
+gcry_arcfour: crypto
+vga_text:
+tftp: net priority_queue
+newc: archelp
+minix2_be:
+elf:
+videotest_checksum: font functional_test video_fb
+password_pbkdf2: crypto gcry_sha512 pbkdf2 normal
+gcry_seed: crypto
+pcidump: extcmd pci
+bsd: elf serial crypto gcry_md5 verifiers extcmd vbe aout video boot cpuid relocator mmap
+sfs: fshelp
+reiserfs: fshelp
+part_sunpc:
+zstd:
+gfxmenu: video_colors trig bitmap_scale gfxterm font normal bitmap video
+backtrace:
+jfs:
+help: extcmd normal
+configfile: normal
+cbls: cbtable
+gfxterm_menu: font functional_test procfs normal video_fb
+gcry_idea: crypto
+tr: extcmd
+shift_test: functional_test
+ohci: cs5536 usb boot pci
+afs: fshelp
+spkmodem: terminfo
+usb_keyboard: keylayouts usb
+xzio: crypto
+syslinuxcfg: extcmd normal
+search_fs_file:
+wrmsr:
+vga: video video_fb
+usbms: scsi usb
+test_blockarg: extcmd normal
+true:
+affs: fshelp
+iso9660: fshelp
+exfat: fshelp
+setjmp_test: setjmp functional_test
+gfxterm: font video
+disk:
+xfs: fshelp
+testspeed: extcmd normal
+cpio_be: archelp
+functional_test: btrfs extcmd video video_fb
+pxechain: pxe video boot relocator
+bswap_test: functional_test
+sleep: extcmd normal
+memdisk:
+gcry_rijndael: crypto
+mdraid09_be: diskfilter
+gettext:
+gcry_sha1: crypto
+hfspluscomp: gzio hfsplus
+cmp:
+random: hexdump acpi
+offsetio:
+file: elf macho extcmd offsetio
+usbserial_usbdebug: serial usb usbserial_common
+video_colors:
+morse:
+hashsum: crypto extcmd normal
+usb: pci
+halt: extcmd acpi
+gdb: serial backtrace
+gfxterm_background: video_colors bitmap_scale gfxterm extcmd video bitmap
+search_fs_uuid:
+gcry_dsa: pgp mpi
+keystatus: extcmd
+linux: verifiers normal vbe video boot relocator mmap
+geli: cryptodisk crypto gcry_sha512 pbkdf2 gcry_sha256
+cmdline_cat_test: font functional_test normal procfs video_fb
+rdmsr: extcmd
+part_sun:
+cbtable:
+plan9: verifiers extcmd boot video relocator
+sendkey: extcmd boot
+pbkdf2_test: functional_test pbkdf2 gcry_sha1
+video_bochs: pci video video_fb
+verifiers:
+bufio:
+usbserial_ftdi: serial usb usbserial_common
+legacy_password_test: functional_test legacycfg
+cpuid: extcmd
+hdparm: extcmd hexdump
+bfs: fshelp
+gcry_blowfish: crypto
+test:
+nilfs2: fshelp
+gcry_rsa: pgp mpi
+cryptodisk: crypto extcmd procfs
+nativedisk:
+minicmd:
+signature_test: functional_test procfs
+ata: scsi
+udf: fshelp
+gzio: gcry_crc
+xnu_uuid: gcry_md5
+uhci: usb pci
+pata: ata pci
+mul_test: functional_test
+adler32: crypto
+terminal:
+div:
+ehci: cs5536 usb boot pci
+crypto:
+part_bsd: part_msdos
+cs5536: pci
+biosdisk:
+ventoy: ext2 fshelp font crypto exfat udf extcmd normal relocator gcry_sha1 iso9660
+lsapm:
+gcry_sha512: crypto
+password: crypto normal
+efiemu: gcry_crc crypto cpuid acpi
+fshelp:
+sleep_test: functional_test datetime
+iorw: extcmd
+xnu: macho bitmap_scale random verifiers extcmd video bitmap boot relocator efiemu mmap
+mmap: boot
+exfctest: functional_test
+zfsinfo: zfs
+ldm: part_gpt diskfilter part_msdos
+cmostest:
+eval: normal
+part_dvh:
+blocklist:
+ext2: fshelp
+net: priority_queue bufio datetime boot
+drivemap: extcmd boot mmap
+part_acorn:
+videoinfo: video
+btrfs: zstd lzopio raid6rec gzio
+lsmmap:
+strtoull_test: functional_test
+bitmap:
+vbe: video video_fb
+ntfs: fshelp
+multiboot: net linux vbe video boot relocator mmap lsapm
+gcry_crc: crypto
+png: bufio bitmap
+jpeg: bufio bitmap
+macbless: disk
+div_test: functional_test div
+regexp: extcmd normal
+parttool: normal
+usbserial_pl2303: serial usb usbserial_common
+cpio: archelp
+gcry_rmd160: crypto
+fat: fshelp
+ufs1_be:
+truecrypt: video boot relocator gzio mmap
+archelp:
+ntldr: chain boot video relocator
+http: net
+zfs: gzio
+raid6rec: diskfilter
+minix2:
+mda_text:
+lsacpi: extcmd acpi
+datehook: datetime normal
+loadenv: disk extcmd
+bitmap_scale: bitmap
+probe: extcmd
+minix3:
+tar: archelp
+hfs: fshelp
+procfs: archelp
+boot:
+keylayouts:
+progress: normal
+kernel:
+usbtest: usb
+relocator: mmap
+acpi: extcmd mmap
+tga: bufio bitmap
+reboot: relocator
+serial: extcmd terminfo
+zfscrypt: crypto pbkdf2 extcmd zfs gcry_sha1 gcry_rijndael
+dm_nv: diskfilter
+cmp_test: functional_test
+luks: cryptodisk crypto pbkdf2
+font: bufio video
+raid5rec: diskfilter
+crc64: crypto
+datetime:
+ctz_test: functional_test
+video:
+pci:
+cbmemc: cbtable normal terminfo
+cmosdump:
+hfsplus: fshelp
+gcry_cast5: crypto
+extcmd:
+squash4: fshelp lzopio xzio gzio
+part_plan:
+minix_be:
+gcry_whirlpool: crypto
+pxe: net boot
+gcry_tiger: crypto
+search: search_fs_uuid search_fs_file extcmd search_label
+lspci: extcmd pci
+cbtime: cbtable
+video_fb:
+minix3_be:
+trig:
+msdospart: disk parttool
+priority_queue:
+gcry_twofish: crypto
+part_dfly:
+xnu_uuid_test: functional_test
+diskfilter:
+testload:
+part_apple:
+hexdump: extcmd
+date: datetime normal
+pbkdf2: crypto
+gcry_sha256: crypto
+ls: extcmd normal
+usbserial_common: serial usb
+ntfscomp: ntfs
+lzopio: crypto
+video_cirrus: pci video video_fb
+hello: extcmd
+scsi:
+linux16: linux boot video relocator mmap
+cat: extcmd
+ahci: ata boot pci
+pgp: crypto verifiers extcmd mpi gcry_sha1
+normal: terminal crypto verifiers bufio extcmd boot gettext
+ufs1:
+mdraid09: diskfilter
+lvm: diskfilter
+cbfs: archelp
+chain: video boot relocator
+ufs2:
+time:
+setpci: extcmd pci
+gptsync: disk
+freedos: chain boot video relocator
+search_label:
+setjmp:
+multiboot2: linux net vbe boot video relocator mmap lsapm acpi
+gcry_rfc2268: crypto
+mdraid1x: diskfilter
+mpi: crypto
+legacycfg: linux crypto password gcry_md5 normal
+play:
+part_amiga:
+minix:
+echo: extcmd
+gcry_serpent: crypto
+gcry_md4: crypto
+gcry_md5: crypto
+part_msdos:
+gcry_camellia: crypto
+at_keyboard: keylayouts boot
+all_video: vbe vga video_bochs video_cirrus
--- /dev/null
+part_acorn
+part_amiga
+part_apple
+part_bsd
+part_dfly
+part_dvh
+part_gpt
+part_msdos
+part_plan
+part_sun
+part_sunpc
--- /dev/null
+msdos: msdospart
--- /dev/null
+iat_keyboard: at_keyboard
+iserial: serial
+iserial_*: serial
+oaudio: morse
+ocbmemc: cbmemc
+ogfxterm: gfxterm
+omda_text: mda_text
+oserial: serial
+oserial_*: serial
+ospkmodem: spkmodem
+ovga_text: vga_text
--- /dev/null
+vbe
+vga
+video_bochs
+video_cirrus
fi
-menuentry 'Return to menu [Esc]' --class=vtoyret VTOY_RET {
+menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
echo 'Return ...'
}
halt
}
-menuentry 'Return to menu [Esc]' --class=vtoyret VTOY_RET {
+menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
echo 'Return ...'
}
--- /dev/null
+*acpi: acpi
+*all_functional_test: functional_test
+*background_image: gfxterm_background
+*cat: cat
+*cpuid: cpuid
+*crc: hashsum
+*cryptomount: cryptodisk
+*echo: echo
+*extract_syslinux_entries_configfile: syslinuxcfg
+*extract_syslinux_entries_source: syslinuxcfg
+*file: file
+*functional_test: functional_test
+*gettext: gettext
+*hashsum: hashsum
+*hdparm: hdparm
+*hello: hello
+*help: help
+*hexdump: hexdump
+*inb: iorw
+*inl: iorw
+*inw: iorw
+*keystatus: keystatus
+*kfreebsd: bsd
+*knetbsd: bsd
+*kopenbsd: bsd
+*list_env: loadenv
+*load_env: loadenv
+*loopback: loopback
+*ls: ls
+*lsacpi: lsacpi
+*lspci: lspci
+*md5sum: hashsum
+*menuentry: normal
+*pcidump: pcidump
+*probe: probe
+*rdmsr: rdmsr
+*read_byte: memrw
+*read_dword: memrw
+*read_word: memrw
+*regexp: regexp
+*save_env: loadenv
+*search: search
+*serial: serial
+*setpci: setpci
+*sha1sum: hashsum
+*sha256sum: hashsum
+*sha512sum: hashsum
+*sleep: sleep
+*submenu: normal
+*syslinux_configfile: syslinuxcfg
+*syslinux_source: syslinuxcfg
+*terminfo: terminfo
+*test_blockarg: test_blockarg
+*testspeed: testspeed
+*tr: tr
+*trust: pgp
+*verify_detached: pgp
+*xnu_splash: xnu
+*zfskey: zfscrypt
+.: configfile
+[: test
+appleloader: appleldr
+authenticate: normal
+background_color: gfxterm_background
+backtrace: backtrace
+badram: mmap
+blocklist: blocklist
+boot: boot
+break: normal
+cat: minicmd
+cbmemc: cbmemc
+chainloader: chain
+clear: normal
+cmp: cmp
+configfile: configfile
+continue: normal
+coreboot_boottime: cbtime
+cutmem: mmap
+date: date
+distrust: pgp
+dump: minicmd
+eval: eval
+exit: minicmd
+export: normal
+extract_entries_configfile: configfile
+extract_entries_source: configfile
+extract_legacy_entries_configfile: legacycfg
+extract_legacy_entries_source: legacycfg
+fakebios: loadbios
+false: true
+fix_video: fixvideo
+fwsetup: efifwsetup
+gptsync: gptsync
+halt: halt
+help: minicmd
+hexdump_random: random
+initrd16: linux16
+initrd: linux
+keymap: keylayouts
+kfreebsd_loadenv: bsd
+kfreebsd_module: bsd
+kfreebsd_module_elf: bsd
+knetbsd_module: bsd
+knetbsd_module_elf: bsd
+kopenbsd_ramdisk: bsd
+legacy_check_password: legacycfg
+legacy_configfile: legacycfg
+legacy_initrd: legacycfg
+legacy_initrd_nounzip: legacycfg
+legacy_kernel: legacycfg
+legacy_password: legacycfg
+legacy_source: legacycfg
+linux16: linux16
+linux: linux
+list_trusted: pgp
+loadbios: loadbios
+loadfont: font
+lscoreboot: cbls
+lsefi: lsefi
+lsefimmap: lsefimmap
+lsefisystab: lsefisystab
+lsfonts: font
+lsmmap: lsmmap
+lsmod: minicmd
+lssal: lssal
+macppcbless: macbless
+mactelbless: macbless
+module2: multiboot2
+module: multiboot
+multiboot2: multiboot2
+multiboot: multiboot
+nativedisk: nativedisk
+net_add_addr: net
+net_add_dns: net
+net_add_route: net
+net_bootp: net
+net_del_addr: net
+net_del_dns: net
+net_del_route: net
+net_dhcp: net
+net_get_dhcp_option: net
+net_ipv6_autoconf: net
+net_ls_addr: net
+net_ls_cards: net
+net_ls_dns: net
+net_ls_routes: net
+net_nslookup: net
+normal: normal
+normal_exit: normal
+outb: iorw
+outl: iorw
+outw: iorw
+parttool: parttool
+password: password
+password_pbkdf2: password_pbkdf2
+play: play
+read: read
+reboot: reboot
+return: normal
+rmmod: minicmd
+search.file: search_fs_file
+search.fs_label: search_label
+search.fs_uuid: search_fs_uuid
+setparams: normal
+shift: normal
+source: configfile
+terminal_input: terminal
+terminal_output: terminal
+test: test
+testload: testload
+time: time
+true: true
+usb: usbtest
+videoinfo: videoinfo
+videotest: videotest
+write_byte: memrw
+write_dword: memrw
+write_word: memrw
+wrmsr: wrmsr
+xnu_devprop_load: xnu
+xnu_kernel64: xnu
+xnu_kernel: xnu
+xnu_kext: xnu
+xnu_kextdir: xnu
+xnu_mkext: xnu
+xnu_ramdisk: xnu
+xnu_resume: xnu
+xnu_uuid: xnu_uuid
+zfs-bootfs: zfsinfo
+zfsinfo: zfsinfo
--- /dev/null
+RIJNDAEL: gcry_rijndael
+RIJNDAEL192: gcry_rijndael
+RIJNDAEL256: gcry_rijndael
+AES128: gcry_rijndael
+AES-128: gcry_rijndael
+AES-192: gcry_rijndael
+AES-256: gcry_rijndael
+ADLER32: adler32
+CRC64: crc64
+ARCFOUR: gcry_arcfour
+BLOWFISH: gcry_blowfish
+CAMELLIA128: gcry_camellia
+CAMELLIA192: gcry_camellia
+CAMELLIA256: gcry_camellia
+CAST5: gcry_cast5
+CRC32: gcry_crc
+CRC32RFC1510: gcry_crc
+CRC24RFC2440: gcry_crc
+DES: gcry_des
+3DES: gcry_des
+DSA: gcry_dsa
+IDEA: gcry_idea
+MD4: gcry_md4
+MD5: gcry_md5
+RFC2268_40: gcry_rfc2268
+AES: gcry_rijndael
+AES192: gcry_rijndael
+AES256: gcry_rijndael
+RIPEMD160: gcry_rmd160
+RSA: gcry_rsa
+SEED: gcry_seed
+SERPENT128: gcry_serpent
+SERPENT192: gcry_serpent
+SERPENT256: gcry_serpent
+SHA1: gcry_sha1
+SHA224: gcry_sha256
+SHA256: gcry_sha256
+SHA512: gcry_sha512
+SHA384: gcry_sha512
+TIGER192: gcry_tiger
+TIGER: gcry_tiger
+TIGER2: gcry_tiger
+TWOFISH: gcry_twofish
+TWOFISH128: gcry_twofish
+WHIRLPOOL: gcry_whirlpool
--- /dev/null
+affs
+afs
+bfs
+btrfs
+cbfs
+cpio
+cpio_be
+exfat
+ext2
+f2fs
+fat
+hfs
+hfsplus
+iso9660
+jfs
+minix
+minix2
+minix2_be
+minix3
+minix3_be
+minix_be
+newc
+nilfs2
+ntfs
+odc
+procfs
+reiserfs
+romfs
+sfs
+squash4
+tar
+udf
+ufs1
+ufs1_be
+ufs2
+xfs
+zfs
--- /dev/null
+videotest: font video gfxmenu
+odc: archelp
+loopback: extcmd
+macho:
+gcry_des: crypto
+memrw: extcmd
+terminfo: extcmd
+f2fs: fshelp
+part_gpt:
+romfs: fshelp
+read:
+lsefimmap:
+aout:
+gcry_arcfour: crypto
+tftp: net priority_queue
+newc: archelp
+minix2_be:
+elf:
+videotest_checksum: font functional_test video_fb
+password_pbkdf2: crypto gcry_sha512 pbkdf2 normal
+gcry_seed: crypto
+pcidump: extcmd
+bsd: elf serial crypto gcry_md5 verifiers extcmd aout video boot cpuid relocator mmap
+sfs: fshelp
+reiserfs: fshelp
+part_sunpc:
+zstd:
+gfxmenu: video_colors trig bitmap_scale gfxterm font normal bitmap video
+backtrace:
+jfs:
+help: extcmd normal
+configfile: normal
+cbls: cbtable
+gfxterm_menu: font functional_test procfs normal video_fb
+gcry_idea: crypto
+tr: extcmd
+shift_test: functional_test
+ohci: cs5536 usb boot
+afs: fshelp
+spkmodem: terminfo
+usb_keyboard: keylayouts usb
+xzio: crypto
+syslinuxcfg: extcmd normal
+search_fs_file:
+wrmsr:
+usbms: scsi usb
+test_blockarg: extcmd normal
+true:
+affs: fshelp
+iso9660: fshelp
+exfat: fshelp
+setjmp_test: setjmp functional_test
+gfxterm: font video
+efinet: net
+disk:
+appleldr: boot
+xfs: fshelp
+testspeed: extcmd normal
+cpio_be: archelp
+functional_test: btrfs extcmd video video_fb
+bswap_test: functional_test
+sleep: extcmd normal
+memdisk:
+gcry_rijndael: crypto
+mdraid09_be: diskfilter
+gettext:
+gcry_sha1: crypto
+hfspluscomp: gzio hfsplus
+cmp:
+random: hexdump
+offsetio:
+file: elf macho extcmd offsetio
+usbserial_usbdebug: serial usb usbserial_common
+video_colors:
+morse:
+hashsum: crypto extcmd normal
+usb:
+halt: acpi
+gfxterm_background: video_colors bitmap_scale gfxterm extcmd video bitmap
+search_fs_uuid:
+gcry_dsa: pgp mpi
+keystatus: extcmd
+linux: verifiers video boot relocator mmap
+geli: cryptodisk crypto gcry_sha512 pbkdf2 gcry_sha256
+cmdline_cat_test: font functional_test normal procfs video_fb
+rdmsr: extcmd
+part_sun:
+cbtable:
+pbkdf2_test: functional_test pbkdf2 gcry_sha1
+video_bochs: video video_fb
+verifiers:
+bufio:
+usbserial_ftdi: serial usb usbserial_common
+legacy_password_test: functional_test legacycfg
+cpuid: extcmd
+hdparm: extcmd hexdump
+bfs: fshelp
+gcry_blowfish: crypto
+test:
+nilfs2: fshelp
+gcry_rsa: pgp mpi
+cryptodisk: crypto extcmd procfs
+nativedisk:
+minicmd:
+signature_test: functional_test procfs
+ata: scsi
+udf: fshelp
+gzio: gcry_crc
+xnu_uuid: gcry_md5
+uhci: usb
+pata: ata
+mul_test: functional_test
+adler32: crypto
+terminal:
+shim_lock: verifiers
+div:
+ehci: cs5536 usb boot
+crypto:
+part_bsd: part_msdos
+cs5536:
+ventoy: ext2 fshelp font crypto exfat udf extcmd normal gcry_sha1 iso9660
+gcry_sha512: crypto
+password: crypto normal
+fshelp:
+sleep_test: functional_test datetime
+iorw: extcmd
+xnu: macho bitmap_scale random verifiers extcmd boot video bitmap relocator mmap
+mmap:
+exfctest: functional_test
+zfsinfo: zfs
+ldm: part_gpt diskfilter part_msdos
+eval: normal
+part_dvh:
+lssal:
+blocklist:
+ext2: fshelp
+net: priority_queue bufio datetime boot
+part_acorn:
+videoinfo: video
+btrfs: zstd lzopio raid6rec gzio
+lsmmap: mmap
+strtoull_test: functional_test
+bitmap:
+ntfs: fshelp
+multiboot: net linux video boot relocator mmap
+tpm: verifiers
+gcry_crc: crypto
+png: bufio bitmap
+jpeg: bufio bitmap
+macbless: disk
+div_test: functional_test div
+regexp: extcmd normal
+parttool: normal
+usbserial_pl2303: serial usb usbserial_common
+cpio: archelp
+gcry_rmd160: crypto
+fat: fshelp
+ufs1_be:
+archelp:
+http: net
+zfs: gzio
+raid6rec: diskfilter
+lsefisystab:
+minix2:
+lsacpi: extcmd acpi
+datehook: datetime normal
+loadenv: disk extcmd
+bitmap_scale: bitmap
+probe: extcmd
+minix3:
+tar: archelp
+loadbios:
+hfs: fshelp
+procfs: archelp
+boot:
+keylayouts:
+progress: normal
+kernel:
+usbtest: usb
+relocator: mmap
+acpi: extcmd mmap
+tga: bufio bitmap
+reboot:
+serial: extcmd terminfo
+zfscrypt: crypto pbkdf2 extcmd zfs gcry_sha1 gcry_rijndael
+efi_uga: video video_fb
+dm_nv: diskfilter
+cmp_test: functional_test
+luks: cryptodisk crypto pbkdf2
+font: bufio video
+raid5rec: diskfilter
+crc64: crypto
+datetime:
+efifwsetup:
+ctz_test: functional_test
+video:
+cbmemc: cbtable normal terminfo
+hfsplus: fshelp
+gcry_cast5: crypto
+extcmd:
+squash4: fshelp lzopio xzio gzio
+part_plan:
+minix_be:
+gcry_whirlpool: crypto
+gcry_tiger: crypto
+fixvideo:
+search: search_fs_uuid search_fs_file extcmd search_label
+lspci: extcmd
+cbtime: cbtable
+video_fb:
+minix3_be:
+trig:
+msdospart: disk parttool
+priority_queue:
+gcry_twofish: crypto
+part_dfly:
+xnu_uuid_test: functional_test
+diskfilter:
+testload:
+part_apple:
+hexdump: extcmd
+date: datetime normal
+pbkdf2: crypto
+gcry_sha256: crypto
+ls: extcmd normal
+usbserial_common: serial usb
+ntfscomp: ntfs
+lzopio: crypto
+video_cirrus: video video_fb
+hello: extcmd
+scsi:
+linux16: linux boot video relocator mmap
+cat: extcmd
+ahci: ata boot
+pgp: crypto verifiers extcmd mpi gcry_sha1
+normal: terminal crypto verifiers bufio extcmd boot gettext
+ufs1:
+mdraid09: diskfilter
+lvm: diskfilter
+chain: net efinet boot
+cbfs: archelp
+ufs2:
+time:
+setpci: extcmd
+gptsync: disk
+search_label:
+setjmp:
+multiboot2: linux net video boot relocator acpi mmap
+gcry_rfc2268: crypto
+mdraid1x: diskfilter
+mpi: crypto
+legacycfg: crypto password gcry_md5 normal
+play:
+part_amiga:
+efi_gop: video video_fb
+minix:
+echo: extcmd
+lsefi:
+gcry_serpent: crypto
+gcry_md4: crypto
+gcry_md5: crypto
+part_msdos:
+gcry_camellia: crypto
+at_keyboard: keylayouts boot
+all_video: efi_gop efi_uga video_bochs video_cirrus
--- /dev/null
+part_acorn
+part_amiga
+part_apple
+part_bsd
+part_dfly
+part_dvh
+part_gpt
+part_msdos
+part_plan
+part_sun
+part_sunpc
--- /dev/null
+msdos: msdospart
--- /dev/null
+iat_keyboard: at_keyboard
+iserial: serial
+iserial_*: serial
+oaudio: morse
+ocbmemc: cbmemc
+ogfxterm: gfxterm
+oserial: serial
+oserial_*: serial
+ospkmodem: spkmodem
--- /dev/null
+efi_gop
+efi_uga
+video_bochs
+video_cirrus
mkdir -p $tmpmnt/tool
cp -a ./tool/mount* $tmpmnt/tool/
-rm -f $tmpmnt/grub/i386-pc/*
+rm -f $tmpmnt/grub/i386-pc/*.img
umount $tmpmnt && rm -rf $tmpmnt
cp -a ./tool $tmpdir/
rm -f $tmpdir/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
cp -a Ventoy2Disk.sh $tmpdir/
+cp -a README $tmpdir/
cp -a CreatePersistentImg.sh $tmpdir/
dos2unix -q $tmpdir/Ventoy2Disk.sh
dos2unix -q $tmpdir/CreatePersistentImg.sh
cp -a $LANG_DIR/languages.ini $tmpdir/ventoy/
rm -rf $tmpdir/tool
rm -f $tmpdir/*.sh
+rm -f $tmpdir/README
zip -r ventoy-${curver}-windows.zip $tmpdir/
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE\r
+ Version 3, 29 June 2007\r
+\r
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+\r
+ This version of the GNU Lesser General Public License incorporates\r
+the terms and conditions of version 3 of the GNU General Public\r
+License, supplemented by the additional permissions listed below.\r
+\r
+ 0. Additional Definitions.\r
+\r
+ As used herein, "this License" refers to version 3 of the GNU Lesser\r
+General Public License, and the "GNU GPL" refers to version 3 of the GNU\r
+General Public License.\r
+\r
+ "The Library" refers to a covered work governed by this License,\r
+other than an Application or a Combined Work as defined below.\r
+\r
+ An "Application" is any work that makes use of an interface provided\r
+by the Library, but which is not otherwise based on the Library.\r
+Defining a subclass of a class defined by the Library is deemed a mode\r
+of using an interface provided by the Library.\r
+\r
+ A "Combined Work" is a work produced by combining or linking an\r
+Application with the Library. The particular version of the Library\r
+with which the Combined Work was made is also called the "Linked\r
+Version".\r
+\r
+ The "Minimal Corresponding Source" for a Combined Work means the\r
+Corresponding Source for the Combined Work, excluding any source code\r
+for portions of the Combined Work that, considered in isolation, are\r
+based on the Application, and not on the Linked Version.\r
+\r
+ The "Corresponding Application Code" for a Combined Work means the\r
+object code and/or source code for the Application, including any data\r
+and utility programs needed for reproducing the Combined Work from the\r
+Application, but excluding the System Libraries of the Combined Work.\r
+\r
+ 1. Exception to Section 3 of the GNU GPL.\r
+\r
+ You may convey a covered work under sections 3 and 4 of this License\r
+without being bound by section 3 of the GNU GPL.\r
+\r
+ 2. Conveying Modified Versions.\r
+\r
+ If you modify a copy of the Library, and, in your modifications, a\r
+facility refers to a function or data to be supplied by an Application\r
+that uses the facility (other than as an argument passed when the\r
+facility is invoked), then you may convey a copy of the modified\r
+version:\r
+\r
+ a) under this License, provided that you make a good faith effort to\r
+ ensure that, in the event an Application does not supply the\r
+ function or data, the facility still operates, and performs\r
+ whatever part of its purpose remains meaningful, or\r
+\r
+ b) under the GNU GPL, with none of the additional permissions of\r
+ this License applicable to that copy.\r
+\r
+ 3. Object Code Incorporating Material from Library Header Files.\r
+\r
+ The object code form of an Application may incorporate material from\r
+a header file that is part of the Library. You may convey such object\r
+code under terms of your choice, provided that, if the incorporated\r
+material is not limited to numerical parameters, data structure\r
+layouts and accessors, or small macros, inline functions and templates\r
+(ten or fewer lines in length), you do both of the following:\r
+\r
+ a) Give prominent notice with each copy of the object code that the\r
+ Library is used in it and that the Library and its use are\r
+ covered by this License.\r
+\r
+ b) Accompany the object code with a copy of the GNU GPL and this license\r
+ document.\r
+\r
+ 4. Combined Works.\r
+\r
+ You may convey a Combined Work under terms of your choice that,\r
+taken together, effectively do not restrict modification of the\r
+portions of the Library contained in the Combined Work and reverse\r
+engineering for debugging such modifications, if you also do each of\r
+the following:\r
+\r
+ a) Give prominent notice with each copy of the Combined Work that\r
+ the Library is used in it and that the Library and its use are\r
+ covered by this License.\r
+\r
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license\r
+ document.\r
+\r
+ c) For a Combined Work that displays copyright notices during\r
+ execution, include the copyright notice for the Library among\r
+ these notices, as well as a reference directing the user to the\r
+ copies of the GNU GPL and this license document.\r
+\r
+ d) Do one of the following:\r
+\r
+ 0) Convey the Minimal Corresponding Source under the terms of this\r
+ License, and the Corresponding Application Code in a form\r
+ suitable for, and under terms that permit, the user to\r
+ recombine or relink the Application with a modified version of\r
+ the Linked Version to produce a modified Combined Work, in the\r
+ manner specified by section 6 of the GNU GPL for conveying\r
+ Corresponding Source.\r
+\r
+ 1) Use a suitable shared library mechanism for linking with the\r
+ Library. A suitable mechanism is one that (a) uses at run time\r
+ a copy of the Library already present on the user's computer\r
+ system, and (b) will operate properly with a modified version\r
+ of the Library that is interface-compatible with the Linked\r
+ Version.\r
+\r
+ e) Provide Installation Information, but only if you would otherwise\r
+ be required to provide such information under section 6 of the\r
+ GNU GPL, and only to the extent that such information is\r
+ necessary to install and execute a modified version of the\r
+ Combined Work produced by recombining or relinking the\r
+ Application with a modified version of the Linked Version. (If\r
+ you use option 4d0, the Installation Information must accompany\r
+ the Minimal Corresponding Source and Corresponding Application\r
+ Code. If you use option 4d1, you must provide the Installation\r
+ Information in the manner specified by section 6 of the GNU GPL\r
+ for conveying Corresponding Source.)\r
+\r
+ 5. Combined Libraries.\r
+\r
+ You may place library facilities that are a work based on the\r
+Library side by side in a single library together with other library\r
+facilities that are not Applications and are not covered by this\r
+License, and convey such a combined library under terms of your\r
+choice, if you do both of the following:\r
+\r
+ a) Accompany the combined library with a copy of the same work based\r
+ on the Library, uncombined with any other library facilities,\r
+ conveyed under the terms of this License.\r
+\r
+ b) Give prominent notice with the combined library that part of it\r
+ is a work based on the Library, and explaining where to find the\r
+ accompanying uncombined form of the same work.\r
+\r
+ 6. Revised Versions of the GNU Lesser General Public License.\r
+\r
+ The Free Software Foundation may publish revised and/or new versions\r
+of the GNU Lesser General Public License from time to time. Such new\r
+versions will be similar in spirit to the present version, but may\r
+differ in detail to address new problems or concerns.\r
+\r
+ Each version is given a distinguishing version number. If the\r
+Library as you received it specifies that a certain numbered version\r
+of the GNU Lesser General Public License "or any later version"\r
+applies to it, you have the option of following the terms and\r
+conditions either of that published version or of any later version\r
+published by the Free Software Foundation. If the Library as you\r
+received it does not specify a version number of the GNU Lesser\r
+General Public License, you may choose any version of the GNU Lesser\r
+General Public License ever published by the Free Software Foundation.\r
+\r
+ If the Library as you received it specifies that a proxy can decide\r
+whether future versions of the GNU Lesser General Public License shall\r
+apply, that proxy's public statement of acceptance of any version is\r
+permanent authorization for you to choose that version for the\r
+Library.
\ No newline at end of file
--- /dev/null
+ \r
+imdisk follows LGPL license (see lgpl-3.0.txt)\r
+\r
+Ventoy only use its binaries 7za.exe\r
+ \r
+========7zip License Information=============== \r
+ 7-Zip Extra\r
+ ~~~~~~~~~~~\r
+ License for use and distribution\r
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
+\r
+ Copyright (C) 1999-2019 Igor Pavlov.\r
+\r
+ 7-Zip Extra files are under the GNU LGPL license.\r
+\r
+ \r
+ Notes: \r
+ You can use 7-Zip Extra on any computer, including a computer in a commercial \r
+ organization. You don't need to register or pay for 7-Zip.\r
+\r
+\r
+ GNU LGPL information\r
+ --------------------\r
+\r
+ This library is free software; you can redistribute it and/or\r
+ modify it under the terms of the GNU Lesser General Public\r
+ License as published by the Free Software Foundation; either\r
+ version 2.1 of the License, or (at your option) any later version.\r
+\r
+ This library is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ Lesser General Public License for more details.\r
+\r
+ You can receive a copy of the GNU Lesser General Public License from \r
+ http://www.gnu.org/\r
+\r
-/******************************************************************************
- * Ventoy2Disk.c
- *
- * Copyright (c) 2020, longpanda <admin@ventoy.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <Windows.h>
-#include "resource.h"
-#include "Language.h"
-#include "Ventoy2Disk.h"
-
-PHY_DRIVE_INFO *g_PhyDriveList = NULL;
-DWORD g_PhyDriveCount = 0;
-static int g_FilterRemovable = 0;
-static int g_FilterUSB = 1;
-int g_ForceOperation = 1;
-
-int ParseCmdLineOption(LPSTR lpCmdLine)
-{
- int i;
- char cfgfile[MAX_PATH];
-
- if (lpCmdLine && lpCmdLine[0])
- {
- Log("CmdLine:<%s>", lpCmdLine);
- }
-
- for (i = 0; i < __argc; i++)
- {
- if (strncmp(__argv[i], "-U", 2) == 0 ||
- strncmp(__argv[i], "-u", 2) == 0)
- {
- g_FilterUSB = 0;
- }
- else if (strncmp(__argv[i], "-F", 2) == 0)
- {
- g_ForceOperation = 1;
- }
- }
-
- GetCurrentDirectoryA(sizeof(cfgfile), cfgfile);
- strcat_s(cfgfile, sizeof(cfgfile), "\\Ventoy2Disk.ini");
-
- if (0 == GetPrivateProfileIntA("Filter", "USB", 1, cfgfile))
- {
- g_FilterUSB = 0;
- }
-
- if (1 == GetPrivateProfileIntA("Operation", "Force", 0, cfgfile))
- {
- g_ForceOperation = 1;
- }
-
- Log("Control Flag: %d %d %d", g_FilterRemovable, g_FilterUSB, g_ForceOperation);
-
- return 0;
-}
-
-static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR, UINT64 *Part2StartSector)
-{
- int i;
- BOOL bRet;
- DWORD dwSize;
- HANDLE hDrive;
- MBR_HEAD MBR;
- UINT32 PartStartSector;
- UINT32 PartSectorCount;
- CHAR PhyDrivePath[128];
- VTOY_GPT_INFO *pGpt = NULL;
-
- safe_sprintf(PhyDrivePath, "\\\\.\\PhysicalDrive%d", PhyDrive);
- hDrive = CreateFileA(PhyDrivePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
- Log("Create file Handle:%p %s status:%u", hDrive, PhyDrivePath, LASTERR);
-
- if (hDrive == INVALID_HANDLE_VALUE)
- {
- return FALSE;
- }
-
- bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);
- Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);
-
- if ((!bRet) || (dwSize != sizeof(MBR)))
- {
- CHECK_CLOSE_HANDLE(hDrive);
- return FALSE;
- }
-
- if (MBR.Byte55 != 0x55 || MBR.ByteAA != 0xAA)
- {
- Log("Byte55 ByteAA not match 0x%x 0x%x", MBR.Byte55, MBR.ByteAA);
- CHECK_CLOSE_HANDLE(hDrive);
- return FALSE;
- }
-
- for (i = 0; i < 4; i++)
- {
- Log("=========== Partition Table %d ============", i + 1);
- Log("PartTbl.Active = 0x%x", MBR.PartTbl[i].Active);
- Log("PartTbl.FsFlag = 0x%x", MBR.PartTbl[i].FsFlag);
- Log("PartTbl.StartSectorId = %u", MBR.PartTbl[i].StartSectorId);
- Log("PartTbl.SectorCount = %u", MBR.PartTbl[i].SectorCount);
- Log("PartTbl.StartHead = %u", MBR.PartTbl[i].StartHead);
- Log("PartTbl.StartSector = %u", MBR.PartTbl[i].StartSector);
- Log("PartTbl.StartCylinder = %u", MBR.PartTbl[i].StartCylinder);
- Log("PartTbl.EndHead = %u", MBR.PartTbl[i].EndHead);
- Log("PartTbl.EndSector = %u", MBR.PartTbl[i].EndSector);
- Log("PartTbl.EndCylinder = %u", MBR.PartTbl[i].EndCylinder);
- }
-
- if (MBR.PartTbl[0].FsFlag == 0xEE)
- {
- pGpt = malloc(sizeof(VTOY_GPT_INFO));
- if (!pGpt)
- {
- CHECK_CLOSE_HANDLE(hDrive);
- return FALSE;
- }
-
- SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
- bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL);
- CHECK_CLOSE_HANDLE(hDrive);
- if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO)))
- {
- Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR);
- return FALSE;
- }
-
- if (memcmp(pGpt->Head.Signature, "EFI PART", 8))
- {
- Log("Invalid GPT signature");
- return FALSE;
- }
-
- if (memcmp(pGpt->PartTbl[1].Name, L"VTOYEFI", 7 * 2))
- {
- Log("Invalid ventoy efi part name");
- return FALSE;
- }
-
- *Part2StartSector = pGpt->PartTbl[1].StartLBA;
- }
- else
- {
- CHECK_CLOSE_HANDLE(hDrive);
-
- if (MBR.PartTbl[0].StartSectorId != 2048)
- {
- Log("Part1 not match %u", MBR.PartTbl[0].StartSectorId);
- return FALSE;
- }
-
- PartStartSector = MBR.PartTbl[0].StartSectorId + MBR.PartTbl[0].SectorCount;
- PartSectorCount = VENTOY_EFI_PART_SIZE / 512;
-
- if (MBR.PartTbl[1].FsFlag != 0xEF ||
- MBR.PartTbl[1].StartSectorId != PartStartSector ||
- MBR.PartTbl[1].SectorCount != PartSectorCount)
- {
- Log("Part2 not match [0x%x 0x%x] [%u %u] [%u %u]",
- MBR.PartTbl[1].FsFlag, 0xEF,
- MBR.PartTbl[1].StartSectorId, PartStartSector,
- MBR.PartTbl[1].SectorCount, PartSectorCount);
- return FALSE;
- }
-
- if (MBR.PartTbl[0].Active != 0x80 && MBR.PartTbl[1].Active != 0x80)
- {
- Log("Part1 and Part2 are both NOT active 0x%x 0x%x", MBR.PartTbl[0].Active, MBR.PartTbl[1].Active);
- return FALSE;
- }
-
- *Part2StartSector = MBR.PartTbl[1].StartSectorId;
- }
-
- memcpy(pMBR, &MBR, sizeof(MBR_HEAD));
- Log("PhysicalDrive%d is ventoy disk", PhyDrive);
- return TRUE;
-}
-
-
-static int FilterPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount)
-{
- DWORD i;
- DWORD LogDrive;
- int Letter = 'A';
- int Id = 0;
- int LetterCount = 0;
- UINT64 Part2StartSector = 0;
- PHY_DRIVE_INFO *CurDrive;
- MBR_HEAD MBR;
- int LogLetter[VENTOY_MAX_PHY_DRIVE];
- int PhyDriveId[VENTOY_MAX_PHY_DRIVE];
-
- for (LogDrive = GetLogicalDrives(); LogDrive > 0; LogDrive >>= 1)
- {
- if (LogDrive & 0x01)
- {
- LogLetter[LetterCount] = Letter;
- PhyDriveId[LetterCount] = GetPhyDriveByLogicalDrive(Letter);
-
- Log("Logical Drive:%C ===> PhyDrive:%d", LogLetter[LetterCount], PhyDriveId[LetterCount]);
- LetterCount++;
- }
-
- Letter++;
- }
-
- for (i = 0; i < DriveCount; i++)
- {
- CurDrive = pDriveList + i;
-
- CurDrive->Id = -1;
- CurDrive->FirstDriveLetter = -1;
-
- // Too big for MBR
- if (CurDrive->SizeInBytes > 2199023255552ULL)
- {
- Log("<%s %s> is filtered for too big for MBR.", CurDrive->VendorId, CurDrive->ProductId);
- continue;
- }
-
- if (g_FilterRemovable && (!CurDrive->RemovableMedia))
- {
- Log("<%s %s> is filtered for not removable.", CurDrive->VendorId, CurDrive->ProductId);
- continue;
- }
-
- if (g_FilterUSB && CurDrive->BusType != BusTypeUsb)
- {
- Log("<%s %s> is filtered for not USB type.", CurDrive->VendorId, CurDrive->ProductId);
- continue;
- }
-
- CurDrive->Id = Id++;
-
- for (Letter = 0; Letter < LetterCount; Letter++)
- {
- if (PhyDriveId[Letter] == CurDrive->PhyDrive)
- {
- CurDrive->FirstDriveLetter = LogLetter[Letter];
- break;
- }
- }
-
- if (IsVentoyPhyDrive(CurDrive->PhyDrive, CurDrive->SizeInBytes, &MBR, &Part2StartSector))
- {
- CurDrive->PartStyle = (MBR.PartTbl[0].FsFlag == 0xEE) ? 1 : 0;
- GetVentoyVerInPhyDrive(CurDrive, Part2StartSector, CurDrive->VentoyVersion, sizeof(CurDrive->VentoyVersion));
- }
- }
-
- // for safe
- for (i = 0; i < DriveCount; i++)
- {
- CurDrive = pDriveList + i;
- if (CurDrive->Id < 0)
- {
- CurDrive->PhyDrive = 0x00FFFFFF;
- }
- }
-
- return Id;
-}
-
-PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id)
-{
- DWORD i;
- for (i = 0; i < g_PhyDriveCount; i++)
- {
- if (g_PhyDriveList[i].Id >= 0 && g_PhyDriveList[i].Id == Id)
- {
- return g_PhyDriveList + i;
- }
- }
-
- return NULL;
-}
-
-int SortPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount)
-{
- DWORD i, j;
- PHY_DRIVE_INFO TmpDriveInfo;
-
- for (i = 0; i < DriveCount; i++)
- {
- for (j = i + 1; j < DriveCount; j++)
- {
- if (pDriveList[i].BusType == BusTypeUsb && pDriveList[j].BusType == BusTypeUsb)
- {
- if (pDriveList[i].RemovableMedia == FALSE && pDriveList[j].RemovableMedia == TRUE)
- {
- memcpy(&TmpDriveInfo, pDriveList + i, sizeof(PHY_DRIVE_INFO));
- memcpy(pDriveList + i, pDriveList + j, sizeof(PHY_DRIVE_INFO));
- memcpy(pDriveList + j, &TmpDriveInfo, sizeof(PHY_DRIVE_INFO));
- }
- }
- }
- }
-
- return 0;
-}
-
-int Ventoy2DiskInit(void)
-{
- Log("\n===================== Enum All PhyDrives =====================");
- g_PhyDriveList = (PHY_DRIVE_INFO *)malloc(sizeof(PHY_DRIVE_INFO)* VENTOY_MAX_PHY_DRIVE);
- if (NULL == g_PhyDriveList)
- {
- Log("Failed to alloc phy drive memory");
- return FALSE;
- }
- memset(g_PhyDriveList, 0, sizeof(PHY_DRIVE_INFO)* VENTOY_MAX_PHY_DRIVE);
-
- GetAllPhysicalDriveInfo(g_PhyDriveList, &g_PhyDriveCount);
-
- SortPhysicalDrive(g_PhyDriveList, g_PhyDriveCount);
-
- FilterPhysicalDrive(g_PhyDriveList, g_PhyDriveCount);
-
- return 0;
-}
-
-int Ventoy2DiskDestroy(void)
-{
- free(g_PhyDriveList);
- return 0;
-}
+/******************************************************************************\r
+ * Ventoy2Disk.c\r
+ *\r
+ * Copyright (c) 2020, longpanda <admin@ventoy.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License as\r
+ * published by the Free Software Foundation; either version 3 of the\r
+ * License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+#include <Windows.h>\r
+#include "resource.h"\r
+#include "Language.h"\r
+#include "Ventoy2Disk.h"\r
+\r
+PHY_DRIVE_INFO *g_PhyDriveList = NULL;\r
+DWORD g_PhyDriveCount = 0;\r
+static int g_FilterRemovable = 0;\r
+static int g_FilterUSB = 1;\r
+int g_ForceOperation = 1;\r
+\r
+int ParseCmdLineOption(LPSTR lpCmdLine)\r
+{\r
+ int i;\r
+ char cfgfile[MAX_PATH];\r
+\r
+ if (lpCmdLine && lpCmdLine[0])\r
+ {\r
+ Log("CmdLine:<%s>", lpCmdLine);\r
+ }\r
+\r
+ for (i = 0; i < __argc; i++)\r
+ {\r
+ if (strncmp(__argv[i], "-U", 2) == 0 ||\r
+ strncmp(__argv[i], "-u", 2) == 0)\r
+ {\r
+ g_FilterUSB = 0;\r
+ }\r
+ else if (strncmp(__argv[i], "-F", 2) == 0)\r
+ {\r
+ g_ForceOperation = 1;\r
+ }\r
+ }\r
+\r
+ GetCurrentDirectoryA(sizeof(cfgfile), cfgfile);\r
+ strcat_s(cfgfile, sizeof(cfgfile), "\\Ventoy2Disk.ini");\r
+\r
+ if (0 == GetPrivateProfileIntA("Filter", "USB", 1, cfgfile))\r
+ {\r
+ g_FilterUSB = 0;\r
+ }\r
+\r
+ if (1 == GetPrivateProfileIntA("Operation", "Force", 0, cfgfile))\r
+ {\r
+ g_ForceOperation = 1;\r
+ }\r
+\r
+ Log("Control Flag: %d %d %d", g_FilterRemovable, g_FilterUSB, g_ForceOperation);\r
+\r
+ return 0;\r
+}\r
+\r
+static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR, UINT64 *Part2StartSector)\r
+{\r
+ int i;\r
+ BOOL bRet;\r
+ DWORD dwSize;\r
+ HANDLE hDrive;\r
+ MBR_HEAD MBR;\r
+ UINT32 PartStartSector;\r
+ UINT32 PartSectorCount;\r
+ CHAR PhyDrivePath[128];\r
+ VTOY_GPT_INFO *pGpt = NULL;\r
+\r
+ safe_sprintf(PhyDrivePath, "\\\\.\\PhysicalDrive%d", PhyDrive);\r
+ hDrive = CreateFileA(PhyDrivePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);\r
+ Log("Create file Handle:%p %s status:%u", hDrive, PhyDrivePath, LASTERR);\r
+\r
+ if (hDrive == INVALID_HANDLE_VALUE)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);\r
+ Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);\r
+\r
+ if ((!bRet) || (dwSize != sizeof(MBR)))\r
+ {\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+ return FALSE;\r
+ }\r
+\r
+ if (MBR.Byte55 != 0x55 || MBR.ByteAA != 0xAA)\r
+ {\r
+ Log("Byte55 ByteAA not match 0x%x 0x%x", MBR.Byte55, MBR.ByteAA);\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+ return FALSE;\r
+ }\r
+\r
+ for (i = 0; i < 4; i++)\r
+ {\r
+ Log("=========== Partition Table %d ============", i + 1);\r
+ Log("PartTbl.Active = 0x%x", MBR.PartTbl[i].Active);\r
+ Log("PartTbl.FsFlag = 0x%x", MBR.PartTbl[i].FsFlag);\r
+ Log("PartTbl.StartSectorId = %u", MBR.PartTbl[i].StartSectorId);\r
+ Log("PartTbl.SectorCount = %u", MBR.PartTbl[i].SectorCount);\r
+ Log("PartTbl.StartHead = %u", MBR.PartTbl[i].StartHead);\r
+ Log("PartTbl.StartSector = %u", MBR.PartTbl[i].StartSector);\r
+ Log("PartTbl.StartCylinder = %u", MBR.PartTbl[i].StartCylinder);\r
+ Log("PartTbl.EndHead = %u", MBR.PartTbl[i].EndHead);\r
+ Log("PartTbl.EndSector = %u", MBR.PartTbl[i].EndSector);\r
+ Log("PartTbl.EndCylinder = %u", MBR.PartTbl[i].EndCylinder);\r
+ }\r
+\r
+ if (MBR.PartTbl[0].FsFlag == 0xEE)\r
+ {\r
+ pGpt = malloc(sizeof(VTOY_GPT_INFO));\r
+ if (!pGpt)\r
+ {\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+ return FALSE;\r
+ }\r
+\r
+ SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);\r
+ bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL);\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+ if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO)))\r
+ {\r
+ Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR);\r
+ return FALSE;\r
+ }\r
+\r
+ if (memcmp(pGpt->Head.Signature, "EFI PART", 8))\r
+ {\r
+ Log("Invalid GPT signature");\r
+ return FALSE;\r
+ }\r
+\r
+ if (memcmp(pGpt->PartTbl[1].Name, L"VTOYEFI", 7 * 2))\r
+ {\r
+ Log("Invalid ventoy efi part name");\r
+ return FALSE;\r
+ }\r
+\r
+ *Part2StartSector = pGpt->PartTbl[1].StartLBA;\r
+ }\r
+ else\r
+ {\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+\r
+ if (MBR.PartTbl[0].StartSectorId != 2048)\r
+ {\r
+ Log("Part1 not match %u", MBR.PartTbl[0].StartSectorId);\r
+ return FALSE;\r
+ }\r
+\r
+ PartStartSector = MBR.PartTbl[0].StartSectorId + MBR.PartTbl[0].SectorCount;\r
+ PartSectorCount = VENTOY_EFI_PART_SIZE / 512;\r
+\r
+ if (MBR.PartTbl[1].FsFlag != 0xEF ||\r
+ MBR.PartTbl[1].StartSectorId != PartStartSector ||\r
+ MBR.PartTbl[1].SectorCount != PartSectorCount)\r
+ {\r
+ Log("Part2 not match [0x%x 0x%x] [%u %u] [%u %u]",\r
+ MBR.PartTbl[1].FsFlag, 0xEF,\r
+ MBR.PartTbl[1].StartSectorId, PartStartSector,\r
+ MBR.PartTbl[1].SectorCount, PartSectorCount);\r
+ return FALSE;\r
+ }\r
+\r
+ if (MBR.PartTbl[0].Active != 0x80 && MBR.PartTbl[1].Active != 0x80)\r
+ {\r
+ Log("Part1 and Part2 are both NOT active 0x%x 0x%x", MBR.PartTbl[0].Active, MBR.PartTbl[1].Active);\r
+ return FALSE;\r
+ }\r
+\r
+ *Part2StartSector = MBR.PartTbl[1].StartSectorId;\r
+ }\r
+\r
+ memcpy(pMBR, &MBR, sizeof(MBR_HEAD));\r
+ Log("PhysicalDrive%d is ventoy disk", PhyDrive);\r
+ return TRUE;\r
+}\r
+\r
+\r
+static int FilterPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount)\r
+{\r
+ DWORD i; \r
+ DWORD LogDrive;\r
+ int Count = 0;\r
+ int Letter = 'A';\r
+ int Id = 0;\r
+ int LetterCount = 0;\r
+ UINT64 Part2StartSector = 0;\r
+ PHY_DRIVE_INFO *CurDrive;\r
+ MBR_HEAD MBR;\r
+ int LogLetter[VENTOY_MAX_PHY_DRIVE];\r
+ int PhyDriveId[VENTOY_MAX_PHY_DRIVE];\r
+\r
+ for (LogDrive = GetLogicalDrives(); LogDrive > 0; LogDrive >>= 1)\r
+ {\r
+ if (LogDrive & 0x01)\r
+ {\r
+ LogLetter[LetterCount] = Letter;\r
+ PhyDriveId[LetterCount] = GetPhyDriveByLogicalDrive(Letter);\r
+\r
+ Log("Logical Drive:%C ===> PhyDrive:%d", LogLetter[LetterCount], PhyDriveId[LetterCount]);\r
+ LetterCount++;\r
+ }\r
+ \r
+ Letter++;\r
+ } \r
+\r
+ for (i = 0; i < DriveCount; i++)\r
+ {\r
+ CurDrive = pDriveList + i;\r
+\r
+ CurDrive->Id = -1;\r
+ memset(CurDrive->DriveLetters, 0, sizeof(CurDrive->DriveLetters));\r
+\r
+ // Too big for MBR\r
+ if (CurDrive->SizeInBytes > 2199023255552ULL)\r
+ {\r
+ Log("<%s %s> is filtered for too big for MBR.", CurDrive->VendorId, CurDrive->ProductId);\r
+ continue;\r
+ }\r
+\r
+ if (g_FilterRemovable && (!CurDrive->RemovableMedia))\r
+ {\r
+ Log("<%s %s> is filtered for not removable.", CurDrive->VendorId, CurDrive->ProductId);\r
+ continue;\r
+ }\r
+\r
+ if (g_FilterUSB && CurDrive->BusType != BusTypeUsb)\r
+ {\r
+ Log("<%s %s> is filtered for not USB type.", CurDrive->VendorId, CurDrive->ProductId);\r
+ continue;\r
+ }\r
+ \r
+ CurDrive->Id = Id++;\r
+\r
+ for (Count = 0, Letter = 0; Letter < LetterCount; Letter++)\r
+ {\r
+ if (PhyDriveId[Letter] == CurDrive->PhyDrive)\r
+ {\r
+ if (Count + 1 < sizeof(CurDrive->DriveLetters) / sizeof(CHAR))\r
+ {\r
+ CurDrive->DriveLetters[Count] = LogLetter[Letter];\r
+ }\r
+ Count++;\r
+ }\r
+ }\r
+\r
+ if (IsVentoyPhyDrive(CurDrive->PhyDrive, CurDrive->SizeInBytes, &MBR, &Part2StartSector))\r
+ {\r
+ CurDrive->PartStyle = (MBR.PartTbl[0].FsFlag == 0xEE) ? 1 : 0;\r
+ GetVentoyVerInPhyDrive(CurDrive, Part2StartSector, CurDrive->VentoyVersion, sizeof(CurDrive->VentoyVersion));\r
+ }\r
+ }\r
+\r
+ // for safe\r
+ for (i = 0; i < DriveCount; i++)\r
+ {\r
+ CurDrive = pDriveList + i;\r
+ if (CurDrive->Id < 0)\r
+ {\r
+ CurDrive->PhyDrive = 0x00FFFFFF;\r
+ }\r
+ }\r
+\r
+ return Id;\r
+}\r
+\r
+PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id)\r
+{\r
+ DWORD i;\r
+ for (i = 0; i < g_PhyDriveCount; i++)\r
+ {\r
+ if (g_PhyDriveList[i].Id >= 0 && g_PhyDriveList[i].Id == Id)\r
+ {\r
+ return g_PhyDriveList + i;\r
+ }\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+int SortPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount)\r
+{\r
+ DWORD i, j;\r
+ PHY_DRIVE_INFO TmpDriveInfo;\r
+\r
+ for (i = 0; i < DriveCount; i++)\r
+ {\r
+ for (j = i + 1; j < DriveCount; j++)\r
+ {\r
+ if (pDriveList[i].BusType == BusTypeUsb && pDriveList[j].BusType == BusTypeUsb)\r
+ {\r
+ if (pDriveList[i].RemovableMedia == FALSE && pDriveList[j].RemovableMedia == TRUE)\r
+ {\r
+ memcpy(&TmpDriveInfo, pDriveList + i, sizeof(PHY_DRIVE_INFO));\r
+ memcpy(pDriveList + i, pDriveList + j, sizeof(PHY_DRIVE_INFO));\r
+ memcpy(pDriveList + j, &TmpDriveInfo, sizeof(PHY_DRIVE_INFO));\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int Ventoy2DiskInit(void)\r
+{\r
+ Log("\n===================== Enum All PhyDrives =====================");\r
+ g_PhyDriveList = (PHY_DRIVE_INFO *)malloc(sizeof(PHY_DRIVE_INFO)* VENTOY_MAX_PHY_DRIVE);\r
+ if (NULL == g_PhyDriveList)\r
+ {\r
+ Log("Failed to alloc phy drive memory");\r
+ return FALSE;\r
+ }\r
+ memset(g_PhyDriveList, 0, sizeof(PHY_DRIVE_INFO)* VENTOY_MAX_PHY_DRIVE);\r
+\r
+ GetAllPhysicalDriveInfo(g_PhyDriveList, &g_PhyDriveCount);\r
+\r
+ SortPhysicalDrive(g_PhyDriveList, g_PhyDriveCount);\r
+\r
+ FilterPhysicalDrive(g_PhyDriveList, g_PhyDriveCount);\r
+\r
+ return 0;\r
+}\r
+\r
+int Ventoy2DiskDestroy(void)\r
+{\r
+ free(g_PhyDriveList);\r
+ return 0;\r
+}\r
-/******************************************************************************
- * Ventoy2Disk.h
- *
- * Copyright (c) 2020, longpanda <admin@ventoy.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __VENTOY2DISK_H__
-#define __VENTOY2DISK_H__
-
-#include <stdio.h>
-
-#define SIZE_1MB (1024 * 1024)
-#define VENTOY_EFI_PART_SIZE (32 * SIZE_1MB)
-#define VENTOY_PART1_START_SECTOR 2048
-
-#define VENTOY_FILE_BOOT_IMG "boot\\boot.img"
-#define VENTOY_FILE_STG1_IMG "boot\\core.img.xz"
-#define VENTOY_FILE_DISK_IMG "ventoy\\ventoy.disk.img.xz"
-#define VENTOY_FILE_LOG "log.txt"
-#define VENTOY_FILE_VERSION "ventoy\\version"
-
-#define DRIVE_ACCESS_TIMEOUT 15000 // How long we should retry drive access (in ms)
-#define DRIVE_ACCESS_RETRIES 150 // How many times we should retry
-
-#define IsFileExist(Fmt, ...) IsPathExist(FALSE, Fmt, __VA_ARGS__)
-#define IsDirExist(Fmt, ...) IsPathExist(TRUE, Fmt, __VA_ARGS__)
-
-#define safe_sprintf(dst, fmt, ...) sprintf_s(dst, sizeof(dst), fmt, __VA_ARGS__)
-#define safe_strcpy(dst, src) strcpy_s(dst, sizeof(dst), src)
-
-#define CHECK_CLOSE_HANDLE(Handle) \
-{\
- if (Handle != INVALID_HANDLE_VALUE) \
- {\
- CloseHandle(Handle); \
- Handle = INVALID_HANDLE_VALUE; \
- }\
-}
-
-#define LASTERR GetLastError()
-
-#pragma pack(1)
-typedef struct PART_TABLE
-{
- UINT8 Active; // 0x00 0x80
-
- UINT8 StartHead;
- UINT16 StartSector : 6;
- UINT16 StartCylinder : 10;
-
- UINT8 FsFlag;
-
- UINT8 EndHead;
- UINT16 EndSector : 6;
- UINT16 EndCylinder : 10;
-
- UINT32 StartSectorId;
- UINT32 SectorCount;
-}PART_TABLE;
-
-typedef struct MBR_HEAD
-{
- UINT8 BootCode[446];
- PART_TABLE PartTbl[4];
- UINT8 Byte55;
- UINT8 ByteAA;
-}MBR_HEAD;
-
-typedef struct VTOY_GPT_HDR
-{
- CHAR Signature[8]; /* EFI PART */
- UINT8 Version[4];
- UINT32 Length;
- UINT32 Crc;
- UINT8 Reserved1[4];
- UINT64 EfiStartLBA;
- UINT64 EfiBackupLBA;
- UINT64 PartAreaStartLBA;
- UINT64 PartAreaEndLBA;
- GUID DiskGuid;
- UINT64 PartTblStartLBA;
- UINT32 PartTblTotNum;
- UINT32 PartTblEntryLen;
- UINT32 PartTblCrc;
- UINT8 Reserved2[420];
-}VTOY_GPT_HDR;
-
-typedef struct VTOY_GPT_PART_TBL
-{
- GUID PartType;
- GUID PartGuid;
- UINT64 StartLBA;
- UINT64 LastLBA;
- UINT64 Attr;
- UINT16 Name[36];
-}VTOY_GPT_PART_TBL;
-
-typedef struct VTOY_GPT_INFO
-{
- MBR_HEAD MBR;
- VTOY_GPT_HDR Head;
- VTOY_GPT_PART_TBL PartTbl[128];
-}VTOY_GPT_INFO;
-
-#pragma pack()
-
-#define VENTOY_MAX_PHY_DRIVE 128
-
-typedef struct PHY_DRIVE_INFO
-{
- int Id;
- int PhyDrive;
- int PartStyle;//0:MBR 1:GPT
- UINT64 SizeInBytes;
- BYTE DeviceType;
- BOOL RemovableMedia;
- CHAR VendorId[128];
- CHAR ProductId[128];
- CHAR ProductRev[128];
- CHAR SerialNumber[128];
- STORAGE_BUS_TYPE BusType;
-
- int FirstDriveLetter;
- CHAR VentoyVersion[32];
-
-}PHY_DRIVE_INFO;
-
-typedef enum PROGRESS_POINT
-{
- PT_START = 0,
- PT_LOCK_FOR_CLEAN,
- PT_DEL_ALL_PART,
- PT_LOCK_FOR_WRITE,
- PT_FORMAT_PART1,
- PT_LOCK_VOLUME = PT_FORMAT_PART1,
- PT_FORMAT_PART2,
-
- PT_WRITE_VENTOY_START,
- PT_WRITE_VENTOY_FINISH = PT_WRITE_VENTOY_START + 32,
-
- PT_WRITE_STG1_IMG,
- PT_WRITE_PART_TABLE,
- PT_MOUNT_VOLUME,
-
- PT_FINISH
-}PROGRESS_POINT;
-
-#define PROGRESS_BAR_SET_POS(pos) SetProgressBarPos(pos)
-
-extern PHY_DRIVE_INFO *g_PhyDriveList;
-extern DWORD g_PhyDriveCount;
-extern int g_ForceOperation;
-extern HWND g_ProgressBarHwnd;
-extern HFONT g_language_normal_font;
-extern HFONT g_language_bold_font;
-
-void Log(const char *Fmt, ...);
-BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);
-void DumpWindowsVersion(void);
-const CHAR* GetLocalVentoyVersion(void);
-const CHAR* ParseVentoyVersionFromString(CHAR *Buf);
-CHAR GetFirstUnusedDriveLetter(void);
-const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type);
-int VentoyGetLocalBootImg(MBR_HEAD *pMBR);
-int GetHumanReadableGBSize(UINT64 SizeBytes);
-void TrimString(CHAR *String);
-int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle);
-int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo);
-BOOL IsVentoyLogicalDrive(CHAR DriveLetter);
-int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue);
-int GetPhysicalDriveCount(void);
-int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);
-int GetPhyDriveByLogicalDrive(int DriveLetter);
-int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen);
-int Ventoy2DiskInit(void);
-int Ventoy2DiskDestroy(void);
-PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id);
-int ParseCmdLineOption(LPSTR lpCmdLine);
-int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle);
-int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);
-int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead);
-void SetProgressBarPos(int Pos);
-int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen);
-int INIT unxz(unsigned char *in, int in_size,
- int(*fill)(void *dest, unsigned int size),
- int(*flush)(void *src, unsigned int size),
- unsigned char *out, int *in_used,
- void(*error)(char *x));
-void disk_io_set_param(HANDLE Handle, UINT64 SectorCount);
-INT_PTR CALLBACK PartDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
-int GetReservedSpaceInMB(void);
-int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);
-int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);
-int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);
-UINT32 VentoyCrc32(void *Buffer, UINT32 Length);
-
-#define SET_FILE_POS(pos) \
- liCurrentPosition.QuadPart = pos; \
- SetFilePointerEx(hDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN)\
-
-
-#endif
+/******************************************************************************\r
+ * Ventoy2Disk.h\r
+ *\r
+ * Copyright (c) 2020, longpanda <admin@ventoy.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License as\r
+ * published by the Free Software Foundation; either version 3 of the\r
+ * License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+\r
+#ifndef __VENTOY2DISK_H__\r
+#define __VENTOY2DISK_H__\r
+\r
+#include <stdio.h>\r
+\r
+#define SIZE_1MB (1024 * 1024)\r
+#define VENTOY_EFI_PART_SIZE (32 * SIZE_1MB)\r
+#define VENTOY_PART1_START_SECTOR 2048\r
+\r
+#define VENTOY_FILE_BOOT_IMG "boot\\boot.img"\r
+#define VENTOY_FILE_STG1_IMG "boot\\core.img.xz"\r
+#define VENTOY_FILE_DISK_IMG "ventoy\\ventoy.disk.img.xz"\r
+#define VENTOY_FILE_LOG "log.txt"\r
+#define VENTOY_FILE_VERSION "ventoy\\version"\r
+\r
+#define DRIVE_ACCESS_TIMEOUT 15000 // How long we should retry drive access (in ms)\r
+#define DRIVE_ACCESS_RETRIES 150 // How many times we should retry\r
+\r
+#define IsFileExist(Fmt, ...) IsPathExist(FALSE, Fmt, __VA_ARGS__)\r
+#define IsDirExist(Fmt, ...) IsPathExist(TRUE, Fmt, __VA_ARGS__)\r
+\r
+#define safe_sprintf(dst, fmt, ...) sprintf_s(dst, sizeof(dst), fmt, __VA_ARGS__)\r
+#define safe_strcpy(dst, src) strcpy_s(dst, sizeof(dst), src)\r
+\r
+#define CHECK_CLOSE_HANDLE(Handle) \\r
+{\\r
+ if (Handle != INVALID_HANDLE_VALUE) \\r
+ {\\r
+ CloseHandle(Handle); \\r
+ Handle = INVALID_HANDLE_VALUE; \\r
+ }\\r
+}\r
+\r
+#define LASTERR GetLastError()\r
+\r
+#pragma pack(1)\r
+typedef struct PART_TABLE\r
+{\r
+ UINT8 Active; // 0x00 0x80\r
+\r
+ UINT8 StartHead;\r
+ UINT16 StartSector : 6;\r
+ UINT16 StartCylinder : 10;\r
+\r
+ UINT8 FsFlag;\r
+\r
+ UINT8 EndHead;\r
+ UINT16 EndSector : 6;\r
+ UINT16 EndCylinder : 10;\r
+\r
+ UINT32 StartSectorId;\r
+ UINT32 SectorCount;\r
+}PART_TABLE;\r
+\r
+typedef struct MBR_HEAD\r
+{\r
+ UINT8 BootCode[446];\r
+ PART_TABLE PartTbl[4];\r
+ UINT8 Byte55;\r
+ UINT8 ByteAA;\r
+}MBR_HEAD;\r
+\r
+typedef struct VTOY_GPT_HDR\r
+{\r
+ CHAR Signature[8]; /* EFI PART */\r
+ UINT8 Version[4];\r
+ UINT32 Length;\r
+ UINT32 Crc;\r
+ UINT8 Reserved1[4];\r
+ UINT64 EfiStartLBA;\r
+ UINT64 EfiBackupLBA;\r
+ UINT64 PartAreaStartLBA;\r
+ UINT64 PartAreaEndLBA;\r
+ GUID DiskGuid;\r
+ UINT64 PartTblStartLBA;\r
+ UINT32 PartTblTotNum;\r
+ UINT32 PartTblEntryLen;\r
+ UINT32 PartTblCrc;\r
+ UINT8 Reserved2[420];\r
+}VTOY_GPT_HDR;\r
+\r
+typedef struct VTOY_GPT_PART_TBL\r
+{\r
+ GUID PartType;\r
+ GUID PartGuid;\r
+ UINT64 StartLBA;\r
+ UINT64 LastLBA;\r
+ UINT64 Attr;\r
+ UINT16 Name[36];\r
+}VTOY_GPT_PART_TBL;\r
+\r
+typedef struct VTOY_GPT_INFO\r
+{\r
+ MBR_HEAD MBR;\r
+ VTOY_GPT_HDR Head;\r
+ VTOY_GPT_PART_TBL PartTbl[128];\r
+}VTOY_GPT_INFO;\r
+\r
+#pragma pack()\r
+\r
+#define VENTOY_MAX_PHY_DRIVE 128\r
+\r
+typedef struct PHY_DRIVE_INFO\r
+{\r
+ int Id;\r
+ int PhyDrive;\r
+ int PartStyle;//0:MBR 1:GPT\r
+ UINT64 SizeInBytes;\r
+ BYTE DeviceType;\r
+ BOOL RemovableMedia;\r
+ CHAR VendorId[128];\r
+ CHAR ProductId[128];\r
+ CHAR ProductRev[128];\r
+ CHAR SerialNumber[128];\r
+ STORAGE_BUS_TYPE BusType;\r
+\r
+ CHAR DriveLetters[64];\r
+\r
+ CHAR VentoyVersion[32];\r
+\r
+}PHY_DRIVE_INFO;\r
+\r
+typedef enum PROGRESS_POINT\r
+{\r
+ PT_START = 0,\r
+ PT_LOCK_FOR_CLEAN,\r
+ PT_DEL_ALL_PART,\r
+ PT_LOCK_FOR_WRITE,\r
+ PT_FORMAT_PART1,\r
+ PT_LOCK_VOLUME = PT_FORMAT_PART1,\r
+ PT_FORMAT_PART2,\r
+\r
+ PT_WRITE_VENTOY_START,\r
+ PT_WRITE_VENTOY_FINISH = PT_WRITE_VENTOY_START + 32,\r
+\r
+ PT_WRITE_STG1_IMG,\r
+ PT_WRITE_PART_TABLE,\r
+ PT_MOUNT_VOLUME,\r
+\r
+ PT_FINISH\r
+}PROGRESS_POINT;\r
+\r
+#define PROGRESS_BAR_SET_POS(pos) SetProgressBarPos(pos)\r
+\r
+extern PHY_DRIVE_INFO *g_PhyDriveList;\r
+extern DWORD g_PhyDriveCount;\r
+extern int g_ForceOperation;\r
+extern HWND g_ProgressBarHwnd;\r
+extern HFONT g_language_normal_font;\r
+extern HFONT g_language_bold_font;\r
+\r
+void Log(const char *Fmt, ...);\r
+BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);\r
+void DumpWindowsVersion(void);\r
+const CHAR* GetLocalVentoyVersion(void);\r
+const CHAR* ParseVentoyVersionFromString(CHAR *Buf);\r
+CHAR GetFirstUnusedDriveLetter(void);\r
+const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type);\r
+int VentoyGetLocalBootImg(MBR_HEAD *pMBR);\r
+int GetHumanReadableGBSize(UINT64 SizeBytes);\r
+void TrimString(CHAR *String);\r
+int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle);\r
+int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo);\r
+BOOL IsVentoyLogicalDrive(CHAR DriveLetter);\r
+int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue);\r
+int GetPhysicalDriveCount(void);\r
+int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);\r
+int GetPhyDriveByLogicalDrive(int DriveLetter);\r
+int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen);\r
+int Ventoy2DiskInit(void);\r
+int Ventoy2DiskDestroy(void);\r
+PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id);\r
+int ParseCmdLineOption(LPSTR lpCmdLine);\r
+int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle);\r
+int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);\r
+int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead);\r
+void SetProgressBarPos(int Pos);\r
+int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen);\r
+int INIT unxz(unsigned char *in, int in_size,\r
+ int(*fill)(void *dest, unsigned int size),\r
+ int(*flush)(void *src, unsigned int size),\r
+ unsigned char *out, int *in_used,\r
+ void(*error)(char *x));\r
+void disk_io_set_param(HANDLE Handle, UINT64 SectorCount);\r
+INT_PTR CALLBACK PartDialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);\r
+int GetReservedSpaceInMB(void);\r
+int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);\r
+int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);\r
+int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);\r
+UINT32 VentoyCrc32(void *Buffer, UINT32 Length);\r
+\r
+#define SET_FILE_POS(pos) \\r
+ liCurrentPosition.QuadPart = pos; \\r
+ SetFilePointerEx(hDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN)\\r
+\r
+\r
+#endif\r
return 1;
}
+static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)
+{
+ int rc = 1;
+ BOOL bRet;
+ DWORD dwBytes;
+ HANDLE hDrive;
+ CHAR PhyPath[MAX_PATH];
+ STARTUPINFOA Si;
+ PROCESS_INFORMATION Pi;
+ GET_LENGTH_INFORMATION LengthInfo;
+
+ Log("DecompressInjectionArchive %s", archive);
+
+ sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", PhyDrive);
+ hDrive = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
+ if (hDrive == INVALID_HANDLE_VALUE)
+ {
+ Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());
+ goto End;
+ }
+
+ bRet = DeviceIoControl(hDrive, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &LengthInfo, sizeof(LengthInfo), &dwBytes, NULL);
+ if (!bRet)
+ {
+ Log("Could not get phy disk %s size, error:%u", PhyPath, GetLastError());
+ goto End;
+ }
+
+ g_FatPhyDrive = hDrive;
+ g_Part2StartSec = (LengthInfo.Length.QuadPart - VENTOY_EFI_PART_SIZE) / 512;
+
+ Log("Parse FAT fs...");
+
+ fl_init();
+
+ if (0 == fl_attach_media(VentoyFatDiskRead, NULL))
+ {
+ if (g_64bit_system)
+ {
+ CopyFileFromFatDisk("/ventoy/7z/64/7za.exe", "ventoy\\7za.exe");
+ }
+ else
+ {
+ CopyFileFromFatDisk("/ventoy/7z/32/7za.exe", "ventoy\\7za.exe");
+ }
+
+ sprintf_s(PhyPath, sizeof(PhyPath), "ventoy\\7za.exe x -y -aoa -oX:\\ %s", archive);
+
+ Log("extract inject to X:");
+
+ GetStartupInfoA(&Si);
+
+ Si.dwFlags |= STARTF_USESHOWWINDOW;
+ Si.wShowWindow = SW_HIDE;
+
+ CreateProcessA(NULL, PhyPath, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);
+ WaitForSingleObject(Pi.hProcess, INFINITE);
+ }
+ fl_shutdown();
+
+End:
+
+ SAFE_CLOSE_HANDLE(hDrive);
+
+ return rc;
+}
+
static int ProcessUnattendedInstallation(const char *script)
{
DWORD dw;
Log("auto install no need");
}
+ if (g_windows_data.injection_archive[0])
+ {
+ sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);
+ if (IsPathExist(FALSE, "%s", IsoPath))
+ {
+ Log("decompress injection archive %s...", IsoPath);
+ DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);
+ }
+ else
+ {
+ Log("injection archive %s not exist", IsoPath);
+ }
+ }
+ else
+ {
+ Log("no injection archive found");
+ }
+
return 0;
}
typedef struct ventoy_windows_data
{
char auto_install_script[384];
+ char injection_archive[384];
UINT8 reserved[128];
}ventoy_windows_data;