"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"이번에는 장치에 쓰지 않고 VTSI 파일#@만 생성합니다.#@계속하시겠습니까?",
"STR_VTSI_CREATE_SUCCESS":"VTSI 파일이 성공적으로 생성되었습니다!#@Rufus(3.15+)를 사용하여 장치에 기록하여 Ventoy 설치를 완료할 수 있습니다.",
"STR_VTSI_CREATE_FAILED":"VTSI 파일을 생성하지 못했습니다.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"本操作不会向设备中写入数据,而只会生成一个 VTSI 文件#@是否继续?",
"STR_VTSI_CREATE_SUCCESS":"VTSI 文件创建成功,你可以使用Rufus(3.15+)将其写入对应设备,从而完成Ventoy的安装",
"STR_VTSI_CREATE_FAILED":"VTSI 文件创建失败",
+ "STR_MENU_PART_RESIZE":"无损安装",
+ "STR_PART_RESIZE_TIP":"Ventoy将尝试进行无损安装。注意:任何磁盘操作都有一定的风险,对于重要数据建议做好备份。#@是否继续?",
+ "STR_PART_RESIZE_SUCCESS":"恭喜你! Ventoy 成功完成了无损安装。",
+ "STR_PART_RESIZE_FAILED":"Ventoy 无损安装失败。详细信息请查阅 log.txt 文件。",
+ "STR_PART_RESIZE_UNSUPPORTED":"条件不满足,无法进行无损安装。详细信息请查阅 log.txt 文件。",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Şu an aygıta yazılmayacak,sadece bir VTSI dosyası oluşturulacak#@Devam edilsin mi?",
"STR_VTSI_CREATE_SUCCESS":"VTSI dosyası başarılı bir şekilde oluşturuldu!#@Ventoy'un aygıta kurulumunu tamamlamak için Rufus(3.15+) programını kullanabilirsiniz.",
"STR_VTSI_CREATE_FAILED":"VTSI dosyası oluşturma başarısız oldu!",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Aqueste còp cap d’escritura al disc, generacion del fichiet VTSI sonque#@Contunhar ?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"Fracàs de la creacion del fichièr VTSI.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Esta vez no se escribirá al dispositivo, pero solo generará un archivo VTSI#@¿Continuar?",
"STR_VTSI_CREATE_SUCCESS":"¡Archivo VTSI creado exitosamente!#@Puedes usar Rufus(3.15+) para escribirlo al dispositivo a fin de completar la instalación de Ventoy.",
"STR_VTSI_CREATE_FAILED":"Fallo en el archivo VTSI creado.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"На этот раз Ventoy не будет установлен на устройство, а будет только создан файл VTSI#@Продолжить?",
"STR_VTSI_CREATE_SUCCESS":"Файл VTSI создан успешно!#@Вы можете использовать Rufus(3.15+), чтобы записать его на устройство, для завершения установки Ventoy.",
"STR_VTSI_CREATE_FAILED":"Ошибка создания файла VTSI.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Deze keer wordt er niet naar het apparaat geschreven, maar wordt er alleen een VTSI-bestand gegenereerd#@Doorgaan?",
"STR_VTSI_CREATE_SUCCESS":"VTSI-bestand met succes aangemaakt!#@U kunt Rufus(3.15+) gebruiken om het bestand naar het apparaat te schrijven om de installatie van Ventoy te voltooien.",
"STR_VTSI_CREATE_FAILED":"Aanmaken van VTSI-bestand mislukt.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"VTSIファイルを生成し,記憶装置への書き込みは行いません。#@続行しますか?",
"STR_VTSI_CREATE_SUCCESS":"VTSIファイルが生成されました。#@Rufus(3.15以上の版)を使って記憶装置に書き込んで,Ventoyの導入を完遂しましょう。",
"STR_VTSI_CREATE_FAILED":"VTSIファイルを生成できませんでした。",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Questa volta non scriverà sul dispositivo, ma genererà solo un file VTSI#@Continuare?",
"STR_VTSI_CREATE_SUCCESS":"File VTSI creato con successo!#@Puoi usare Rufus (versione 3.15 o successiva) per scrivere sul dispositivo in modo da completare l'installazione di Ventoy.",
"STR_VTSI_CREATE_FAILED":"Creazione File VTSI non riuscito.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_WEB_SERVICE_UNAVAILABLE":"Lỗi giao tiếp: Dịch vụ không sẵn có",
"STR_WEB_TOKEN_MISMATCH":"Đã cập nhật trạng thái Daemon, vui lòng thử lại sau.",
"STR_WEB_SERVICE_BUSY":"Dịch vụ bận, vui lòng thử lại sau.",
- "STR_MENU_VTSI_CREATE":"Tạo tệp VTSI",
+ "STR_MENU_VTSI_CREATE":"Tạo tệp VTSI",
"STR_VTSI_CREATE_TIP":"Lần này sẽ không ghi vào thiết bị, chỉ tạo một tệp VTSI#@Bạn muốn tiếp tục?",
"STR_VTSI_CREATE_SUCCESS":"Tạo tệp VTSI thành công!#@Để hoàn thành cài đặt Ventoy, bạn có thể dùng Rufus (3.15+) để ghi tệp này vào thiết bị.",
"STR_VTSI_CREATE_FAILED":"Tạo tệp VTSI đã gặp lỗi.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Овој пат ништо нема да се запише на уредот туку само ќе се генерира VTSI датотека#@Продолжи?",
"STR_VTSI_CREATE_SUCCESS":"Успешно креирана VTSI датотека!#@Можете да го користите Rufus(3.15+) за да ја запишете на уредот како и да ја комплетирате инсталацијата на Ventoy.",
"STR_VTSI_CREATE_FAILED":"Креирањето на VTSI датотека е неуспешно.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Desta vez não irá gravar no dispositivo, mas apenas gerar um ficheiro VTSI#@Continuar?",
"STR_VTSI_CREATE_SUCCESS":"Ficheiro VTSI criado com sucesso!#@Pode utilizar o Rufus(3.15+) para o gravar no dispositivo de modo a completar a instalação do Ventoy.",
"STR_VTSI_CREATE_FAILED":"Falha no ficheiro VTSI criado.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Saat ini tidak akan menuliskan di perangkat, tetapi hanya membuat berkas VTSI #@Lanjutkan?",
"STR_VTSI_CREATE_SUCCESS":"Berkas VTSI berhasil dibuat#@Anda bisa menggunakan Rufus(3.15+) untuk menulisnya ke perangkat untuk menyelesaikan instalasi Ventoy.",
"STR_VTSI_CREATE_FAILED":"Berkas VTSI gagal dibuat.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Dette vil ikke skrive til enheten, men kun generere en VTSIfil#@Fortsett?",
"STR_VTSI_CREATE_SUCCESS":"VTSI-fil opprettet.#@Du kan bruke Rufus(3.15+) til å skrive den til enheten for å fullføre installasjonen av Ventoy.",
"STR_VTSI_CREATE_FAILED":"Noe gikk galt under opprettelse av VTSI-fil.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Цього разу Ventoy не буде встановлено на пристрій, а лише буде створено файл VTSI#@Продовжити?",
"STR_VTSI_CREATE_SUCCESS":"Файл VTSI створено успішно!#@Ви можете використати Rufus(3.15+), щоб записати його на пристрій, для завершення встановлення Ventoy",
"STR_VTSI_CREATE_FAILED":"Не вдалося створити файл VTSI.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Den här gången skrivs det inget till enheten, utan det skapas endast en VTSI-fil#@Fortsätta?",
"STR_VTSI_CREATE_SUCCESS":"VTSI-filen skapad!#@Använd Rufus (3.15+) till att skriva till enheten för att slutföra installationen av Ventoy.",
"STR_VTSI_CREATE_FAILED":"Misslyckades med att skapa VTSI-filen.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Сега няма да се записва на диска, само ще се генерира VTSI файл#@Продължаваме?",
"STR_VTSI_CREATE_SUCCESS":"VTSI файла бе създаден успешно!#@Може да използвате Rufus(3.15+) да го запишете на устройството за инсталацията с Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI файла създаване се провали.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Այս անգամ չի գրվի կրիչի վրա, այլ միայն կստեղծվի VTSI ֆայլ#@Շարունակել?",
"STR_VTSI_CREATE_SUCCESS":"VTSI ֆայլը հաջողությամբ ստեղծվեց!#@Դուք կարող եք օգտագործել Rufus (3.15+) կրիչում ձայնագրելու համար, որպեսզի ավարտեք Ventoy-ի տեղադրումը:",
"STR_VTSI_CREATE_FAILED":"VTSI ֆայլի ստեղծումը ձախողվեց։",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
},
{
"STR_VTSI_CREATE_TIP":"Tällä kerralla laitteeseen ei kirjoiteta, vaan luodaan ainoastaan VTSI -tiedosto#@Jatketaanko?",
"STR_VTSI_CREATE_SUCCESS":"VTSI -tiedosto luotiin onnistuneesti!#@Voit käyttää Rufus-ohjelmaa(3.15+) kirjoittaaksesi sen laitteeseen viimeistelläksesi Ventoy-asennuksen.",
"STR_VTSI_CREATE_FAILED":"VTSI -tiedoston luominen epäonnistui.",
+ "STR_MENU_PART_RESIZE":"Non-destructive Install",
+ "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?",
+ "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.",
+ "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.",
+ "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.",
+
"STRXXX":""
}
-]
+]
\ No newline at end of file
// 3. Filter out the crap we don't need.\r
static const char *GetVdsError(DWORD error_code)\r
{\r
+ static char code[32];\r
+\r
+ sprintf_s(code, sizeof(code), "[0x%08x]", error_code);\r
+\r
switch (error_code) {\r
case 0x80042400: // VDS_E_NOT_SUPPORTED\r
return "The operation is not supported by the object.";\r
case 0x80042918: // VDS_E_COMPRESSION_NOT_SUPPORTED\r
return "The specified file system does not support compression.";\r
default:\r
- return NULL;\r
+ return code;\r
}\r
}\r
\r
#define INTF_ADVANCEDDISK2 2\r
#define INTF_CREATEPARTITIONEX 3\r
#define INTF_PARTITIONMF 4\r
+#define INTF_VOLUME 5\r
+#define INTF_VOLUME_MF3 6\r
\r
/* \r
* Some code and functions in the file are copied from rufus.\r
#define IVdsAsync_Wait(This,pHrResult,pAsyncOut) (This)->lpVtbl->Wait(This,pHrResult,pAsyncOut)\r
#define IVdsAsync_Release(This) (This)->lpVtbl->Release(This)\r
\r
+#define IVdsVolume_Shrink(This, ullNumberOfBytesToRemove, ppAsync) (This)->lpVtbl->Shrink(This, ullNumberOfBytesToRemove, ppAsync)\r
+\r
#define IUnknown_QueryInterface(This, a, b) (This)->lpVtbl->QueryInterface(This,a,b)\r
#define IUnknown_Release(This) (This)->lpVtbl->Release(This)\r
\r
return pService;\r
}\r
\r
+STATIC BOOL VDS_VolumeCommProc(int intf, const WCHAR* wVolumeGuid, VDS_Callback_PF callback, UINT64 data)\r
+{\r
+ int Pos = 0;\r
+ BOOL Find = FALSE;\r
+ BOOL r = FALSE;\r
+ HRESULT hr;\r
+ ULONG ulFetched;\r
+ IUnknown* pUnk = NULL;\r
+ IEnumVdsObject* pEnum = NULL;\r
+ IVdsService* pService = NULL;\r
+\r
+ pService = VDS_InitService();\r
+ if (!pService)\r
+ {\r
+ Log("Could not query VDS Service");\r
+ goto out;\r
+ }\r
+\r
+ // Query the VDS Service Providers\r
+ hr = IVdsService_QueryProviders(pService, VDS_QUERY_SOFTWARE_PROVIDERS, &pEnum);\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not query VDS Service Providers: 0x%lx %u", hr, LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ while (IEnumVdsObject_Next(pEnum, 1, &pUnk, &ulFetched) == S_OK)\r
+ {\r
+ IVdsProvider* pProvider;\r
+ IVdsSwProvider* pSwProvider;\r
+ IEnumVdsObject* pEnumPack;\r
+ IUnknown* pPackUnk;\r
+\r
+ // Get VDS Provider\r
+ hr = IUnknown_QueryInterface(pUnk, &IID_IVdsProvider, (void**)&pProvider);\r
+ IUnknown_Release(pUnk);\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not get VDS Provider: %u", LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ // Get VDS Software Provider\r
+ hr = IVdsSwProvider_QueryInterface(pProvider, &IID_IVdsSwProvider, (void**)&pSwProvider);\r
+ IVdsProvider_Release(pProvider);\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not get VDS Software Provider: %u", LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ // Get VDS Software Provider Packs\r
+ hr = IVdsSwProvider_QueryPacks(pSwProvider, &pEnumPack);\r
+ IVdsSwProvider_Release(pSwProvider);\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not get VDS Software Provider Packs: %u", LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ // Enumerate Provider Packs\r
+ while (IEnumVdsObject_Next(pEnumPack, 1, &pPackUnk, &ulFetched) == S_OK)\r
+ {\r
+ IVdsPack* pPack;\r
+ IEnumVdsObject* pEnumVolume;\r
+ IUnknown* pVolumeUnk;\r
+\r
+ hr = IUnknown_QueryInterface(pPackUnk, &IID_IVdsPack, (void**)&pPack);\r
+ IUnknown_Release(pPackUnk);\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not query VDS Software Provider Pack: %u", LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ // Use the pack interface to access the volume\r
+ hr = IVdsPack_QueryVolumes(pPack, &pEnumVolume);;\r
+ if (hr != S_OK) {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not query VDS volume: %u", LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ // List disks\r
+ while (IEnumVdsObject_Next(pEnumVolume, 1, &pVolumeUnk, &ulFetched) == S_OK)\r
+ {\r
+ IVdsVolume* pVolume;\r
+ IVdsVolumeMF3* pVolumeMF3;\r
+ LPWSTR* wszPathArray;\r
+ ULONG ulNumberOfPaths;\r
+\r
+ // Get the disk interface.\r
+ hr = IUnknown_QueryInterface(pVolumeUnk, &IID_IVdsVolumeMF3, (void**)&pVolumeMF3);\r
+ if (hr != S_OK) {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not query VDS Volume Interface: %u", LASTERR);\r
+ goto out;\r
+ }\r
+\r
+ // Get the volume properties\r
+ hr = IVdsVolumeMF3_QueryVolumeGuidPathnames(pVolumeMF3, &wszPathArray, &ulNumberOfPaths);\r
+ if ((hr != S_OK) && (hr != VDS_S_PROPERTIES_INCOMPLETE)) \r
+ {\r
+ Log("Could not query VDS VolumeMF3 GUID PathNames: %s", GetVdsError(hr));\r
+ IVdsVolume_Release(pVolumeMF3);\r
+ IUnknown_Release(pVolumeUnk);\r
+ continue;\r
+ }\r
+\r
+ Log("Get Volume %d %lu <%S>", intf, ulNumberOfPaths, wszPathArray[0]);\r
+\r
+ if ((ulNumberOfPaths >= 1) && wcsstr(wszPathArray[0], wVolumeGuid))\r
+ {\r
+ Find = TRUE;\r
+ Log("Call back for this Volume %d <%S>", intf, wVolumeGuid);\r
+\r
+ if (INTF_VOLUME_MF3 == intf)\r
+ {\r
+ r = callback(pVolumeMF3, NULL, data);\r
+ }\r
+ else if (INTF_VOLUME == intf)\r
+ {\r
+ // Get the disk interface.\r
+ hr = IUnknown_QueryInterface(pVolumeUnk, &IID_IVdsVolume, (void**)&pVolume);\r
+ if (hr != S_OK) {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not query VDS Volume Interface: %u", LASTERR);\r
+ }\r
+ else {\r
+ r = callback(pVolume, NULL, data);\r
+ IVdsVolume_Release(pVolume);\r
+ }\r
+ }\r
+ }\r
+\r
+ CoTaskMemFree(wszPathArray);\r
+ IVdsVolume_Release(pVolumeMF3);\r
+ IUnknown_Release(pVolumeUnk);\r
+\r
+ if (Find)\r
+ {\r
+ goto out;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+out:\r
+ return r;\r
+}\r
+\r
\r
STATIC BOOL VDS_DiskCommProc(int intf, int DriveIndex, VDS_Callback_PF callback, UINT64 data)\r
{\r
return ret;\r
}\r
\r
+STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp, UINT64 data)\r
+{\r
+ HRESULT hr, hr2;\r
+ IVdsVolume* pVolume = (IVdsVolume*)pInterface;\r
+ ULONG completed;\r
+ IVdsAsync* pAsync;\r
+\r
+ (void)pDiskProp;\r
+\r
+ Log("VDS_CallBack_ShrinkVolume (%llu) ...", (ULONGLONG)data);\r
+\r
+ hr = IVdsVolume_Shrink(pVolume, (ULONGLONG)data, &pAsync);\r
+\r
+ while (SUCCEEDED(hr))\r
+ {\r
+ hr = IVdsAsync_QueryStatus(pAsync, &hr2, &completed);\r
+ if (SUCCEEDED(hr))\r
+ {\r
+ hr = hr2;\r
+ if (hr == S_OK)\r
+ {\r
+ Log("ShrinkVolume QueryStatus OK, %lu%%", completed);\r
+ break;\r
+ }\r
+ else if (hr == VDS_E_OPERATION_PENDING)\r
+ {\r
+ Log("ShrinkVolume: %lu%%", completed);\r
+ hr = S_OK;\r
+ }\r
+ else\r
+ {\r
+ Log("ShrinkVolume invalid status:0x%lx", hr);\r
+ }\r
+ }\r
+ Sleep(1000);\r
+ }\r
+\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not ShrinkVolume, 0x%x err:0x%lx (%s)", hr, LASTERR, WindowsErrorString(hr));\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+BOOL VDS_ShrinkVolume(const char* VolumeGuid, UINT64 ReduceBytes)\r
+{\r
+ int i;\r
+ BOOL ret = FALSE;\r
+ WCHAR wGuid[128] = { 0 };\r
+ const char *guid = NULL;\r
+\r
+ guid = strstr(VolumeGuid, "{");\r
+ if (!guid)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ for (i = 0; i < 128 && guid[i]; i++)\r
+ {\r
+ wGuid[i] = guid[i];\r
+ }\r
+\r
+ ret = VDS_VolumeCommProc(INTF_VOLUME, wGuid, VDS_CallBack_ShrinkVolume, ReduceBytes);\r
+ Log("VDS_ShrinkVolume ret:%d (%s)", ret, ret ? "SUCCESS" : "FAIL");\r
+ return ret;\r
+}
\ No newline at end of file
\r
static int g_backup_bin_index = 0;\r
\r
+\r
+static BOOL WriteDataToPhyDisk(HANDLE hDrive, UINT64 Offset, VOID *buffer, DWORD len)\r
+{\r
+ BOOL bRet;\r
+ DWORD dwSize = 0;\r
+ LARGE_INTEGER liCurPosition;\r
+ LARGE_INTEGER liNewPosition;\r
+\r
+ liCurPosition.QuadPart = (LONGLONG)Offset;\r
+ liNewPosition.QuadPart = 0;\r
+ if (0 == SetFilePointerEx(hDrive, liCurPosition, &liNewPosition, FILE_BEGIN) ||\r
+ liNewPosition.QuadPart != liCurPosition.QuadPart)\r
+ {\r
+ Log("SetFilePointerEx Failed %u", LASTERR);\r
+ return FALSE;\r
+ }\r
+\r
+ bRet = WriteFile(hDrive, buffer, len, &dwSize, NULL);\r
+ if (bRet == FALSE || dwSize != len)\r
+ {\r
+ Log("Write file error %u %u", dwSize, LASTERR);\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
static DWORD GetVentoyVolumeName(int PhyDrive, UINT64 StartSectorId, CHAR *NameBuf, UINT32 BufLen, BOOL DelSlash)\r
{\r
size_t len;\r
\r
for (Pos = StringBuf; *Pos; Pos += strlen(Pos) + 1)\r
{\r
- if (n < (int)Length && PhyDrive == GetPhyDriveByLogicalDrive(Pos[0]))\r
+ if (n < (int)Length && PhyDrive == GetPhyDriveByLogicalDrive(Pos[0], NULL))\r
{\r
Log("%C: is belong to phydrive%d", Pos[0], PhyDrive);\r
DriveLetters[n++] = Pos[0];\r
return 0;\r
}\r
\r
-static HANDLE GetPhysicalHandle(int Drive, BOOLEAN bLockDrive, BOOLEAN bWriteAccess, BOOLEAN bWriteShare)\r
+HANDLE GetPhysicalHandle(int Drive, BOOLEAN bLockDrive, BOOLEAN bWriteAccess, BOOLEAN bWriteShare)\r
{\r
int i;\r
DWORD dwSize;\r
return hDrive;\r
}\r
\r
-int GetPhyDriveByLogicalDrive(int DriveLetter)\r
+int GetPhyDriveByLogicalDrive(int DriveLetter, UINT64 *Offset)\r
{\r
BOOL Ret;\r
DWORD dwSize;\r
DiskExtents.Extents[0].ExtentLength.QuadPart\r
);\r
\r
+ if (Offset)\r
+ {\r
+ *Offset = (UINT64)(DiskExtents.Extents[0].StartingOffset.QuadPart);\r
+ }\r
+\r
return (int)DiskExtents.Extents[0].DiskNumber;\r
}\r
\r
{\r
if (dwBytes & 0x01)\r
{\r
- id = GetPhyDriveByLogicalDrive(Letter);\r
+ id = GetPhyDriveByLogicalDrive(Letter, NULL);\r
Log("%C --> %d", Letter, id);\r
if (id >= 0)\r
{\r
LARGE_INTEGER liNewPosition;\r
BYTE *CheckBuf = NULL;\r
\r
- Log("FormatPart2Fat %llu...", StartSectorId);\r
+ Log("FormatPart2Fat %llu...", (ULONGLONG)StartSectorId);\r
\r
CheckBuf = malloc(SIZE_1MB);\r
if (!CheckBuf)\r
return rc;\r
}\r
\r
+\r
+int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)\r
+{\r
+ int i, j;\r
+ int rc = 1;\r
+ int PhyDrive;\r
+ int PartStyle;\r
+ INT64 ReservedValue;\r
+ UINT64 RecudeBytes;\r
+ GUID Guid;\r
+ MBR_HEAD MBR;\r
+ VTOY_GPT_INFO *pGPT;\r
+ MBR_HEAD *pMBR;\r
+ DWORD dwSize = 0;\r
+ VTOY_GPT_HDR BackupHead;\r
+ HANDLE hDrive = INVALID_HANDLE_VALUE;\r
+ GUID ZeroGuid = { 0 };\r
+ static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } };\r
+ static GUID EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } };\r
+ static GUID BiosGrubPartType = { 0x21686148, 0x6449, 0x6e6f, { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } };\r
+\r
+ Log("#####################################################");\r
+ Log("PartitionResizeForVentoy PhyDrive%d <<%s %s %dGB>>",\r
+ pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,\r
+ GetHumanReadableGBSize(pPhyDrive->SizeInBytes));\r
+ Log("#####################################################");\r
+\r
+ pGPT = &(pPhyDrive->Gpt);\r
+ pMBR = &(pPhyDrive->Gpt.MBR);\r
+ Log("Disksize:%llu Part2Start:%llu", pPhyDrive->SizeInBytes, pPhyDrive->ResizePart2StartSector * 512);\r
+\r
+ if (pMBR->PartTbl[0].FsFlag == 0xEE && memcmp(pGPT->Head.Signature, "EFI PART", 8) == 0)\r
+ {\r
+ PartStyle = 1;\r
+ }\r
+ else\r
+ {\r
+ PartStyle = 0;\r
+ }\r
+\r
+ PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);\r
+\r
+ RecudeBytes = VENTOY_EFI_PART_SIZE;\r
+ ReservedValue = GetReservedSpaceInMB();\r
+ if (ReservedValue > 0)\r
+ {\r
+ Log("Reduce add reserved space %lldMB", (LONGLONG)ReservedValue);\r
+ RecudeBytes += (UINT64)(ReservedValue * SIZE_1MB);\r
+ }\r
+\r
+\r
+ if (pPhyDrive->ResizeNoShrink == FALSE)\r
+ {\r
+ Log("Need to shrink the volume");\r
+ if (VDS_ShrinkVolume(pPhyDrive->ResizeVolumeGuid, RecudeBytes))\r
+ {\r
+ Log("Shrink volume success, now check again");\r
+\r
+ hDrive = GetPhysicalHandle(pPhyDrive->PhyDrive, TRUE, TRUE, FALSE);\r
+ if (hDrive == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Failed to GetPhysicalHandle for update.");\r
+ goto End;\r
+ }\r
+\r
+ //Refresh Drive Layout\r
+ DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);\r
+\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+\r
+\r
+ if (PartResizePreCheck(NULL) && pPhyDrive->ResizeNoShrink)\r
+ {\r
+ Log("Recheck after Shrink volume success");\r
+ Log("After shrink Disksize:%llu Part2Start:%llu", pPhyDrive->SizeInBytes, pPhyDrive->ResizePart2StartSector * 512);\r
+ }\r
+ else\r
+ {\r
+ Log("Recheck after Shrink volume failed %u", pPhyDrive->ResizeNoShrink);\r
+ goto End;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Log("Shrink volume failed");\r
+ goto End;\r
+ }\r
+ }\r
+\r
+\r
+ //Now try write data\r
+ hDrive = GetPhysicalHandle(pPhyDrive->PhyDrive, TRUE, TRUE, FALSE);\r
+ if (hDrive == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Failed to GetPhysicalHandle for update.");\r
+ goto End;\r
+ }\r
+\r
+\r
+ //Write partition 2 data\r
+ PROGRESS_BAR_SET_POS(PT_FORMAT_PART2);\r
+ if (0 != FormatPart2Fat(hDrive, pPhyDrive->ResizePart2StartSector))\r
+ {\r
+ Log("FormatPart2Fat failed.");\r
+ goto End;\r
+ }\r
+\r
+ //Write grub stage2 gap\r
+ PROGRESS_BAR_SET_POS(PT_WRITE_STG1_IMG);\r
+ Log("Writing Boot Image ............................. ");\r
+ if (WriteGrubStage1ToPhyDrive(hDrive, PartStyle) != 0)\r
+ {\r
+ Log("WriteGrubStage1ToPhyDrive failed.");\r
+ goto End;\r
+ }\r
+\r
+\r
+ //Write partition table\r
+ PROGRESS_BAR_SET_POS(PT_WRITE_PART_TABLE);\r
+ Log("Writing partition table ............................. ");\r
+\r
+ VentoyGetLocalBootImg(&MBR);\r
+ CoCreateGuid(&Guid);\r
+ memcpy(MBR.BootCode + 0x180, &Guid, 16);\r
+ memcpy(pMBR->BootCode, MBR.BootCode, 440);\r
+\r
+ if (PartStyle == 0)\r
+ {\r
+ for (i = 1; i < 4; i++)\r
+ {\r
+ if (pMBR->PartTbl[i].SectorCount == 0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (i >= 4)\r
+ {\r
+ Log("Can not find MBR free partition table");\r
+ goto End;\r
+ }\r
+\r
+ for (j = i - 1; j > 0; j--)\r
+ {\r
+ Log("Move MBR partition table %d --> %d", j + 1, j + 2);\r
+ memcpy(pMBR->PartTbl + (j + 1), pMBR->PartTbl + j, sizeof(PART_TABLE));\r
+ }\r
+\r
+ VentoyFillMBRLocation(pPhyDrive->SizeInBytes, (UINT32)pPhyDrive->ResizePart2StartSector, VENTOY_EFI_PART_SIZE / 512, pMBR->PartTbl + 1);\r
+ pMBR->PartTbl[0].Active = 0x80; // bootable\r
+ pMBR->PartTbl[1].Active = 0x00;\r
+ pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition\r
+\r
+ if (!WriteDataToPhyDisk(hDrive, 0, pMBR, 512))\r
+ {\r
+ Log("Legacy BIOS write MBR failed");\r
+ goto End;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i = 1; i < 128; i++)\r
+ {\r
+ if (memcmp(&(pGPT->PartTbl[i].PartGuid), &ZeroGuid, sizeof(GUID)) == 0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (i >= 128)\r
+ {\r
+ Log("Can not find GPT free partition table");\r
+ goto End;\r
+ }\r
+\r
+ for (j = i - 1; j > 0; j--)\r
+ {\r
+ Log("Move GPT partition table %d --> %d", j + 1, j + 2);\r
+ memcpy(pGPT->PartTbl + (j + 1), pGPT->PartTbl + j, sizeof(VTOY_GPT_PART_TBL));\r
+ }\r
+\r
+\r
+ pMBR->BootCode[92] = 0x22;\r
+\r
+ // to fix windows issue\r
+ memcpy(&(pGPT->PartTbl[1].PartType), &WindowsDataPartType, sizeof(GUID));\r
+ CoCreateGuid(&(pGPT->PartTbl[1].PartGuid));\r
+\r
+ pGPT->PartTbl[1].StartLBA = pGPT->PartTbl[0].LastLBA + 1;\r
+ pGPT->PartTbl[1].LastLBA = pGPT->PartTbl[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1;\r
+ pGPT->PartTbl[1].Attr = 0xC000000000000001ULL;\r
+ memcpy(pGPT->PartTbl[1].Name, L"VTOYEFI", 7 * 2);\r
+\r
+ //Update CRC\r
+ pGPT->Head.PartTblCrc = VentoyCrc32(pGPT->PartTbl, sizeof(pGPT->PartTbl));\r
+ pGPT->Head.Crc = VentoyCrc32(&(pGPT->Head), pGPT->Head.Length);\r
+\r
+ Log("pGPT->Head.EfiStartLBA=%llu", (ULONGLONG)pGPT->Head.EfiStartLBA);\r
+ Log("pGPT->Head.EfiBackupLBA=%llu", (ULONGLONG)pGPT->Head.EfiBackupLBA);\r
+\r
+ VentoyFillBackupGptHead(pGPT, &BackupHead);\r
+ if (!WriteDataToPhyDisk(hDrive, pGPT->Head.EfiBackupLBA * 512, &BackupHead, 512))\r
+ {\r
+ Log("UEFI write backup head failed");\r
+ goto End;\r
+ }\r
+\r
+ if (!WriteDataToPhyDisk(hDrive, (pGPT->Head.EfiBackupLBA - 32) * 512, pGPT->PartTbl, 512 * 32))\r
+ {\r
+ Log("UEFI write backup partition table failed");\r
+ goto End;\r
+ }\r
+\r
+ if (!WriteDataToPhyDisk(hDrive, 0, pGPT, 512 * 34))\r
+ {\r
+ Log("UEFI write MBR & Main partition table failed");\r
+ goto End;\r
+ }\r
+ }\r
+\r
+\r
+\r
+ //Refresh Drive Layout\r
+ DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);\r
+ \r
+ //We must close handle here, because it will block the refresh bellow\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+\r
+ Sleep(2000);\r
+\r
+ //Refresh disk list\r
+ PhyDrive = pPhyDrive->PhyDrive;\r
+\r
+ Log("#### Now Refresh PhyDrive ####");\r
+ Ventoy2DiskDestroy();\r
+ Ventoy2DiskInit();\r
+ \r
+ pPhyDrive = GetPhyDriveInfoByPhyDrive(PhyDrive);\r
+ if (pPhyDrive)\r
+ {\r
+ if (pPhyDrive->VentoyVersion[0] == 0)\r
+ {\r
+ Log("After process the Ventoy version is still invalid");\r
+ goto End;\r
+ }\r
+\r
+ Log("### Ventoy non-destructive installation successfully finished <%s>", pPhyDrive->VentoyVersion);\r
+ }\r
+ else\r
+ {\r
+ Log("### Ventoy non-destructive installation successfully finished <not found>");\r
+ }\r
+\r
+ InitComboxCtrl(g_DialogHwnd, PhyDrive);\r
+\r
+ rc = 0;\r
+\r
+End:\r
+ CHECK_CLOSE_HANDLE(hDrive);\r
+ return rc;\r
+}\r
+\r
+\r
static BOOL DiskCheckWriteAccess(HANDLE hDrive)\r
{\r
DWORD dwSize;\r