diff --git a/LANGUAGES/languages.json b/LANGUAGES/languages.json index 2857589f..158834dd 100644 --- a/LANGUAGES/languages.json +++ b/LANGUAGES/languages.json @@ -44,6 +44,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"خطأ في الاتصال: الخدمة غير متوفرة", "STR_WEB_TOKEN_MISMATCH":"تم تحديث حالة البرنامج الخفي ، يرجى إعادة المحاولة لاحقًا.", "STR_WEB_SERVICE_BUSY":"الخدمة مشغولة ، يرجى إعادة المحاولة لاحقًا.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -91,6 +95,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"통신 오류: 서비스를 사용할 수 없음", "STR_WEB_TOKEN_MISMATCH":"데몬 상태가 업데이트되었습니다. 나중에 다시 시도하십시오.", "STR_WEB_SERVICE_BUSY":"서비스가 사용 중입니다. 나중에 다시 시도하십시오.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -138,6 +146,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"通信失败:服务不可用", "STR_WEB_TOKEN_MISMATCH":"后台服务状态更新,请稍后重试", "STR_WEB_SERVICE_BUSY":"后台服务正忙,请稍后重试", + "STR_MENU_VTSI_CREATE":"创建 VTSI 文件", + "STR_VTSI_CREATE_TIP":"本操作不会向设备中写入数据,而只会生成一个 VTSI 文件#@是否继续?", + "STR_VTSI_CREATE_SUCCESS":"VTSI 文件创建成功,你可以使用Rufus(3.15+)将其写入对应设备,从而完成Ventoy的安装", + "STR_VTSI_CREATE_FAILED":"VTSI 文件创建失败", "STRXXX":"" }, { @@ -185,6 +197,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -232,6 +248,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"خطای ارتباطی: سرویس موجود نیست", "STR_WEB_TOKEN_MISMATCH":"وضعیت Daemon به روز شد ، لطفاً بعداً دوباره امتحان کنید.", "STR_WEB_SERVICE_BUSY":"سرویس شلوغ است ، لطفاً بعداً دوباره امتحان کنید.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -279,6 +299,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Błąd komunikacji: usługa niedostępna", "STR_WEB_TOKEN_MISMATCH":"Stan daemona został zaktualizowany, spróbuj ponownie później.", "STR_WEB_SERVICE_BUSY":"Usługa jest zajęta, spróbuj ponownie później.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -326,6 +350,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Erro de comunicação: Serviço indisponível", "STR_WEB_TOKEN_MISMATCH":"Status daemon atualizado, por favor, tente novamente mais tarde.", "STR_WEB_SERVICE_BUSY":"O serviço está ocupado, por favor, tente novamente mais tarde.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -373,6 +401,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Iletişim hatası: Uzaktan web erişim hizmeti erişilemez durumda", "STR_WEB_TOKEN_MISMATCH":"Daemon durumu güncellendi,lütfen daha sonra tekrar deneyiniz.", "STR_WEB_SERVICE_BUSY":"Hizmet meşgul, lütfen daha sonra tekrar deneyin.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -420,6 +452,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfehler: Dienst nicht verfügbar", "STR_WEB_TOKEN_MISMATCH":"Daemon-Status aktualisiert, bitte später erneut versuchen.", "STR_WEB_SERVICE_BUSY":"Dienst ist ausgelastet, bitte später erneut versuchen.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -467,6 +503,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicacion : servici pas disponible", "STR_WEB_TOKEN_MISMATCH":"Estat del Daemon actualizat, tornatz ensajar mai tard.", "STR_WEB_SERVICE_BUSY":"Lo servici es ocupat, tornatz ensajar mai tard.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -514,6 +554,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Erreur de communication : service inaccessible", "STR_WEB_TOKEN_MISMATCH":"Statut du démon mis à jour, veuillez réessayer plus tard.", "STR_WEB_SERVICE_BUSY":"Service surchargé, veuillez réessayer plus tard.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -561,6 +605,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -608,6 +656,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicación: Servicio No Disponible", "STR_WEB_TOKEN_MISMATCH":" Estado del daemon actualizado, por favor reintenta más tarde.", "STR_WEB_SERVICE_BUSY":" El servicio está ocupado, por favor reintenta más tarde.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -655,6 +707,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Ошибка связи: Служба недоступна", "STR_WEB_TOKEN_MISMATCH":"Статус демона обновлен. Повторите попытку позже.", "STR_WEB_SERVICE_BUSY":"Служба занята, повторите попытку позже.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -702,6 +758,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -749,6 +809,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -796,6 +860,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communicatiefout: service niet beschikbaar", "STR_WEB_TOKEN_MISMATCH":"Daemon-status bijgewerkt, probeer het later opnieuw.", "STR_WEB_SERVICE_BUSY":"Service is bezet, probeer het later opnieuw.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -843,6 +911,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -890,6 +962,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"デーモンのステータスが更新されました。しばらくしてから再試行してください。", "STR_WEB_SERVICE_BUSY":"サービスがビジーです。後で再試行してください。", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -937,6 +1013,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -984,6 +1064,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1031,6 +1115,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1078,6 +1166,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"通信錯誤: 服務不可用", "STR_WEB_TOKEN_MISMATCH":"服務狀態已更新", "STR_WEB_SERVICE_BUSY":"服務正忙,請稍後重試", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1125,6 +1217,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Greška u komunikaciji: Servis nije dostupan", "STR_WEB_TOKEN_MISMATCH":"Status demona ažuriran, pokušajte ponovo kasnije.", "STR_WEB_SERVICE_BUSY":"Servis je zauzet, pokušajte ponovo kasnije.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1172,6 +1268,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Комуникациона грешка: Сервис је недоступан", "STR_WEB_TOKEN_MISMATCH":"Статус демона ажуриран, покушајте поново касније.", "STR_WEB_SERVICE_BUSY":"Севис је заузет, покушајте поново касније.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1219,6 +1319,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1266,6 +1370,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikasjonsfeil: Tjeneste utilgjengelig", "STR_WEB_TOKEN_MISMATCH":"Daemon status er oppdatert, vennligst prøv igjen senere.", "STR_WEB_SERVICE_BUSY":"Tjenesten er opptatt, vennligst prøv igjen senere.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1313,6 +1421,10 @@ "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":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1360,6 +1472,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1407,6 +1523,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Комуникациска грешка: Недостапен сервис", "STR_WEB_TOKEN_MISMATCH":"Ажуриран статус на даемонот, молиме обидете се подоцна.", "STR_WEB_SERVICE_BUSY":"Сервисот е зафатен, молиме обидете се подоцна.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1454,6 +1574,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1501,6 +1625,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1548,6 +1676,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1595,6 +1727,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Помилка зв'язку: Служба недоступна", "STR_WEB_TOKEN_MISMATCH":"Статус демона оновлено. Повторіть спробу пізніше.", "STR_WEB_SERVICE_BUSY":"Служба зайнята, повторіть спробу пізніше.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1642,6 +1778,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Σφάλμα επικοινωνίας: υπηρεσία μη διαθέσιμη", "STR_WEB_TOKEN_MISMATCH":"Η κατάσταση του δαίμονα επικαιροποιήθηκε. Παρακαλώ δοκιμάστε αργότερα.", "STR_WEB_SERVICE_BUSY":"Η υπηρεσία είναι απασχολημένη. Παρακαλώ δοκιμάστε αργότερα.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1689,6 +1829,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfel: Tjänsten är inte tillgänglig", "STR_WEB_TOKEN_MISMATCH":"Daemon-status uppdaterad. Försök igen senare.", "STR_WEB_SERVICE_BUSY":"Tjänster är upptagen. Försök igen senare.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" }, { @@ -1736,6 +1880,10 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Napaka v komunikaciji: storitev ni na voljo", "STR_WEB_TOKEN_MISMATCH":"Zahteva storitve je potekla, prosim poskusite kasneje.", "STR_WEB_SERVICE_BUSY":"Storitev je zasedena, prosim poskusite kasneje.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "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.", "STRXXX":"" } -] +] \ No newline at end of file diff --git a/Ventoy2Disk/Ventoy2Disk/Language.h b/Ventoy2Disk/Ventoy2Disk/Language.h index aa1f4c0f..ca2f0d7a 100644 --- a/Ventoy2Disk/Ventoy2Disk/Language.h +++ b/Ventoy2Disk/Ventoy2Disk/Language.h @@ -72,6 +72,11 @@ typedef enum STR_ID STR_WEB_TOKEN_MISMATCH, //37 STR_WEB_SERVICE_BUSY, //38 + STR_MENU_VTSI_CREATE, //39 + STR_VTSI_CREATE_TIP, //40 + STR_VTSI_CREATE_SUCCESS, //41 + STR_VTSI_CREATE_FAILED, //42 + STR_ID_MAX }STR_ID; @@ -83,7 +88,8 @@ extern BOOL g_SecureBoot; #define VTOY_MENU_PART_STYLE 0xA003 #define VTOY_MENU_PART_MBR 0xA004 #define VTOY_MENU_PART_GPT 0xA005 -#define VTOY_MENU_ALL_DEV 0xA006 +#define VTOY_MENU_ALL_DEV 0xA006 +#define VTOY_MENU_VTSI 0xA007 typedef enum OPT_SUBMENU @@ -93,6 +99,7 @@ typedef enum OPT_SUBMENU OPT_SUBMENU_PART_CFG, OPT_SUBMENU_CLEAR, OPT_SUBMENU_ALL_DEV, + OPT_SUBMENU_VTSI, OPT_SUBMENU_MAX }OPT_SUBMENU; diff --git a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c index 76816933..d888b583 100644 --- a/Ventoy2Disk/Ventoy2Disk/PhyDrive.c +++ b/Ventoy2Disk/Ventoy2Disk/PhyDrive.c @@ -1268,7 +1268,6 @@ static int FormatPart1exFAT(UINT64 DiskSizeBytes) { MKFS_PARM Option; FRESULT Ret; - FATFS fs; Option.fmt = FM_EXFAT; Option.n_fat = 1; @@ -1289,28 +1288,10 @@ static int FormatPart1exFAT(UINT64 DiskSizeBytes) Log("Formatting Part1 exFAT ..."); Ret = f_mkfs(TEXT("0:"), &Option, 0, 8 * 1024 * 1024); - if (FR_OK == Ret) { Log("Formatting Part1 exFAT success"); - - Ret = f_mount(&fs, TEXT("0:"), 1); - Log("mount part %d", Ret); - - if (FR_OK == Ret) - { - Ret = f_setlabel(TEXT("Ventoy")); - Log("f_setlabel %d", Ret); - - Ret = f_mount(0, TEXT("0:"), 1); - Log("umount part %d", Ret); - return 0; - } - else - { - Log("mount exfat failed %d", Ret); - return 1; - } + return 0; } else { @@ -1556,6 +1537,225 @@ End: return rc; } +int InstallVentoy2FileImage(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) +{ + int i; + int rc = 1; + int Len = 0; + int dataLen = 0; + UINT size = 0; + UINT segnum = 0; + UINT32 chksum = 0; + UINT64 data_offset = 0; + UINT64 Part2StartSector = 0; + UINT64 Part1StartSector = 0; + UINT64 Part1SectorCount = 0; + UINT8 *pData = NULL; + UINT8 *pBkGptPartTbl = NULL; + BYTE *ImgBuf = NULL; + MBR_HEAD *pMBR = NULL; + VTSI_FOOTER *pImgFooter = NULL; + VTSI_SEGMENT *pSegment = NULL; + VTOY_GPT_INFO *pGptInfo = NULL; + VTOY_GPT_HDR *pBkGptHdr = NULL; + FILE *fp = NULL; + + Log("InstallVentoy2FileImage %s PhyDrive%d <<%s %s %dGB>>", + PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, + GetHumanReadableGBSize(pPhyDrive->SizeInBytes)); + + PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN); + + size = SIZE_1MB + VENTOY_EFI_PART_SIZE + 33 * 512 + VTSI_IMG_MAX_SEG * sizeof(VTSI_SEGMENT) + sizeof(VTSI_FOOTER); + + pData = (UINT8 *)malloc(size); + if (!pData) + { + Log("malloc image buffer failed %d.", size); + goto End; + } + + pImgFooter = (VTSI_FOOTER *)(pData + size - sizeof(VTSI_FOOTER)); + pSegment = (VTSI_SEGMENT *)((UINT8 *)pImgFooter - VTSI_IMG_MAX_SEG * sizeof(VTSI_SEGMENT)); + memset(pImgFooter, 0, sizeof(VTSI_FOOTER)); + memset(pSegment, 0, VTSI_IMG_MAX_SEG * sizeof(VTSI_SEGMENT)); + + PROGRESS_BAR_SET_POS(PT_WRITE_VENTOY_START); + + Log("Writing Boot Image ............................. "); + if (ReadWholeFileToBuf(VENTOY_FILE_STG1_IMG, 0, (void **)&ImgBuf, &Len)) + { + Log("Failed to read stage1 img"); + goto End; + } + + unxz(ImgBuf, Len, NULL, NULL, pData, &dataLen, unxz_error); + SAFE_FREE(ImgBuf); + + if (PartStyle) + { + pGptInfo = (VTOY_GPT_INFO *)pData; + memset(pGptInfo, 0, sizeof(VTOY_GPT_INFO)); + VentoyFillGpt(pPhyDrive->SizeInBytes, pGptInfo); + + pBkGptPartTbl = pData + SIZE_1MB + VENTOY_EFI_PART_SIZE; + memset(pBkGptPartTbl, 0, 33 * 512); + + memcpy(pBkGptPartTbl, pGptInfo->PartTbl, 32 * 512); + pBkGptHdr = (VTOY_GPT_HDR *)(pBkGptPartTbl + 32 * 512); + VentoyFillBackupGptHead(pGptInfo, pBkGptHdr); + + Part1StartSector = pGptInfo->PartTbl[0].StartLBA; + Part1SectorCount = pGptInfo->PartTbl[0].LastLBA - Part1StartSector + 1; + Part2StartSector = pGptInfo->PartTbl[1].StartLBA; + + Log("Write GPT Info OK ..."); + } + else + { + pMBR = (MBR_HEAD *)pData; + VentoyFillMBR(pPhyDrive->SizeInBytes, pMBR, PartStyle); + Part1StartSector = pMBR->PartTbl[0].StartSectorId; + Part1SectorCount = pMBR->PartTbl[0].SectorCount; + Part2StartSector = pMBR->PartTbl[1].StartSectorId; + + Log("Write MBR OK ..."); + } + + Log("Writing EFI part Image ............................. "); + rc = ReadWholeFileToBuf(VENTOY_FILE_DISK_IMG, 0, (void **)&ImgBuf, &Len); + if (rc) + { + Log("Failed to read img file %p %u", ImgBuf, Len); + goto End; + } + + PROGRESS_BAR_SET_POS(PT_WRITE_VENTOY_START + 28); + memset(g_part_img_buf, 0, sizeof(g_part_img_buf)); + unxz(ImgBuf, Len, NULL, NULL, pData + SIZE_1MB, &dataLen, unxz_error); + if (dataLen == Len) + { + Log("decompress finished success"); + g_part_img_buf[0] = pData + SIZE_1MB; + + VentoyProcSecureBoot(g_SecureBoot); + } + else + { + Log("decompress finished failed"); + goto End; + } + + fopen_s(&fp, "VentoySparseImg.vtsi", "wb+"); + if (!fp) + { + Log("Failed to create Ventoy img file"); + goto End; + } + + Log("Writing stage1 data ............................. "); + fwrite(pData, 1, SIZE_1MB, fp); + pSegment[0].disk_start_sector = 0; + pSegment[0].sector_num = SIZE_1MB / 512; + pSegment[0].data_offset = data_offset; + data_offset += pSegment[0].sector_num * 512; + + disk_io_set_param(INVALID_HANDLE_VALUE, Part1StartSector + Part1SectorCount);// include the 2048 sector gap + disk_io_set_imghook(fp, pSegment + 1, VTSI_IMG_MAX_SEG - 1, data_offset); + + Log("Formatting part1 exFAT ..."); + if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes)) + { + Log("FormatPart1exFAT failed."); + disk_io_reset_imghook(&segnum, &data_offset); + goto End; + } + + disk_io_reset_imghook(&segnum, &data_offset); + segnum++; + + Log("current segment number:%d dataoff:%ld", segnum, (long)data_offset); + + //write data + Log("Writing part2 data ............................. "); + fwrite(pData + SIZE_1MB, 1, VENTOY_EFI_PART_SIZE, fp); + pSegment[segnum].disk_start_sector = Part2StartSector; + pSegment[segnum].sector_num = VENTOY_EFI_PART_SIZE / 512; + pSegment[segnum].data_offset = data_offset; + data_offset += pSegment[segnum].sector_num * 512; + segnum++; + + if (PartStyle) + { + Log("Writing backup gpt table ............................. "); + fwrite(pBkGptPartTbl, 1, 33 * 512, fp); + pSegment[segnum].disk_start_sector = pPhyDrive->SizeInBytes / 512 - 33; + pSegment[segnum].sector_num = 33; + pSegment[segnum].data_offset = data_offset; + data_offset += pSegment[segnum].sector_num * 512; + segnum++; + } + + Log("Writing segment metadata ............................. "); + + for (i = 0; i < (int)segnum; i++) + { + Log("SEG[%d]: PhySector:%llu SectorNum:%llu DataOffset:%llu(sector:%llu)", i, pSegment[i].disk_start_sector, pSegment[i].sector_num, + pSegment[i].data_offset, pSegment[i].data_offset / 512); + } + + dataLen = segnum * sizeof(VTSI_SEGMENT); + fwrite(pSegment, 1, dataLen, fp); + + if (dataLen % 512) + { + //pData + SIZE_1MB - 8192 is a temp data buffer with zero + fwrite(pData + SIZE_1MB - 8192, 1, 512 - (dataLen % 512), fp); + } + + //Fill footer + pImgFooter->magic = VTSI_IMG_MAGIC; + pImgFooter->version = 1; + pImgFooter->disk_size = pPhyDrive->SizeInBytes; + memcpy(&pImgFooter->disk_signature, pPhyDrive->MBR.BootCode + 0x1b8, 4); + pImgFooter->segment_num = segnum; + pImgFooter->segment_offset = data_offset; + + for (i = 0, chksum = 0; i < (int)(segnum * sizeof(VTSI_SEGMENT)); i++) + { + chksum += *((UINT8 *)pSegment + i); + } + pImgFooter->segment_chksum = ~chksum; + + for (i = 0, chksum = 0; i < sizeof(VTSI_FOOTER); i++) + { + chksum += *((UINT8 *)pImgFooter + i); + } + pImgFooter->foot_chksum = ~chksum; + + Log("Writing footer segnum(%u) segoffset(%llu) ......................", segnum, data_offset); + Log("disk_size=%llu disk_signature=%lx segment_offset=%llu", pImgFooter->disk_size, pImgFooter->disk_signature, pImgFooter->segment_offset); + + fwrite(pImgFooter, 1, sizeof(VTSI_FOOTER), fp); + fclose(fp); + + Log("Writing Ventoy image file finished, the file size should be %llu .", data_offset + 512 + ((dataLen + 511) / 512 * 512)); + + rc = 0; + +End: + + PROGRESS_BAR_SET_POS(PT_MOUNT_VOLUME); + + Log("retcode:%d\n", rc); + + SAFE_FREE(pData); + SAFE_FREE(ImgBuf); + + return rc; +} + + int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) { int i; @@ -1573,7 +1773,6 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) UINT64 Part1SectorCount = 0; UINT64 Part2StartSector = 0; - Log("InstallVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>", PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId, GetHumanReadableGBSize(pPhyDrive->SizeInBytes)); @@ -1680,8 +1879,6 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle) goto End; } - - PROGRESS_BAR_SET_POS(PT_FORMAT_PART2); Log("Writing part2 FAT img ..."); diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c index 4c9fdf4d..9eb25701 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.c @@ -28,6 +28,7 @@ DWORD g_PhyDriveCount = 0; static int g_FilterRemovable = 0; int g_FilterUSB = 1; int g_ForceOperation = 1; +int g_WriteImage = 0; int ParseCmdLineOption(LPSTR lpCmdLine) { diff --git a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h index 8ec38ab8..2f9b6918 100644 --- a/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h +++ b/Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h @@ -233,4 +233,61 @@ UINT32 VentoyCrc32(void *Buffer, UINT32 Length); #define SECURE_ICON_STRING _UICON(UNICODE_LOCK) +extern int g_WriteImage; + +#define VTSI_IMG_MAGIC 0x0000594F544E4556ULL // "VENTOY\0\0" + +#pragma pack(1) + +/* + +--------------------------------- + + sector 0 ~ sector N-1 + + data area + +--------------------------------- + + sector N ~ + + segment[0] + + segment[1] + + segment[2] + + ...... + + segment[M-1] + + align data (aligned with 512) + +--------------------------------- + + footer + +--------------------------------- + * + * All the integers are in little endian + * The sector size is fixed 512 for ventoy image file. + * + */ + +#define VTSI_IMG_MAX_SEG 128 + +typedef struct { + UINT64 disk_start_sector; + UINT64 sector_num; + UINT64 data_offset; +}VTSI_SEGMENT; + +typedef struct { + UINT64 magic; + UINT32 version; + UINT64 disk_size; + UINT32 disk_signature; + UINT32 foot_chksum; + + UINT32 segment_num; + UINT32 segment_chksum; + UINT64 segment_offset; + + UINT8 reserved[512 - 44]; +}VTSI_FOOTER; +#pragma pack() +extern int __static_assert__[sizeof(VTSI_FOOTER) == 512 ? 1 : -1]; + + +#define SAFE_FREE(ptr) if (ptr) { free(ptr); (ptr) = NULL; } +int InstallVentoy2FileImage(PHY_DRIVE_INFO *pPhyDrive, int PartStyle); +void disk_io_set_imghook(FILE *fp, VTSI_SEGMENT *segment, int maxseg, UINT64 data_offset); +void disk_io_reset_imghook(int *psegnum, UINT64 *pDataOffset); + #endif diff --git a/Ventoy2Disk/Ventoy2Disk/WinDialog.c b/Ventoy2Disk/Ventoy2Disk/WinDialog.c index 20f6f66c..a91de0c2 100644 Binary files a/Ventoy2Disk/Ventoy2Disk/WinDialog.c and b/Ventoy2Disk/Ventoy2Disk/WinDialog.c differ diff --git a/Ventoy2Disk/Ventoy2Disk/ff14/source/diskio.c b/Ventoy2Disk/Ventoy2Disk/ff14/source/diskio.c index bebe6253..d62b581c 100644 --- a/Ventoy2Disk/Ventoy2Disk/ff14/source/diskio.c +++ b/Ventoy2Disk/Ventoy2Disk/ff14/source/diskio.c @@ -11,6 +11,8 @@ #include "ff.h" /* Obtains integer types */ #include "diskio.h" /* Declarations of disk functions */ +#include "../Ventoy2Disk.h" + /* Definitions of physical drive number for each drive */ #define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */ @@ -23,12 +25,41 @@ static UINT8 g_MbrSector[512]; HANDLE g_hPhyDrive; UINT64 g_SectorCount; +FILE *g_VentoyImgFp = NULL; +VTSI_SEGMENT *g_VentoySegment = NULL; +int g_VentoyMaxSeg = 0; +int g_VentoyCurSeg = -1; +UINT64 g_VentoyDataOffset = 0; + void disk_io_set_param(HANDLE Handle, UINT64 SectorCount) { g_hPhyDrive = Handle; g_SectorCount = SectorCount; } +void disk_io_set_imghook(FILE *fp, VTSI_SEGMENT *segment, int maxseg, UINT64 data_offset) +{ + g_VentoyImgFp = fp; + g_VentoySegment = segment; + g_VentoyMaxSeg = maxseg; + + memset(segment, 0, maxseg * sizeof(VTSI_SEGMENT)); + g_VentoyCurSeg = -1; + g_VentoyDataOffset = data_offset; +} + +void disk_io_reset_imghook(int *psegnum, UINT64 *pDataOffset) +{ + *psegnum = g_VentoyCurSeg + 1; + *pDataOffset = g_VentoyDataOffset; + + g_VentoyImgFp = NULL; + g_VentoySegment = NULL; + g_VentoyMaxSeg = 0; + g_VentoyCurSeg = -1; + g_VentoyDataOffset = 0; +} + /*-----------------------------------------------------------------------*/ /* Get Drive Status */ /*-----------------------------------------------------------------------*/ @@ -126,6 +157,13 @@ DRESULT disk_read ( BOOL bRet; LARGE_INTEGER liCurrentPosition; + //Log("xxx disk_read: sector:%ld count:%ld", (long)sector, (long)count); + + if (g_VentoyImgFp) + { + return RES_OK; + } + liCurrentPosition.QuadPart = sector * 512; SetFilePointerEx(g_hPhyDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN); @@ -162,6 +200,9 @@ DRESULT disk_write ( DWORD dwSize; BOOL bRet; LARGE_INTEGER liCurrentPosition; + VTSI_SEGMENT *CurSeg = NULL; + + Log("==== disk_write: sector:%ld count:%ld", (long)sector, (long)count); // skip MBR if (sector == 0) @@ -177,6 +218,31 @@ DRESULT disk_write ( count--; } + if (g_VentoyImgFp) + { + CurSeg = g_VentoySegment + g_VentoyCurSeg; + + if (g_VentoyCurSeg >= 0 && CurSeg->sector_num > 0 && sector == CurSeg->disk_start_sector + CurSeg->sector_num) + { + CurSeg->sector_num += count; //merge + } + else + { + g_VentoyCurSeg++; + CurSeg++; + + CurSeg->disk_start_sector = sector; + CurSeg->data_offset = g_VentoyDataOffset; + CurSeg->sector_num = count; + } + + g_VentoyDataOffset += count * 512; + + fwrite(buff, 1, count * 512, g_VentoyImgFp); + return RES_OK; + } + + liCurrentPosition.QuadPart = sector * 512; SetFilePointerEx(g_hPhyDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN); diff --git a/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c b/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c index c39bea6f..5fb4823b 100644 --- a/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c +++ b/Ventoy2Disk/Ventoy2Disk/ff14/source/ff.c @@ -6067,6 +6067,11 @@ FRESULT f_mkfs ( /* Initialize the root directory */ mem_set(buf, 0, sz_buf * ss); buf[SZDIRE * 0 + 0] = ET_VLABEL; /* Volume label entry (no label) */ + + //default label: Ventoy (unicode) + buf[1] = 6; //label length + memcpy(buf + 2, L"Ventoy", 2 * buf[1]); + buf[SZDIRE * 1 + 0] = ET_BITMAP; /* Bitmap entry */ st_dword(buf + SZDIRE * 1 + 20, 2); /* cluster */ st_dword(buf + SZDIRE * 1 + 24, szb_bit); /* size */