mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-09-18 18:01:14 +00:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5b0fca8468 | ||
|
27918eb3f9 | ||
|
7859271b20 | ||
|
1c27c0b489 | ||
|
0f89c2767f | ||
|
d1584c10b4 | ||
|
43e921878b | ||
|
23f4f18e27 | ||
|
53b95ae17b | ||
|
e3506c0f10 | ||
|
9118d5fe45 | ||
|
f130325a9c | ||
|
1ca48923da | ||
|
730fdd5198 | ||
|
d0f3597b26 |
2
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
2
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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 ......
|
||||||
|
@@ -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 за повратак...
|
|
18
INSTALL/grub/help/sr_RS.txt
Normal file
18
INSTALL/grub/help/sr_RS.txt
Normal 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 за повратак ......
|
@@ -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...
|
|
@@ -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.
@@ -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:",
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Binary file not shown.
@@ -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
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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"
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
@@ -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));
|
||||||
|
Reference in New Issue
Block a user