Compare commits

...

15 Commits

Author SHA1 Message Date
longpanda
5b0fca8468 1.0.70 release 2022-02-19 10:28:09 +08:00
marcellogianola
27918eb3f9 Update languages.json (#1435) 2022-02-19 10:18:52 +08:00
Tayfun Akkoyun
7859271b20 Update tr_TR.txt (#1452) 2022-02-19 10:18:19 +08:00
longpanda
1c27c0b489 Updated help files (#1460) 2022-02-19 09:51:31 +08:00
longpanda
0f89c2767f Fix the bug when booting Windows 7 iso files in local disk. 2022-02-18 23:47:27 +08:00
longpanda
d1584c10b4 Add tip when save ventoy.json failed. 2022-02-18 09:48:57 +08:00
longpanda
43e921878b Fix a bug when creating multi-mod configuration for img_list in VentoyPlugson. 2022-02-17 20:06:18 +08:00
longpanda
23f4f18e27 Auto use grub2 mode for krd.iso 2022-02-17 12:15:57 +08:00
longpanda
53b95ae17b Support latest Qubes 4.1.0 release. 2022-02-17 11:40:54 +08:00
longpanda
e3506c0f10 Add cmdline check 2022-02-17 11:09:31 +08:00
longpanda
9118d5fe45 Add check for vlnk file suffix in save as 2022-02-17 10:49:56 +08:00
longpanda
f130325a9c Add commad line option -s in VentoyVlnk.exe. 2022-02-17 10:39:04 +08:00
longpanda
1ca48923da VentoyVlnk add cmdline mode.
VentoyVlnk.exe -i xxx.iso -o xxx.vlnk.iso
2022-02-17 10:13:27 +08:00
longpanda
730fdd5198 Update help text 2022-02-16 09:39:36 +08:00
longpanda
d0f3597b26 Fix Kiosk boot issue in latest Ventoy release. (#1446) 2022-02-15 23:59:28 +08:00
21 changed files with 316 additions and 116 deletions

View File

@@ -21,7 +21,7 @@ body:
attributes: attributes:
label: Ventoy Version label: Ventoy Version
description: What version of ventoy are you running? description: What version of ventoy are you running?
placeholder: 1.0.68 placeholder: 1.0.70
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@@ -78,8 +78,14 @@ ventoy_unpack_initramfs() {
rm -f $VTOY_PATH/xzlog rm -f $VTOY_PATH/xzlog
${vtx:5} $vtfile 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp) ${vtx:5} $vtfile 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
if grep -q 'corrupted data' $VTOY_PATH/xzlog; then if grep -q 'corrupted data' $VTOY_PATH/xzlog; then
echo 'xzcat failed, now try xzcat_musl ...' >> $VTLOG echo 'xzcat failed, now try xzminidec...' >> $VTLOG
xzcat_musl $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp) rm -f $VTOY_PATH/xzlog
cat $vtfile | xzminidec 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
if grep -q 'limit' $VTOY_PATH/xzlog; then
echo 'xzminidec failed, now try xzcat_musl ...' >> $VTLOG
xzcat_musl $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
fi
fi fi
else else
${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp) ${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)

View File

@@ -257,6 +257,10 @@ function distro_specify_initrd_file {
vt_linux_specify_initrd_file /isolinux/initrd.gz vt_linux_specify_initrd_file /isolinux/initrd.gz
fi fi
if vt_str_begin "$vt_volume_id" "QUBES"; then
vt_linux_specify_initrd_file /images/pxeboot/initrd.img
fi
if [ "$vt_chosen_size" = "1133375488" ]; then if [ "$vt_chosen_size" = "1133375488" ]; then
if [ -d (loop)/boot/grub/x86_64-efi ]; then if [ -d (loop)/boot/grub/x86_64-efi ]; then
vt_cpio_busybox64 "64h" vt_cpio_busybox64 "64h"
@@ -742,7 +746,16 @@ function uefi_linux_menu_func {
ventoy_acpi_param ${vtoy_chain_mem_addr} 2048 ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
ventoy_cli_console ventoy_cli_console
unset vtGrub2Mode
if vt_check_mode 3; then if vt_check_mode 3; then
set vtGrub2Mode=1
elif vt_str_begin "$vt_volume_id" "KRD"; then
if [ -f (loop)/boot/grub/grub.cfg.sig ]; then
set vtGrub2Mode=1
fi
fi
if [ -n "$vtGrub2Mode" ]; then
ventoy_debug_pause ventoy_debug_pause
else else
if [ "$VTOY_EFI_ARCH" != "mips" ]; then if [ "$VTOY_EFI_ARCH" != "mips" ]; then
@@ -2069,7 +2082,7 @@ function img_unsupport_menuentry {
############################################################# #############################################################
############################################################# #############################################################
set VENTOY_VERSION="1.0.69" set VENTOY_VERSION="1.0.70"
#ACPI not compatible with Window7/8, so disable by default #ACPI not compatible with Window7/8, so disable by default
set VTOY_PARAM_NO_ACPI=1 set VTOY_PARAM_NO_ACPI=1

View File

@@ -1,17 +1,18 @@
h - Prikazuje ove informacije h - Prikazuje ove informacije
F1 - Memdisk način rada (samo za male WinPE/LiveCD imidž fajlove) F1 - Memdisk način rada (samo za male WinPE/LiveCD imidž fajlove)
F2 - Browse and boot files in local disk F2 - Pokreće imidž fajlove na lokalnom disku
F3 - Mijenja meni između TreeView <-> ListView F3 - Mijenja meni između TreeView <-> ListView
F4 - Pokreće Windows/Linux na lokalnom disku F4 - Pokreće Windows/Linux na lokalnom disku
F5 - Postavke F5 - Alati
F6 - Učitava prilagođen GRUB2 meni F6 - Učitava prilagođen GRUB2 meni
F7 - Mijenja između GUI načina rada <-> TEXT načina rada F7 - Mijenja između GUI <-> TEXT načina rada
m - Generira kontrolnu sumu odabranog imidž fajla (md5/sha1/sha256/sha512) m - Generira heš odabranog imidž fajla (md5/sha1/sha256/sha512)
Ctrl + w - WIMBOOT način rada (samo za standardne Windows imidž fajlove) Ctrl+w - WIMBOOT način rada (samo za standardne Windows imidž fajlove)
Ctrl + r - GRUB2 način rada (samo za neke Linux distribucije) Ctrl+r - GRUB2 način rada (samo za neke Linux distribucije)
Ctrl + i - Kompatibilni način rada (samo za testiranje) Ctrl+i - Kompatibilni način rada (samo za testiranje)
Ctrl + u - Load ISO efi driver (Just only for debug, can not be used officially) Ctrl+u - Učitava EFI drajver za imidž fajlove (samo za testiranje)
Pritisnite ESC za povratak...
Pritisnite ESC za povratak ......

View File

@@ -1,17 +0,0 @@
h - Приказује ове информације
F1 - Memdisk начин рада (само за мале WinPE/LiveCD имиџ фајлове)
F2 - Browse and boot files in local disk
F3 - Мијења мени између TreeView <-> ListView
F4 - Покреће Windows/Linux на локалном диску
F5 - Поставке
F6 - Учитава прилагођен GRUB2 мени
F7 - Мијења између GUI начина рада <-> TEXT начина рада
m - Генерира контролну суму одабраног имиџ фајла (md5/sha1/sha256/sha512)
Ctrl + w - WIMBOOT начин рада (само за стандардне Windows имиџ фајлове)
Ctrl + r - GRUB2 начин рада (само за неке Linux дистрибуције)
Ctrl + i - Компатибилни начин рада (само за тестиранје)
Ctrl + u - Load ISO efi driver (Just only for debug, can not be used officially)
Притисните ESC за повратак...

View File

@@ -0,0 +1,18 @@
h - Приказује ове информације
F1 - Memdisk начин рада (само за мале WinPE/LiveCD имиџ фајлове)
F2 - Покреће имиџ фајлове на локалном диску
F3 - Мења мени између TreeView <-> ListView
F4 - Покреће Windows/Linux на локалном диску
F5 - Алати
F6 - Учитава прилагођен GRUB2 мени
F7 - Мења између GUI <-> TEXT начина рада
m - Генерира хеш одабраног имиџ фајла (md5/sha1/sha256/sha512)
Ctrl+w - WIMBOOT начин рада (само за стандардне Windows имиџ фајлове)
Ctrl+r - GRUB2 начин рада (само за неке Linux дистрибуције)
Ctrl+i - Компатибилни начин рада (само за тестирање)
Ctrl+u - Учитава EFI драјвер за имиџ фајлове (само за тестирање)
Притисните ESC за повратак ......

View File

@@ -1,17 +0,0 @@
h - Prikazuje ove informacije
F1 - Memdisk način rada (samo za male WinPE/LiveCD imidž fajlove)
F2 - Browse and boot files in local disk
F3 - Mijenja meni između TreeView <-> ListView
F4 - Pokreće Windows/Linux na lokalnom disku
F5 - Postavke
F6 - Učitava prilagođen GRUB2 meni
F7 - Mijenja između GUI načina rada <-> TEXT načina rada
m - Generira kontrolnu sumu odabranog imidž fajla (md5/sha1/sha256/sha512)
Ctrl + w - WIMBOOT način rada (samo za standardne Windows imidž fajlove)
Ctrl + r - GRUB2 način rada (samo za neke Linux distribucije)
Ctrl + i - Kompatibilni način rada (samo za testiranje)
Ctrl+u - Load ISO efi driver (Just only for debug, can not be used officially)
Pritisnite ESC za povratak...

View File

@@ -1,6 +1,6 @@
h - Yardım bilgilerini göster h - Yardım bilgilerini göster
F1 - Memdisk Modu başlatır(Yalnızca küçük WinPE/LiveCD ISO/IMG ler için bu modu kullanabilirsiniz) F1 - Memdisk Modu başlatır(Yalnızca küçük WinPE/LiveCD ISO/IMG ler için bu modu kullanabilirsiniz)
F2 - Browse and boot files in local disk F2 - Yerel diskteki dosyalara GÖZAT ve ÖNYÜKLE'meyi sağlar
F3 - Ventoy Menü modu olarak,Klasör görünümü(Treeview) ile Liste görünümü(ListView) arasında geçiş yapmayı sağlar. F3 - Ventoy Menü modu olarak,Klasör görünümü(Treeview) ile Liste görünümü(ListView) arasında geçiş yapmayı sağlar.
F4 - Bilgisayarınızda yüklü olan Windows yada Linux işletim sistemini, sabit diskten başlatır. F4 - Bilgisayarınızda yüklü olan Windows yada Linux işletim sistemini, sabit diskten başlatır.
F5 - Ventoy Araçlar menüsü F5 - Ventoy Araçlar menüsü

Binary file not shown.

Binary file not shown.

View File

@@ -1157,8 +1157,8 @@
"STR_INSTALL":"Installa", "STR_INSTALL":"Installa",
"STR_UPDATE":"Aggiorna", "STR_UPDATE":"Aggiorna",
"STR_UPDATE_TIP":"L'aggiornamento è sicuro, i file presenti nel dispositivo rimarranno invariati.#@Vuoi continuare?", "STR_UPDATE_TIP":"L'aggiornamento è sicuro, i file presenti nel dispositivo rimarranno invariati.#@Vuoi continuare?",
"STR_INSTALL_TIP":"Il disco verrà formattato e tutti i dati saranno persi.#@Vuoi continuare?", "STR_INSTALL_TIP":"Il dispositivo verrà formattato e tutti i dati saranno persi.#@Vuoi continuare?",
"STR_INSTALL_TIP2":"Il disco verrà formattato e tutti i dati saranno persi.#@Vuoi continuare (seconda verifica)?", "STR_INSTALL_TIP2":"Il dispositivo verrà formattato e tutti i dati saranno persi.#@Vuoi continuare (seconda verifica)?",
"STR_INSTALL_SUCCESS":"Congratulazioni!#@Installazione di Ventoy nel dispositivo completata.", "STR_INSTALL_SUCCESS":"Congratulazioni!#@Installazione di Ventoy nel dispositivo completata.",
"STR_INSTALL_FAILED":"Si è verificato un errore durante l'installazione.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt .", "STR_INSTALL_FAILED":"Si è verificato un errore durante l'installazione.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt .",
"STR_UPDATE_SUCCESS":"Congratulazioni!#@Aggiornamento di Ventoy nel dispositivo completato", "STR_UPDATE_SUCCESS":"Congratulazioni!#@Aggiornamento di Ventoy nel dispositivo completato",
@@ -1169,13 +1169,13 @@
"STR_MENU_PART_CFG":"Configurazione partizione", "STR_MENU_PART_CFG":"Configurazione partizione",
"STR_BTN_OK":"OK", "STR_BTN_OK":"OK",
"STR_BTN_CANCEL":"Annulla", "STR_BTN_CANCEL":"Annulla",
"STR_PRESERVE_SPACE":"Riserva spazio nella parte finale del disco", "STR_PRESERVE_SPACE":"Riserva spazio nella parte finale del dispositivo",
"STR_SPACE_VAL_INVALID":"Quantità di spazio da riservare non valida", "STR_SPACE_VAL_INVALID":"Quantità di spazio da riservare non valida",
"STR_MENU_CLEAR":"Rimuovi Ventoy", "STR_MENU_CLEAR":"Rimuovi Ventoy",
"STR_CLEAR_SUCCESS":"Rimozione di Ventoy dal dispositivo completata.", "STR_CLEAR_SUCCESS":"Rimozione di Ventoy dal dispositivo completata.",
"STR_CLEAR_FAILED":"Si è verificato un errore durante la rimozione di Ventoy dal dispositivo.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt.", "STR_CLEAR_FAILED":"Si è verificato un errore durante la rimozione di Ventoy dal dispositivo.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt.",
"STR_MENU_PART_STYLE":"Stile tabella partizioni", "STR_MENU_PART_STYLE":"Stile tabella partizioni",
"STR_DISK_2TB_MBR_ERROR":"Seleziona GPT per dischi con dimensioni maggiori di 2TB", "STR_DISK_2TB_MBR_ERROR":"Seleziona GPT per dispositivi con dimensioni maggiori di 2TB",
"STR_SHOW_ALL_DEV":"Visualizza tutti i dispositivi", "STR_SHOW_ALL_DEV":"Visualizza tutti i dispositivi",
"STR_PART_ALIGN_4KB":"Allinea le partizioni con 4KB", "STR_PART_ALIGN_4KB":"Allinea le partizioni con 4KB",
"STR_WEB_COMMUNICATION_ERR":"Errore di comunicazione:", "STR_WEB_COMMUNICATION_ERR":"Errore di comunicazione:",

View File

@@ -88,6 +88,7 @@ typedef struct SYSINFO
char buildtime[128]; char buildtime[128];
int syntax_error; int syntax_error;
int invalid_config; int invalid_config;
int config_save_error;
int language; int language;
int pathcase; int pathcase;

View File

@@ -325,8 +325,7 @@ static int ventoy_api_sysinfo(struct mg_connection *conn, VTOY_JSON *json)
VTOY_JSON_FMT_SINT("invalid_config", g_sysinfo.invalid_config); VTOY_JSON_FMT_SINT("invalid_config", g_sysinfo.invalid_config);
g_sysinfo.invalid_config = 0; g_sysinfo.invalid_config = 0;
#if defined(_MSC_VER) || defined(WIN32) #if defined(_MSC_VER) || defined(WIN32)
VTOY_JSON_FMT_STRN("os", "windows"); VTOY_JSON_FMT_STRN("os", "windows");
#else #else
@@ -349,6 +348,8 @@ static int ventoy_api_handshake(struct mg_connection *conn, VTOY_JSON *json)
VTOY_JSON_FMT_BEGIN(pos, JSON_BUFFER, JSON_BUF_MAX); VTOY_JSON_FMT_BEGIN(pos, JSON_BUFFER, JSON_BUF_MAX);
VTOY_JSON_FMT_OBJ_BEGIN(); VTOY_JSON_FMT_OBJ_BEGIN();
VTOY_JSON_FMT_SINT("status", 0); VTOY_JSON_FMT_SINT("status", 0);
VTOY_JSON_FMT_SINT("save_error", g_sysinfo.config_save_error);
g_sysinfo.config_save_error = 0;
VTOY_JSON_FMT_OBJ_END(); VTOY_JSON_FMT_OBJ_END();
VTOY_JSON_FMT_END(pos); VTOY_JSON_FMT_END(pos);
@@ -1775,7 +1776,9 @@ int ventoy_data_cmp_image_list(data_image_list *data1, data_image_list *data2)
int ventoy_data_save_image_list(data_image_list *data, const char *title, char *buf, int buflen) int ventoy_data_save_image_list(data_image_list *data, const char *title, char *buf, int buflen)
{ {
int pos = 0; int pos = 0;
int prelen;
path_node *node = NULL; path_node *node = NULL;
char newtitle[64];
(void)title; (void)title;
@@ -1783,17 +1786,20 @@ int ventoy_data_save_image_list(data_image_list *data, const char *title, char *
{ {
return 0; return 0;
} }
prelen = (int)strlen("image_list");
VTOY_JSON_FMT_BEGIN(pos, buf, buflen); VTOY_JSON_FMT_BEGIN(pos, buf, buflen);
if (data->type == 0) if (data->type == 0)
{ {
VTOY_JSON_FMT_KEY_L(L1, "image_list"); scnprintf(newtitle, sizeof(newtitle), "image_list%s", title + prelen);
} }
else else
{ {
VTOY_JSON_FMT_KEY_L(L1, "image_blacklist"); scnprintf(newtitle, sizeof(newtitle), "image_blacklist%s", title + prelen);
} }
VTOY_JSON_FMT_KEY_L(L1, newtitle);
VTOY_JSON_FMT_ARY_BEGIN_N(); VTOY_JSON_FMT_ARY_BEGIN_N();
@@ -3572,6 +3578,7 @@ int ventoy_http_writeback(void)
if (ret) if (ret)
{ {
vlog("Failed to write ventoy.json file.\n"); vlog("Failed to write ventoy.json file.\n");
g_sysinfo.config_save_error = 1;
} }
return 0; return 0;

View File

@@ -1 +1 @@
de_DEen_USfr_FRhr_HRid_IDja_JPpt_PTsr_CYsr_SRtr_TRzh_CN de_DEen_USfr_FRhr_HRid_IDja_JPpt_PTsr_RStr_TRzh_CN

View File

@@ -195,7 +195,7 @@
$('input:text[id=id_tip_text_top]').val(data.top); $('input:text[id=id_tip_text_top]').val(data.top);
$('input:text[id=id_tip_text_color]').val(data.color); $('input:text[id=id_tip_text_color]').val(data.color);
FillTipTable(data.tips); FillTipTable(data);
} }

View File

@@ -480,6 +480,7 @@ var g_vtoy_cur_language_en =
"STR_SECURE_BOOT_DISABLE": "Disable", "STR_SECURE_BOOT_DISABLE": "Disable",
"STR_SYNTAX_ERROR_TIP": "Syntax error detected in ventoy.json, so the configuration is not loaded!", "STR_SYNTAX_ERROR_TIP": "Syntax error detected in ventoy.json, so the configuration is not loaded!",
"STR_INVALID_CONFIG_TIP": "Invalid configuration detected in ventoy.json, so the configuration is not loaded!", "STR_INVALID_CONFIG_TIP": "Invalid configuration detected in ventoy.json, so the configuration is not loaded!",
"STR_CONFIG_SAVE_ERROR_TIP": "Failed to write ventoy.json file. Check VentoyPlugson.log for more details!",
"STR_XXX": "xxx" "STR_XXX": "xxx"
}; };
@@ -615,7 +616,7 @@ var g_vtoy_cur_language_cn =
"STR_SECURE_BOOT_DISABLE": "未开启", "STR_SECURE_BOOT_DISABLE": "未开启",
"STR_SYNTAX_ERROR_TIP": "ventoy.json 文件中存在语法错误,配置未加载!", "STR_SYNTAX_ERROR_TIP": "ventoy.json 文件中存在语法错误,配置未加载!",
"STR_INVALID_CONFIG_TIP": "ventoy.json 文件中存在错误配置,配置未加载!", "STR_INVALID_CONFIG_TIP": "ventoy.json 文件中存在错误配置,配置未加载!",
"STR_CONFIG_SAVE_ERROR_TIP": "ventoy.json 文件写入失败,详细信息请参考 VentoyPlugson.log 文件!",
"STR_XXX": "xxx" "STR_XXX": "xxx"

View File

@@ -17,7 +17,7 @@ You can also browse ISO/WIM/IMG/VHD(x)/EFI files in local disk and boot them.<br
x86 Legacy BIOS, IA32 UEFI, x86_64 UEFI, ARM64 UEFI and MIPS64EL UEFI are supported in the same way.<br/> x86 Legacy BIOS, IA32 UEFI, x86_64 UEFI, ARM64 UEFI and MIPS64EL UEFI are supported in the same way.<br/>
Both MBR and GPT partition style are supported in the same way.<br/> Both MBR and GPT partition style are supported in the same way.<br/>
Most type of OS supported(Windows/WinPE/Linux/Unix/ChromeOS/Vmware/Xen...) <br/> Most type of OS supported(Windows/WinPE/Linux/Unix/ChromeOS/Vmware/Xen...) <br/>
800+ ISO files are tested (<a href="https://www.ventoy.net/en/isolist.html">List</a>). 90%+ distros in <a href="https://distrowatch.com/">distrowatch.com</a> supported (<a href="https://www.ventoy.net/en/distrowatch.html">Details</a>). <br/> 810+ ISO files are tested (<a href="https://www.ventoy.net/en/isolist.html">List</a>). 90%+ distros in <a href="https://distrowatch.com/">distrowatch.com</a> supported (<a href="https://www.ventoy.net/en/distrowatch.html">Details</a>). <br/>
<br/>Official Website: <a href=https://www.ventoy.net>https://www.ventoy.net</a> <br/>Official Website: <a href=https://www.ventoy.net>https://www.ventoy.net</a>
</h4> </h4>
@@ -63,7 +63,7 @@ A GUI Ventoy plugin configurator. [VentoyPlugson](https://www.ventoy.net/en/plug
* FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) supported for main partition * FAT32/exFAT/NTFS/UDF/XFS/Ext2(3)(4) supported for main partition
* ISO files larger than 4GB supported * ISO files larger than 4GB supported
* Native boot menu style for Legacy & UEFI * Native boot menu style for Legacy & UEFI
* Most type of OS supported, 800+ iso files tested * Most type of OS supported, 810+ iso files tested
* Linux vDisk boot supported * Linux vDisk boot supported
* Not only boot but also complete installation process * Not only boot but also complete installation process
* Menu dynamically switchable between List/TreeView mode * Menu dynamically switchable between List/TreeView mode

View File

@@ -13,12 +13,18 @@ static CHAR g_LogFile[MAX_PATH];
static HWND g_create_button; static HWND g_create_button;
static HWND g_parse_button; static HWND g_parse_button;
static BOOL g_ShowHelp = FALSE;
static BOOL g_SaveAs = FALSE;
static WCHAR g_CmdInFile[MAX_PATH];
static WCHAR g_CmdOutFile[MAX_PATH];
typedef enum MSGID typedef enum MSGID
{ {
MSGID_ERROR = 0, MSGID_ERROR = 0,
MSGID_INFO, MSGID_INFO,
MSGID_BTN_CREATE, MSGID_BTN_CREATE,
MSGID_BTN_PARSE, MSGID_BTN_PARSE,
MSGID_SRC_NONEXIST,
MSGID_SRC_UNSUPPORTED, MSGID_SRC_UNSUPPORTED,
MSGID_FS_UNSUPPORTED, MSGID_FS_UNSUPPORTED,
MSGID_SUFFIX_UNSUPPORTED, MSGID_SUFFIX_UNSUPPORTED,
@@ -31,6 +37,7 @@ typedef enum MSGID
MSGID_VLNK_POINT_TO, MSGID_VLNK_POINT_TO,
MSGID_VLNK_NO_DST, MSGID_VLNK_NO_DST,
MSGID_FILE_NAME_TOO_LONG, MSGID_FILE_NAME_TOO_LONG,
MSGID_INVALID_SUFFIX,
MSGID_BUTT MSGID_BUTT
}MSGID; }MSGID;
@@ -42,6 +49,7 @@ const WCHAR *g_msg_cn[MSGID_BUTT] =
L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
L"ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
L"<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlnk", L"<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlnk",
L"<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ", L"<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ",
L"<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>׺<EFBFBD><EFBFBD>", L"<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>׺<EFBFBD><EFBFBD>",
@@ -54,6 +62,7 @@ const WCHAR *g_msg_cn[MSGID_BUTT] =
L"<EFBFBD><EFBFBD> vlnk <20>ļ<EFBFBD>ָ<EFBFBD><D6B8> ", L"<EFBFBD><EFBFBD> vlnk <20>ļ<EFBFBD>ָ<EFBFBD><D6B8> ",
L"<EFBFBD><EFBFBD> vlnk ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>", L"<EFBFBD><EFBFBD> vlnk ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>",
L"<EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>̫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", L"<EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>̫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
L"<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>vlnk<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>׺<EFBFBD><EFBFBD>!",
}; };
const WCHAR *g_msg_en[MSGID_BUTT] = const WCHAR *g_msg_en[MSGID_BUTT] =
{ {
@@ -61,6 +70,7 @@ const WCHAR *g_msg_en[MSGID_BUTT] =
L"Info", L"Info",
L"Create", L"Create",
L"Parse", L"Parse",
L"The specified file is not exist!",
L"This file is not supported for vlnk", L"This file is not supported for vlnk",
L"Unsupported file system!", L"Unsupported file system!",
L"Unsupported file suffix!", L"Unsupported file suffix!",
@@ -73,11 +83,28 @@ const WCHAR *g_msg_en[MSGID_BUTT] =
L"The vlnk file point to ", L"The vlnk file point to ",
L"The file pointed by the vlnk does NOT exist!", L"The file pointed by the vlnk does NOT exist!",
L"The file full path is too long!", L"The file full path is too long!",
L"Invalid vlnk file suffix!",
}; };
const WCHAR **g_msg_lang = NULL; const WCHAR **g_msg_lang = NULL;
HINSTANCE g_hInst; HINSTANCE g_hInst;
static int VtoyMessageBox
(
_In_opt_ HWND hWnd,
_In_opt_ LPCWSTR lpText,
_In_opt_ LPCWSTR lpCaption,
_In_ UINT uType
)
{
if (g_CmdInFile[0] && g_CmdOutFile[0])
{
return 0;
}
return MessageBox(hWnd, lpText, lpCaption, uType);
}
static void Log2File(const char *log) static void Log2File(const char *log)
{ {
@@ -340,11 +367,62 @@ End:
} }
static int CreateVlnk(HWND hWnd, WCHAR *Dir) static BOOL VentoyGetSaveFileName(HWND hWnd, WCHAR *szFile)
{
OPENFILENAME ofn = { 0 };
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = L"Vlnk File\0*.vlnk.iso;*.vlnk.img;*.vlnk.wim;*.vlnk.efi;*.vlnk.vhd;*.vlnk.vhdx;*.vlnk.vtoy;*.vlnk.dat\0";
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
return GetSaveFileName(&ofn);
}
static BOOL IsSupportedVlnkSuffix(WCHAR *FileName)
{
int len;
len = lstrlen(FileName);
if (len > 9)
{
if (lstrcmp(FileName + len - 9, L".vlnk.iso") == 0 ||
lstrcmp(FileName + len - 9, L".vlnk.img") == 0 ||
lstrcmp(FileName + len - 9, L".vlnk.wim") == 0 ||
lstrcmp(FileName + len - 9, L".vlnk.vhd") == 0 ||
lstrcmp(FileName + len - 9, L".vlnk.efi") == 0 ||
lstrcmp(FileName + len - 9, L".vlnk.dat") == 0)
{
return TRUE;
}
}
if (len > 10)
{
if (lstrcmp(FileName + len - 10, L".vlnk.vhdx") == 0 ||
lstrcmp(FileName + len - 10, L".vlnk.vtoy") == 0)
{
return TRUE;
}
}
return FALSE;
}
static int CreateVlnk(HWND hWnd, WCHAR *Dir, WCHAR *InFile, WCHAR *OutFile)
{ {
int i; int i;
int end; int end;
int len; int len;
BOOL SetOutFile = FALSE;
UINT32 DiskSig; UINT32 DiskSig;
DISK_EXTENT DiskExtend; DISK_EXTENT DiskExtend;
OPENFILENAME ofn = { 0 }; OPENFILENAME ofn = { 0 };
@@ -358,20 +436,27 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir)
WCHAR *Pos = NULL; WCHAR *Pos = NULL;
ventoy_vlnk *vlnk = NULL; ventoy_vlnk *vlnk = NULL;
ofn.lStructSize = sizeof(ofn); if (InFile)
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = L"Vlnk Source File\0*.iso;*.img;*.wim;*.vhd;*.vhdx;*.vtoy;*.efi;*.dat\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn) != TRUE)
{ {
return 1; wcscpy_s(szFile, MAX_PATH, InFile);
}
else
{
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = L"Vlnk Source File\0*.iso;*.img;*.wim;*.vhd;*.vhdx;*.vtoy;*.efi;*.dat\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn) != TRUE)
{
return 1;
}
} }
LogW(L"Create vlnk for <%ls>\n", szFile); LogW(L"Create vlnk for <%ls>\n", szFile);
@@ -380,7 +465,7 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir)
if (len < 5 || szFile[0] == '.' || szFile[1] != ':') if (len < 5 || szFile[0] == '.' || szFile[1] != ':')
{ {
MessageBox(hWnd, g_msg_lang[MSGID_SRC_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_SRC_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
@@ -406,7 +491,7 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir)
} }
else else
{ {
MessageBox(hWnd, g_msg_lang[MSGID_FS_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_FS_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
@@ -419,13 +504,13 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir)
if (!IsSupportedImgSuffix(suffix)) if (!IsSupportedImgSuffix(suffix))
{ {
MessageBox(hWnd, g_msg_lang[MSGID_SUFFIX_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_SUFFIX_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
if (IsVlnkFile(szFile, NULL)) if (IsVlnkFile(szFile, NULL))
{ {
MessageBox(hWnd, g_msg_lang[MSGID_ALREADY_VLNK], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_ALREADY_VLNK], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
@@ -459,17 +544,18 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir)
if (len >= VLNK_NAME_MAX) if (len >= VLNK_NAME_MAX)
{ {
LogA("File name length %d overflow\n", len); LogA("File name length %d overflow\n", len);
MessageBox(hWnd, g_msg_lang[MSGID_FILE_NAME_TOO_LONG], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_FILE_NAME_TOO_LONG], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
DiskExtend.StartingOffset.QuadPart = 0; DiskExtend.StartingOffset.QuadPart = 0;
if (GetPhyDiskInfo((char)szFile[0], &DiskSig, &DiskExtend)) if (GetPhyDiskInfo((char)szFile[0], &DiskSig, &DiskExtend))
{ {
MessageBox(hWnd, g_msg_lang[MSGID_DISK_INFO_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_DISK_INFO_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
Buf = malloc(VLNK_FILE_LEN); Buf = malloc(VLNK_FILE_LEN);
if (Buf) if (Buf)
{ {
@@ -477,24 +563,65 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir)
vlnk = (ventoy_vlnk *)Buf; vlnk = (ventoy_vlnk *)Buf;
ventoy_create_vlnk(DiskSig, (uint64_t)DiskExtend.StartingOffset.QuadPart, UTF8Path, vlnk); ventoy_create_vlnk(DiskSig, (uint64_t)DiskExtend.StartingOffset.QuadPart, UTF8Path, vlnk);
DefaultVlnkDstFullPath(Pos + 1, Dir, DstFullPath); if (OutFile)
{
wcscpy_s(DstFullPath, MAX_PATH, OutFile);
SetOutFile = TRUE;
}
else
{
DefaultVlnkDstFullPath(Pos + 1, Dir, DstFullPath);
if (g_SaveAs)
{
wcscpy_s(szFile, MAX_PATH, DstFullPath);
if (VentoyGetSaveFileName(hWnd, szFile))
{
if (IsSupportedVlnkSuffix(szFile))
{
wcscpy_s(DstFullPath, MAX_PATH, szFile);
SetOutFile = TRUE;
}
else
{
VtoyMessageBox(hWnd, g_msg_lang[MSGID_INVALID_SUFFIX], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
LogA("Invalid vlnk suffix\n");
goto end;
}
}
else
{
LogA("User cancel the save as diaglog, use default name\n");
}
}
}
LogW(L"vlnk output file path is <%ls>\n", DstFullPath); LogW(L"vlnk output file path is <%ls>\n", DstFullPath);
if (SaveBuffer2File(DstFullPath, Buf, VLNK_FILE_LEN) == 0) if (SaveBuffer2File(DstFullPath, Buf, VLNK_FILE_LEN) == 0)
{ {
WCHAR Msg[1024]; WCHAR Msg[1024];
swprintf_s(Msg, 1024, L"%ls\r\n\r\n%ls", g_msg_lang[MSGID_VLNK_SUCCESS], DstFullPath + lstrlen(Dir) + 1);
LogW(L"Vlnk file create success <%ls>\n", DstFullPath); LogW(L"Vlnk file create success <%ls>\n", DstFullPath);
MessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION);
if (SetOutFile)
{
swprintf_s(Msg, 1024, L"%ls\r\n\r\n%ls", g_msg_lang[MSGID_VLNK_SUCCESS], DstFullPath);
VtoyMessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION);
}
else
{
swprintf_s(Msg, 1024, L"%ls\r\n\r\n%ls", g_msg_lang[MSGID_VLNK_SUCCESS], DstFullPath + lstrlen(Dir) + 1);
VtoyMessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION);
}
} }
else else
{ {
LogA("Vlnk file save failed\n"); LogA("Vlnk file save failed\n");
MessageBox(hWnd, g_msg_lang[MSGID_CREATE_FILE_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_CREATE_FILE_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
} }
end:
free(Buf); free(Buf);
} }
@@ -534,7 +661,6 @@ static CHAR GetDriveLetter(UINT32 disksig, UINT64 PartOffset)
return 0; return 0;
} }
static int ParseVlnk(HWND hWnd) static int ParseVlnk(HWND hWnd)
{ {
int i; int i;
@@ -567,7 +693,7 @@ static int ParseVlnk(HWND hWnd)
if (!IsVlnkFile(szFile, &vlnk)) if (!IsVlnkFile(szFile, &vlnk))
{ {
MessageBox(hWnd, g_msg_lang[MSGID_INVALID_VLNK], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_INVALID_VLNK], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
@@ -581,7 +707,7 @@ static int ParseVlnk(HWND hWnd)
if (!IsSupportedImgSuffix(suffix)) if (!IsSupportedImgSuffix(suffix))
{ {
MessageBox(hWnd, g_msg_lang[MSGID_SUFFIX_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_SUFFIX_UNSUPPORTED], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
@@ -598,7 +724,7 @@ static int ParseVlnk(HWND hWnd)
Letter = GetDriveLetter(vlnk.disk_signature, vlnk.part_offset); Letter = GetDriveLetter(vlnk.disk_signature, vlnk.part_offset);
if (Letter == 0) if (Letter == 0)
{ {
MessageBox(hWnd, g_msg_lang[MSGID_VLNK_NO_DST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_VLNK_NO_DST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
@@ -609,13 +735,13 @@ static int ParseVlnk(HWND hWnd)
hFile = CreateFileW(szDst, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); hFile = CreateFileW(szDst, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE == hFile) if (INVALID_HANDLE_VALUE == hFile)
{ {
MessageBox(hWnd, g_msg_lang[MSGID_VLNK_NO_DST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); VtoyMessageBox(hWnd, g_msg_lang[MSGID_VLNK_NO_DST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
CloseHandle(hFile); CloseHandle(hFile);
swprintf_s(Msg, 1024, L"%ls %ls", g_msg_lang[MSGID_VLNK_POINT_TO], szDst); swprintf_s(Msg, 1024, L"%ls %ls", g_msg_lang[MSGID_VLNK_POINT_TO], szDst);
MessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION); VtoyMessageBox(hWnd, Msg, g_msg_lang[MSGID_INFO], MB_OK | MB_ICONINFORMATION);
return 0; return 0;
} }
@@ -637,7 +763,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPara
if (CtrlID == IDC_BUTTON1) if (CtrlID == IDC_BUTTON1)
{ {
EnableWindow(g_create_button, FALSE); EnableWindow(g_create_button, FALSE);
CreateVlnk(hWnd, g_CurDirW); CreateVlnk(hWnd, g_CurDirW, NULL, NULL);
EnableWindow(g_create_button, TRUE); EnableWindow(g_create_button, TRUE);
} }
else if (CtrlID == IDC_BUTTON2) else if (CtrlID == IDC_BUTTON2)
@@ -664,9 +790,50 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lPara
return 0; return 0;
} }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) static int ParseCmdLine(LPSTR lpCmdLine)
{ {
int i; int i;
int argc = 0;
LPWSTR *lpszArgv = NULL;
lpszArgv = CommandLineToArgvW(GetCommandLineW(), &argc);
for (i = 0; i < argc; i++)
{
if (lstrcmp(lpszArgv[i], L"-q") == 0 || lstrcmp(lpszArgv[i], L"-Q") == 0)
{
g_LogFile[0] = 0;
}
else if (lstrcmp(lpszArgv[i], L"-h") == 0 || lstrcmp(lpszArgv[i], L"-H") == 0)
{
g_ShowHelp = TRUE;
}
else if (lstrcmp(lpszArgv[i], L"-s") == 0 || lstrcmp(lpszArgv[i], L"-S") == 0)
{
g_SaveAs = TRUE;
}
else if (lstrcmp(lpszArgv[i], L"-i") == 0 || lstrcmp(lpszArgv[i], L"-I") == 0)
{
if (i + 1 < argc)
{
wcscpy_s(g_CmdInFile, MAX_PATH, lpszArgv[i + 1]);
}
}
else if (lstrcmp(lpszArgv[i], L"-o") == 0 || lstrcmp(lpszArgv[i], L"-O") == 0)
{
if (i + 1 < argc)
{
wcscpy_s(g_CmdOutFile, MAX_PATH, lpszArgv[i + 1]);
}
}
}
return argc;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
DWORD dwAttrib;
HANDLE hMutex; HANDLE hMutex;
UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(hPrevInstance);
@@ -680,32 +847,52 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
g_msg_lang = g_msg_en; g_msg_lang = g_msg_en;
} }
hMutex = CreateMutexA(NULL, TRUE, "VtoyVlnkMUTEX"); hMutex = CreateMutexA(NULL, TRUE, "VtoyVlnkMUTEX");
if ((hMutex != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS)) if ((hMutex != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS))
{ {
MessageBoxW(NULL, g_msg_lang[MSGID_RUNNING_TIP], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); MessageBoxW(NULL, g_msg_lang[MSGID_RUNNING_TIP], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1; return 1;
} }
GetCurrentDirectoryA(MAX_PATH, g_CurDirA); GetCurrentDirectoryA(MAX_PATH, g_CurDirA);
GetCurrentDirectoryW(MAX_PATH, g_CurDirW); GetCurrentDirectoryW(MAX_PATH, g_CurDirW);
sprintf_s(g_LogFile, sizeof(g_LogFile), "%s\\VentoyVlnk.log", g_CurDirA); sprintf_s(g_LogFile, sizeof(g_LogFile), "%s\\VentoyVlnk.log", g_CurDirA);
for (i = 0; i < __argc; i++) ParseCmdLine(lpCmdLine);
{
if (strncmp(__argv[i], "-Q", 2) == 0 ||
strncmp(__argv[i], "-q", 2) == 0)
{
g_LogFile[0] = 0;
break;
}
}
LogA("========= VentoyVlnk =========\n");
g_hInst = hInstance; g_hInst = hInstance;
DialogBoxA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), NULL, DialogProc);
return 0; if (g_ShowHelp)
{
VtoyMessageBox(NULL, L"VentoyVlnk.exe CMD\r\n -i Input file path\r\n -o Output vlnk file path\r\n -q Quite mode (no log)", L"Tip", MB_OK);
return 0;
}
else if (g_CmdInFile[0] && g_CmdOutFile[0])
{
LogA("========= VentoyVlnk Cmdline Mode =========\n");
dwAttrib = GetFileAttributesW(g_CmdInFile);
if (dwAttrib == INVALID_FILE_ATTRIBUTES || (dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
{
LogW(L"File <<%ls>> does not exist!\n", g_CmdInFile);
VtoyMessageBox(NULL, g_msg_lang[MSGID_SRC_NONEXIST], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1;
}
if (!IsSupportedVlnkSuffix(g_CmdOutFile))
{
LogW(L"File <<%ls>> contains invalid vlnk suffix!\n", g_CmdOutFile);
VtoyMessageBox(NULL, g_msg_lang[MSGID_INVALID_SUFFIX], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR);
return 1;
}
return CreateVlnk(NULL, g_CurDirW, g_CmdInFile, g_CmdOutFile);
}
else
{
LogA("========= VentoyVlnk GUI Mode =========\n");
DialogBoxA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG1), NULL, DialogProc);
return 0;
}
} }

View File

@@ -1607,7 +1607,7 @@ static int VentoyHook(ventoy_os_param *param)
Drives = GetLogicalDrives(); Drives = GetLogicalDrives();
Log("Drives before mount: 0x%x", Drives); Log("Drives before mount: 0x%x", Drives);
rc = MountIsoFile(IsoPath, DiskExtent.DiskNumber); rc = MountIsoFile(IsoPath, VtoyDiskNum);
NewDrives = GetLogicalDrives(); NewDrives = GetLogicalDrives();
Log("Drives after mount: 0x%x (0x%x)", NewDrives, (NewDrives ^ Drives)); Log("Drives after mount: 0x%x (0x%x)", NewDrives, (NewDrives ^ Drives));