1.0.16 release
|
@ -70,7 +70,7 @@ CONST CHAR16 *gEfiBootFileName[] =
|
|||
L"\\EFI\\BOOT\\GRUBX64.EFI",
|
||||
L"\\EFI\\BOOT\\BOOTx64.EFI",
|
||||
L"\\EFI\\BOOT\\bootx64.efi",
|
||||
L"\\efi\\boot\\bootx64.efi"
|
||||
L"\\efi\\boot\\bootx64.efi",
|
||||
};
|
||||
|
||||
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...)
|
||||
|
|
|
@ -2017,6 +2017,17 @@ static grub_err_t ventoy_cmd_dump_img_list(grub_extcmd_context_t ctxt, int argc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_cmd_dump_injection(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
(void)args;
|
||||
|
||||
ventoy_plugin_dump_injection();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_cmd_dump_auto_install(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)ctxt;
|
||||
|
@ -2361,6 +2372,7 @@ static cmd_para ventoy_cmds[] =
|
|||
{ "vt_dynamic_menu", ventoy_cmd_dynamic_menu, 0, NULL, "", "", NULL },
|
||||
{ "vt_check_mode", ventoy_cmd_check_mode, 0, NULL, "", "", NULL },
|
||||
{ "vt_dump_img_list", ventoy_cmd_dump_img_list, 0, NULL, "", "", NULL },
|
||||
{ "vt_dump_injection", ventoy_cmd_dump_injection, 0, NULL, "", "", NULL },
|
||||
{ "vt_dump_auto_install", ventoy_cmd_dump_auto_install, 0, NULL, "", "", NULL },
|
||||
{ "vt_dump_persistence", ventoy_cmd_dump_persistence, 0, NULL, "", "", NULL },
|
||||
{ "vt_select_auto_install", ventoy_cmd_sel_auto_install, 0, NULL, "", "", NULL },
|
||||
|
|
|
@ -672,6 +672,7 @@ void ventoy_swap_img(img_info *img1, img_info *img2);
|
|||
char * ventoy_plugin_get_cur_install_template(const char *isopath);
|
||||
install_template * ventoy_plugin_find_install_template(const char *isopath);
|
||||
persistence_config * ventoy_plugin_find_persistent(const char *isopath);
|
||||
void ventoy_plugin_dump_injection(void);
|
||||
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);
|
||||
|
|
|
@ -1087,6 +1087,20 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
|
|||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
void ventoy_plugin_dump_injection(void)
|
||||
{
|
||||
injection_config *node = NULL;
|
||||
|
||||
for (node = g_injection_head; node; node = node->next)
|
||||
{
|
||||
grub_printf("\nIMAGE:<%s>\n", node->isopath);
|
||||
grub_printf("ARCHIVE:<%s>\n", node->archive);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void ventoy_plugin_dump_auto_install(void)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -726,10 +726,17 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath)
|
|||
script = (char *)ventoy_plugin_get_injection(pos);
|
||||
if (script)
|
||||
{
|
||||
debug("injection archive <%s>\n", script);
|
||||
if (ventoy_check_file_exist("%s%s", ventoy_get_env("vtoy_iso_part"), script))
|
||||
{
|
||||
debug("injection archive <%s> OK\n", script);
|
||||
grub_snprintf(data->injection_archive, sizeof(data->injection_archive) - 1, "%s", script);
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("injection archive <%s> NOT exist\n", script);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("injection archive not configed %s\n", pos);
|
||||
}
|
||||
|
|
|
@ -186,21 +186,31 @@ fi
|
|||
# Step 3 : Extract injection archive #
|
||||
# #
|
||||
####################################################################
|
||||
if [ -e $VTOY_PATH/ventoy_injection ]; then
|
||||
echo "decompress injection ..." >>$VTLOG
|
||||
|
||||
ventoy_unpack_injection() {
|
||||
vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $VTOY_PATH/ventoy_injection)
|
||||
echo "vtmagic=$vtmagic ..." >>$VTLOG
|
||||
echo "ventoy_unpack_injection vtmagic=$vtmagic ..."
|
||||
|
||||
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 /
|
||||
if [ "1F8B" = "$vtmagic" ] || [ "1F9E" = "$vtmagic" ]; then
|
||||
echo "tar.gz tar -xzvf"
|
||||
tar -xzvf $VTOY_PATH/ventoy_injection -C /
|
||||
elif [ "425A" = "$vtmagic" ]; then
|
||||
echo "tar.bz2 tar -xjvf"
|
||||
tar -xjvf $VTOY_PATH/ventoy_injection -C /
|
||||
elif [ "FD37" = "$vtmagic" ]; then
|
||||
echo "tar.xz tar -xJvf"
|
||||
tar -xJvf $VTOY_PATH/ventoy_injection -C /
|
||||
elif [ "5D00" = "$vtmagic" ]; then
|
||||
echo "tar.lzma tar -xavf"
|
||||
tar -xavf $VTOY_PATH/ventoy_injection -C /
|
||||
else
|
||||
unzip -o -q $VTOY_PATH/ventoy_injection -d /
|
||||
echo "unzip -o"
|
||||
unzip -o $VTOY_PATH/ventoy_injection -d /
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -e $VTOY_PATH/ventoy_injection ]; then
|
||||
echo "### decompress injection ... ###" >>$VTLOG
|
||||
ventoy_unpack_injection > $VTOY_PATH/injection.log 2>&1
|
||||
fi
|
||||
|
||||
|
||||
|
|
|
@ -56,6 +56,15 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||
unset pager
|
||||
}
|
||||
|
||||
menuentry 'Check injection plugin configuration' --class=debug_injection {
|
||||
set pager=1
|
||||
vt_check_plugin_json $vt_plugin_path injection $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 ...'
|
||||
}
|
||||
|
|
|
@ -68,15 +68,15 @@ function ventoy_localboot {
|
|||
}
|
||||
|
||||
function ventoy_ext_menu {
|
||||
#if [ -e $vt_plugin_path/ventoy/ventoy_grub.cfg ]; then
|
||||
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
|
||||
else
|
||||
echo "ventoy_grub.cfg NOT exist."
|
||||
echo -e "\npress ENTER to exit ..."
|
||||
read vtInputKey
|
||||
fi
|
||||
}
|
||||
|
||||
function get_os_type {
|
||||
|
|
After Width: | Height: | Size: 241 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 916 B |
After Width: | Height: | Size: 152 B |
After Width: | Height: | Size: 154 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 178 B |
After Width: | Height: | Size: 178 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 181 B |
After Width: | Height: | Size: 181 B |
After Width: | Height: | Size: 154 B |
After Width: | Height: | Size: 318 B |
After Width: | Height: | Size: 99 B |
After Width: | Height: | Size: 190 B |
After Width: | Height: | Size: 184 B |
After Width: | Height: | Size: 976 B |
After Width: | Height: | Size: 952 B |
After Width: | Height: | Size: 963 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 963 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 952 B |
|
@ -0,0 +1,80 @@
|
|||
|
||||
desktop-image: "background.png"
|
||||
title-text: " "
|
||||
title-color: "#ffffff"
|
||||
message-color: "#f2f2f2"
|
||||
|
||||
terminal-box: "terminal_box_*.png"
|
||||
|
||||
+ boot_menu {
|
||||
left = 10%
|
||||
width = 80%
|
||||
top = 30%
|
||||
height = 50%
|
||||
|
||||
menu_pixmap_style = "menu_*.png"
|
||||
|
||||
item_color = "#ffffff"
|
||||
item_height = 30
|
||||
|
||||
item_spacing = 1
|
||||
item_padding = 1
|
||||
|
||||
selected_item_color= "#f2f2f2"
|
||||
selected_item_pixmap_style = "select_*.png"
|
||||
|
||||
item_icon_space = 0
|
||||
|
||||
scrollbar = true
|
||||
scrollbar_width = 10
|
||||
scrollbar_thumb = "slider_*.png"
|
||||
}
|
||||
|
||||
+ progress_bar {
|
||||
id = "__timeout__"
|
||||
text = "@TIMEOUT_NOTIFICATION_SHORT@"
|
||||
|
||||
left = 20%
|
||||
width = 60%
|
||||
top = 85%
|
||||
|
||||
text_color = "red"
|
||||
bar_style = "*"
|
||||
highlight_style = "*"
|
||||
}
|
||||
|
||||
+ hbox{
|
||||
left = 30%
|
||||
top = 95%
|
||||
width = 10%
|
||||
height = 25
|
||||
+ label {text = "@VTOY_HOTKEY_TIP@" color = "blue" align = "left"}
|
||||
}
|
||||
|
||||
|
||||
+ hbox{
|
||||
left = 30%
|
||||
top = 95%-25
|
||||
width = 10%
|
||||
height = 25
|
||||
+ label {text = "@VTOY_MEM_DISK@" color = "red" align = "left"}
|
||||
}
|
||||
|
||||
|
||||
+ hbox{
|
||||
left = 30%
|
||||
top = 95%-50
|
||||
width = 10%
|
||||
height = 25
|
||||
+ label {text = "@VTOY_ISO_RAW@" color = "red" align = "left"}
|
||||
}
|
||||
|
||||
|
||||
+ hbox{
|
||||
left = 90%
|
||||
top = 55
|
||||
width = 10%
|
||||
height = 25
|
||||
+ label {text = "@VTOY_ISO_UEFI_DRV@" color = "red" align = "left"}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
{
|
||||
"control": [
|
||||
{ "VTOY_DEFAULT_MENU_MODE": "1" },
|
||||
{ "VTOY_FILT_DOT_UNDERSCORE_FILE": "1" }
|
||||
],
|
||||
|
||||
"theme": {
|
||||
"file": "/ventoy/theme/theme.txt",
|
||||
"display_mode": "GUI",
|
||||
"ventoy_left": "5%",
|
||||
"ventoy_top": "95%",
|
||||
"ventoy_color": "#0000ff"
|
||||
},
|
||||
|
||||
|
||||
"menu_class": [
|
||||
{
|
||||
"key": "ubuntu",
|
||||
"class": "ubuntu"
|
||||
},
|
||||
{
|
||||
"key": "deepin",
|
||||
"class": "deepin"
|
||||
},
|
||||
{
|
||||
"dir": "rhel",
|
||||
"class": "red-hat"
|
||||
}
|
||||
],
|
||||
|
||||
"menu_alias": [
|
||||
{
|
||||
"image": "/ISO/MX-19.1_x64.iso",
|
||||
"alias": "MX 19.1 ISO file For me"
|
||||
},
|
||||
{
|
||||
"image": "/cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso",
|
||||
"alias": "我的 Windows 10 系统"
|
||||
}
|
||||
],
|
||||
|
||||
"auto_install": [
|
||||
{
|
||||
"image": "/ISO/cn_windows_10.iso",
|
||||
"template": "/ventoy/script/windows_unattended.cfg"
|
||||
},
|
||||
{
|
||||
"image": "/ISO/cn_windows_server_2012_r2_vl_x64_dvd_2979220.iso",
|
||||
"template": [
|
||||
"/ventoy/script/windows_unattended1.xml",
|
||||
"/ventoy/script/windows_unattended2.xml",
|
||||
"/ventoy/script/windows_unattended3.xml",
|
||||
"/ventoy/script/windows_unattended4.xml",
|
||||
"/ventoy/script/windows_unattended5.xml",
|
||||
"/ventoy/script/windows_unattended6.xml"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
menuentry "My Custom Menu" --class=custom {
|
||||
echo 'This is custom menu ... '
|
||||
sleep 1
|
||||
}
|
||||
|
||||
submenu 'My Custom SubMenu -->' --class=customsub {
|
||||
menuentry "My Custom Menu2" --class=custom2 {
|
||||
echo 'This is custom menu2 ... '
|
||||
sleep 1
|
||||
}
|
||||
|
||||
menuentry '<-- Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||
echo 'Return ...'
|
||||
}
|
||||
}
|
||||
|
||||
menuentry '<-- Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||
echo 'Return ...'
|
||||
}
|
|
@ -80,6 +80,7 @@ cp -a ./tool $tmpdir/
|
|||
rm -f $tmpdir/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
|
||||
cp -a Ventoy2Disk.sh $tmpdir/
|
||||
cp -a README $tmpdir/
|
||||
cp -a plugin $tmpdir/
|
||||
cp -a CreatePersistentImg.sh $tmpdir/
|
||||
dos2unix -q $tmpdir/Ventoy2Disk.sh
|
||||
dos2unix -q $tmpdir/CreatePersistentImg.sh
|
||||
|
|
|
@ -704,31 +704,76 @@ static int DeleteVentoyPart2MountPoint(DWORD PhyDrive)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static BOOL check_tar_archive(const char *archive, CHAR *tarName)
|
||||
{
|
||||
int len;
|
||||
int nameLen;
|
||||
const char *pos = archive;
|
||||
const char *slash = archive;
|
||||
|
||||
while (*pos)
|
||||
{
|
||||
if (*pos == '\\' || *pos == '/')
|
||||
{
|
||||
slash = pos;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
|
||||
len = (int)strlen(slash);
|
||||
|
||||
if (len > 7 && (strncmp(slash + len - 7, ".tar.gz", 7) == 0 || strncmp(slash + len - 7, ".tar.xz", 7) == 0))
|
||||
{
|
||||
nameLen = (int)sprintf_s(tarName, MAX_PATH, "X:%s", slash);
|
||||
tarName[nameLen - 3] = 0;
|
||||
return TRUE;
|
||||
}
|
||||
else if (len > 8 && strncmp(slash + len - 8, ".tar.bz2", 8) == 0)
|
||||
{
|
||||
nameLen = (int)sprintf_s(tarName, MAX_PATH, "X:%s", slash);
|
||||
tarName[nameLen - 4] = 0;
|
||||
return TRUE;
|
||||
}
|
||||
else if (len > 9 && strncmp(slash + len - 9, ".tar.lzma", 9) == 0)
|
||||
{
|
||||
nameLen = (int)sprintf_s(tarName, MAX_PATH, "X:%s", slash);
|
||||
tarName[nameLen - 5] = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)
|
||||
{
|
||||
int rc = 1;
|
||||
BOOL bRet;
|
||||
DWORD dwBytes;
|
||||
HANDLE hDrive;
|
||||
CHAR PhyPath[MAX_PATH];
|
||||
HANDLE hOut;
|
||||
DWORD flags = CREATE_NO_WINDOW;
|
||||
CHAR StrBuf[MAX_PATH];
|
||||
CHAR tarName[MAX_PATH];
|
||||
STARTUPINFOA Si;
|
||||
PROCESS_INFORMATION Pi;
|
||||
PROCESS_INFORMATION NewPi;
|
||||
GET_LENGTH_INFORMATION LengthInfo;
|
||||
SECURITY_ATTRIBUTES Sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
|
||||
|
||||
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);
|
||||
sprintf_s(StrBuf, sizeof(StrBuf), "\\\\.\\PhysicalDrive%d", PhyDrive);
|
||||
hDrive = CreateFileA(StrBuf, 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());
|
||||
Log("Could not open the disk<%s>, error:%u", StrBuf, 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());
|
||||
Log("Could not get phy disk %s size, error:%u", StrBuf, GetLastError());
|
||||
goto End;
|
||||
}
|
||||
|
||||
|
@ -750,17 +795,49 @@ static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)
|
|||
CopyFileFromFatDisk("/ventoy/7z/32/7za.exe", "ventoy\\7za.exe");
|
||||
}
|
||||
|
||||
sprintf_s(PhyPath, sizeof(PhyPath), "ventoy\\7za.exe x -y -aoa -oX:\\ %s", archive);
|
||||
sprintf_s(StrBuf, sizeof(StrBuf), "ventoy\\7za.exe x -y -aoa -oX:\\ %s", archive);
|
||||
|
||||
Log("extract inject to X:");
|
||||
Log("cmdline:<%s>", StrBuf);
|
||||
|
||||
GetStartupInfoA(&Si);
|
||||
|
||||
Si.dwFlags |= STARTF_USESHOWWINDOW;
|
||||
Si.wShowWindow = SW_HIDE;
|
||||
hOut = CreateFileA("ventoy\\7z.log",
|
||||
FILE_APPEND_DATA,
|
||||
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
||||
&Sa,
|
||||
OPEN_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
|
||||
CreateProcessA(NULL, PhyPath, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);
|
||||
Si.dwFlags |= STARTF_USESTDHANDLES;
|
||||
|
||||
if (hOut != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
Si.hStdError = hOut;
|
||||
Si.hStdOutput = hOut;
|
||||
}
|
||||
|
||||
CreateProcessA(NULL, StrBuf, NULL, NULL, TRUE, flags, NULL, NULL, &Si, &Pi);
|
||||
WaitForSingleObject(Pi.hProcess, INFINITE);
|
||||
|
||||
//
|
||||
// decompress tar archive, for tar.gz/tar.xz/tar.bz2
|
||||
//
|
||||
if (check_tar_archive(archive, tarName))
|
||||
{
|
||||
Log("Decompress tar archive...<%s>", tarName);
|
||||
|
||||
sprintf_s(StrBuf, sizeof(StrBuf), "ventoy\\7za.exe x -y -aoa -oX:\\ %s", tarName);
|
||||
|
||||
CreateProcessA(NULL, StrBuf, NULL, NULL, TRUE, flags, NULL, NULL, &Si, &NewPi);
|
||||
WaitForSingleObject(NewPi.hProcess, INFINITE);
|
||||
|
||||
Log("Now delete %s", tarName);
|
||||
DeleteFileA(tarName);
|
||||
}
|
||||
|
||||
SAFE_CLOSE_HANDLE(hOut);
|
||||
}
|
||||
fl_shutdown();
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ typedef struct ventoy_windows_data
|
|||
{
|
||||
char auto_install_script[384];
|
||||
char injection_archive[384];
|
||||
UINT8 reserved[128];
|
||||
UINT8 reserved[256];
|
||||
}ventoy_windows_data;
|
||||
|
||||
#pragma pack()
|
||||
|
|