From cbbd57eee5980acc6879e119fe6b8913285f2af6 Mon Sep 17 00:00:00 2001 From: longpanda Date: Sat, 27 Feb 2021 17:57:41 +0800 Subject: [PATCH] 1.0.36 release --- INSTALL/README | 5 +- INSTALL/Ventoy2Disk.exe | Bin 324096 -> 324096 bytes INSTALL/VentoyWeb.sh | 7 +- INSTALL/grub/grub.cfg | 2 +- INSTALL/tool/VentoyWorker.sh | 30 ++-- INSTALL/tool/ventoy_lib.sh | 29 ++++ LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c | 8 +- LinuxGUI/Ventoy2Disk/Core/ventoy_log.c | 28 +++ LinuxGUI/Ventoy2Disk/Core/ventoy_util.c | 33 ++-- LinuxGUI/Ventoy2Disk/Core/ventoy_util.h | 2 +- .../Lib/fat_io_lib/{release => }/API.txt | 0 .../fat_io_lib/{release => }/COPYRIGHT.txt | 0 .../{release => }/Configuration.txt | 0 .../Lib/fat_io_lib/{release => }/History.txt | 0 .../Lib/fat_io_lib/{release => }/License.txt | 0 .../{release => }/Media Access API.txt | 0 .../Ventoy2Disk/Lib/fat_io_lib/buildlib.sh | 30 ---- .../Lib/fat_io_lib/{release => }/fat_access.c | 0 .../Lib/fat_io_lib/{include => }/fat_access.h | 0 .../Lib/fat_io_lib/{release => }/fat_cache.c | 0 .../Lib/fat_io_lib/{include => }/fat_cache.h | 0 .../Lib/fat_io_lib/{include => }/fat_defs.h | 0 .../fat_io_lib/{release => }/fat_filelib.c | 0 .../fat_io_lib/{include => }/fat_filelib.h | 0 .../Lib/fat_io_lib/{release => }/fat_format.c | 0 .../Lib/fat_io_lib/{include => }/fat_format.h | 0 .../Lib/fat_io_lib/{include => }/fat_list.h | 0 .../Lib/fat_io_lib/{release => }/fat_misc.c | 0 .../Lib/fat_io_lib/{include => }/fat_misc.h | 0 .../Lib/fat_io_lib/{include => }/fat_opts.h | 13 +- .../Lib/fat_io_lib/{release => }/fat_string.c | 0 .../Lib/fat_io_lib/{include => }/fat_string.h | 0 .../Lib/fat_io_lib/{release => }/fat_table.c | 0 .../Lib/fat_io_lib/{include => }/fat_table.h | 0 .../Lib/fat_io_lib/{include => }/fat_types.h | 0 .../Lib/fat_io_lib/{release => }/fat_write.c | 0 .../Lib/fat_io_lib/{include => }/fat_write.h | 0 .../Lib/fat_io_lib/lib/libfat_io_32.a | Bin 45670 -> 0 bytes .../Lib/fat_io_lib/lib/libfat_io_64.a | Bin 58226 -> 0 bytes .../Lib/fat_io_lib/lib/libfat_io_aa64.a | Bin 47506 -> 0 bytes .../Lib/fat_io_lib/release/example.c | 87 ---------- .../Lib/fat_io_lib/release/fat_access.h | 133 --------------- .../Lib/fat_io_lib/release/fat_cache.h | 13 -- .../Lib/fat_io_lib/release/fat_defs.h | 128 -------------- .../Lib/fat_io_lib/release/fat_filelib.h | 146 ---------------- .../Lib/fat_io_lib/release/fat_format.h | 15 -- .../Lib/fat_io_lib/release/fat_list.h | 161 ------------------ .../Lib/fat_io_lib/release/fat_misc.h | 63 ------- .../Lib/fat_io_lib/release/fat_opts.h | 90 ---------- .../Lib/fat_io_lib/release/fat_string.h | 20 --- .../Lib/fat_io_lib/release/fat_table.h | 20 --- .../Lib/fat_io_lib/release/fat_types.h | 69 -------- .../Lib/fat_io_lib/release/fat_write.h | 14 -- .../Lib/fat_io_lib/{release => }/version.txt | 0 LinuxGUI/Ventoy2Disk/Web/ventoy_http.c | 4 +- LinuxGUI/WebUI/index.html | 1 + LinuxGUI/build.sh | 6 +- Ventoy2Disk/Ventoy2Disk/Utility.c | 21 ++- 58 files changed, 136 insertions(+), 1042 deletions(-) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/API.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/COPYRIGHT.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/Configuration.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/History.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/License.txt (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/Media Access API.txt (100%) delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_access.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_access.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_cache.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_cache.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_defs.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_filelib.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_filelib.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_format.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_format.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_list.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_misc.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_misc.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_opts.h (83%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_string.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_string.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_table.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_table.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_types.h (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/fat_write.c (100%) rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{include => }/fat_write.h (100%) delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_32.a delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_64.a delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_aa64.a delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_access.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_cache.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_defs.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_filelib.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_format.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_list.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h delete mode 100644 LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h rename LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/{release => }/version.txt (100%) diff --git a/INSTALL/README b/INSTALL/README index 2535f490..db836ce6 100644 --- a/INSTALL/README +++ b/INSTALL/README @@ -18,9 +18,8 @@ Please refer https://www.ventoy.net/en/doc_start.html for details. ========== VentoyWeb.sh =============== -sudo sh VentoyWeb.sh -Normally, it will popup a web browser window. -If not you can open your browser and visit http://127.0.0.1:24680 +1. sudo sh VentoyWeb.sh +2. open your browser and visit http://127.0.0.1:24680 diff --git a/INSTALL/Ventoy2Disk.exe b/INSTALL/Ventoy2Disk.exe index 770a8b1b5e06246b5ec7bc66b7b53f646fe66994..d831232bb537176b2afb7085b1b31267a7b50786 100644 GIT binary patch delta 14773 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 LxY|{Ee@p%cIC}J< delta 14644 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 By~zLo diff --git a/INSTALL/VentoyWeb.sh b/INSTALL/VentoyWeb.sh index bb6a910a..721e419a 100644 --- a/INSTALL/VentoyWeb.sh +++ b/INSTALL/VentoyWeb.sh @@ -97,6 +97,11 @@ if [ -f ./tool/$TOOLDIR/V2DServer.xz ]; then chmod +x ./tool/$TOOLDIR/V2DServer fi + +V2DServer "$HOST" "$PORT" & +wID=$! +sleep 1 + vtVer=$(cat ventoy/version) echo "" echo "===============================================================" @@ -112,7 +117,7 @@ echo "" echo "################## Press Ctrl + C to exit #####################" echo "" -V2DServer "$HOST" "$PORT" +wait $wID if [ -n "$OLDDIR" ]; then CURDIR=$(pwd) diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index a7d44ca3..3f44dad5 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -1546,7 +1546,7 @@ function img_unsupport_menuentry { ############################################################# ############################################################# -set VENTOY_VERSION="1.0.35" +set VENTOY_VERSION="1.0.36" #ACPI not compatible with Window7/8, so disable by default set VTOY_PARAM_NO_ACPI=1 diff --git a/INSTALL/tool/VentoyWorker.sh b/INSTALL/tool/VentoyWorker.sh index ac2102c8..c820ffc4 100644 --- a/INSTALL/tool/VentoyWorker.sh +++ b/INSTALL/tool/VentoyWorker.sh @@ -125,11 +125,7 @@ if [ "$MODE" = "list" ]; then fi #check mountpoint -grep "^$DISK" /proc/mounts | while read mtline; do - mtpnt=$(echo $mtline | awk '{print $2}') - vtdebug "Trying to umount $mtpnt ..." - umount $mtpnt >/dev/null 2>&1 -done +check_umount_disk "$DISK" if grep "$DISK" /proc/mounts; then vterr "$DISK is already mounted, please umount it first!" @@ -299,6 +295,9 @@ if [ "$MODE" = "install" ]; then xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1 fi + # check and umount + check_umount_disk "$DISK" + xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector #test UUID @@ -317,10 +316,7 @@ if [ "$MODE" = "install" ]; then vtinfo "esp partition processing ..." sleep 1 - mtpnt=$(grep "^${PART2}" /proc/mounts | awk '{print $2}') - if [ -n "$mtpnt" ]; then - umount $mtpnt >/dev/null 2>&1 - fi + check_umount_disk "$DISK" if [ "$SECUREBOOT" != "YES" ]; then mkdir ./tmp_mnt @@ -332,10 +328,7 @@ if [ "$MODE" = "install" ]; then break fi - mtpnt=$(grep "^${PART2}" /proc/mounts | awk '{print $2}') - if [ -n "$mtpnt" ]; then - umount $mtpnt >/dev/null 2>&1 - fi + check_umount_disk "$DISK" sleep 2 done @@ -349,6 +342,8 @@ if [ "$MODE" = "install" ]; then mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI mv ./tmp_mnt/EFI/BOOT/grubia32_real.efi ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI + sync + for tt in 1 2 3; do if umount ./tmp_mnt; then vtdebug "umount part2 success" @@ -439,15 +434,19 @@ else dd status=none conv=fsync if=./rsvdata.bin seek=2040 bs=512 count=8 of=${DISK} rm -f ./rsvdata.bin + check_umount_disk "$DISK" + xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start sync - + if [ "$SECUREBOOT" != "YES" ]; then mkdir ./tmp_mnt vtdebug "mounting part2 ...." - for tt in 1 2 3 4 5; do + for tt in 1 2 3 4 5; do + check_umount_disk "$DISK" + if mount ${PART2} ./tmp_mnt > /dev/null 2>&1; then vtdebug "mounting part2 success" break @@ -467,6 +466,7 @@ else mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI mv ./tmp_mnt/EFI/BOOT/grubia32_real.efi ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI + sync for tt in 1 2 3; do if umount ./tmp_mnt > /dev/null 2>&1; then diff --git a/INSTALL/tool/ventoy_lib.sh b/INSTALL/tool/ventoy_lib.sh index c108197a..a394eb14 100644 --- a/INSTALL/tool/ventoy_lib.sh +++ b/INSTALL/tool/ventoy_lib.sh @@ -97,6 +97,14 @@ get_disk_part_name() { fi } +check_umount_disk() { + DiskOrPart="$1" + grep "^${DiskOrPart}" /proc/mounts | while read mtline; do + mtpnt=$(echo $mtline | awk '{print $2}') + vtdebug "Trying to umount $mtpnt ..." + umount $mtpnt >/dev/null 2>&1 + done +} get_ventoy_version_from_cfg() { if grep -q 'set.*VENTOY_VERSION=' $1; then @@ -218,6 +226,14 @@ format_ventoy_disk_mbr() { fi part2_start_sector=$(expr $part1_end_sector + 1) + + modsector=$(expr $part2_start_sector % 8) + if [ $modsector -gt 0 ]; then + vtdebug "modsector:$modsector need to be aligned with 4KB" + part1_end_sector=$(expr $part1_end_sector - $modsector) + part2_start_sector=$(expr $part1_end_sector + 1) + fi + part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1) export part2_start_sector @@ -302,6 +318,8 @@ EOF echo "create efi fat fs $PART2 ..." for i in 0 1 2 3 4 5 6 7 8 9; do + check_umount_disk "$PART2" + if mkfs.vfat -F 16 -n VTOYEFI $PART2; then echo 'success' break @@ -333,6 +351,14 @@ format_ventoy_disk_gpt() { fi part2_start_sector=$(expr $part1_end_sector + 1) + + modsector=$(expr $part2_start_sector % 8) + if [ $modsector -gt 0 ]; then + vtdebug "modsector:$modsector need to be aligned with 4KB" + part1_end_sector=$(expr $part1_end_sector - $modsector) + part2_start_sector=$(expr $part1_end_sector + 1) + fi + part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1) export part2_start_sector @@ -397,7 +423,10 @@ format_ventoy_disk_gpt() { fi echo "create efi fat fs $PART2 ..." + for i in 0 1 2 3 4 5 6 7 8 9; do + check_umount_disk "$PART2" + if mkfs.vfat -F 16 -n VTOYEFI $PART2; then echo 'success' break diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c index 4d0871b8..4df2040e 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c @@ -330,6 +330,7 @@ static int fatlib_is_secure_boot_enable(void) flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); if (flfile) { + vlog("/EFI/BOOT/grubx64_real.efi find, secure boot in enabled\n"); fl_fclose(flfile); return 1; } @@ -504,7 +505,10 @@ int ventoy_get_vtoy_data(ventoy_disk *info, int *ppartstyle) goto end; } - vdebug("now check secure boot ...\n"); + vdebug("ventoy partition layout check OK: [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + + vdebug("now check secure boot for %s ...\n", info->disk_path); g_fatlib_media_fd = fd; g_fatlib_media_offset = part2_start_sector; @@ -546,7 +550,7 @@ int ventoy_get_vtoy_data(ventoy_disk *info, int *ppartstyle) rc = 0; end: - close(fd); + vtoy_safe_close_fd(fd); return rc; } diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c index 469f843e..6e788c2f 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c @@ -80,6 +80,34 @@ void ventoy_syslog_newline(int level, const char *Fmt, ...) pthread_mutex_unlock(&g_log_mutex); } +void ventoy_syslog_printf(const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(VTOY_LOG_FILE, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + void ventoy_syslog(int level, const char *Fmt, ...) { char log[512]; diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c index 562c3a09..d15a4191 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.c @@ -347,6 +347,7 @@ static int ventoy_fill_gpt_partname(uint16_t Name[36], const char *asciiName) int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO *gpt) { uint64_t ReservedSector = 33; + uint64_t ModSectorCount = 0; uint64_t Part1SectorCount = 0; uint64_t DiskSectorCount = size / 512; VTOY_GPT_HDR *Head = &gpt->Head; @@ -362,18 +363,28 @@ int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO ReservedSector += reserve / 512; } + Part1SectorCount = DiskSectorCount - ReservedSector - (VTOYEFI_PART_BYTES / 512) - 2048; + + ModSectorCount = (Part1SectorCount % 8); + if (ModSectorCount) + { + vlog("Part1SectorCount:%llu is not aligned by 4KB (%llu)\n", (_ull)Part1SectorCount, (_ull)ModSectorCount); + } + // check aligned with 4KB if (align4k) { - if (DiskSectorCount % 8) + if (ModSectorCount) { - vdebug("Disk need to align with 4KB %u\n", (uint32_t)(DiskSectorCount % 8)); - ReservedSector += (DiskSectorCount % 8); + vdebug("Disk need to align with 4KB %u\n", (uint32_t)ModSectorCount); + Part1SectorCount -= ModSectorCount; + } + else + { + vdebug("no need to align with 4KB\n"); } } - Part1SectorCount = DiskSectorCount - ReservedSector - (VTOYEFI_PART_BYTES / 512) - 2048; - memcpy(Head->Signature, "EFI PART", 8); Head->Version[2] = 0x01; Head->Length = 92; @@ -461,7 +472,7 @@ int VentoyFillMBRLocation(uint64_t DiskSizeInBytes, uint32_t StartSectorId, uint return 0; } -int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, MBR_HEAD *pMBR) +int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR) { ventoy_guid Guid; uint32_t DiskSignature; @@ -498,11 +509,6 @@ int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, ReservedSector = (uint32_t)(reserve / 512); } - if (PartStyle) - { - ReservedSector += 33; // backup GPT part table - } - // check aligned with 4KB if (align4k) { @@ -512,11 +518,14 @@ int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, vlog("Disk need to align with 4KB %u\n", (uint32_t)(sectors % 8)); ReservedSector += (uint32_t)(sectors % 8); } + else + { + vdebug("no need to align with 4KB\n"); + } } vlog("ReservedSector: %u\n", ReservedSector); - //Part1 PartStartSector = VTOYIMG_PART_START_SECTOR; PartSectorCount = DiskSectorCount - ReservedSector - VTOYEFI_PART_BYTES / 512 - PartStartSector; diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h index eb093106..72cec62d 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h @@ -46,7 +46,7 @@ int unxz(unsigned char *in, int in_size, int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen); const char * ventoy_get_local_version(void); int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO *gpt); -int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, int PartStyle, MBR_HEAD *pMBR); +int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR); #endif /* __VENTOY_UTIL_H__ */ diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/API.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/API.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/API.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/API.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/COPYRIGHT.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/COPYRIGHT.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/COPYRIGHT.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/COPYRIGHT.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Configuration.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Configuration.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Configuration.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Configuration.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/History.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/History.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/History.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/History.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/License.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/License.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/License.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/License.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Media Access API.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Media Access API.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/Media Access API.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/Media Access API.txt diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh deleted file mode 100644 index dec432f7..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/buildlib.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -rm -rf include -rm -rf lib - -cd release -gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c -ar -rc libfat_io_64.a *.o -rm -f *.o - - -gcc -m32 -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c -ar -rc libfat_io_32.a *.o -rm -f *.o - - -aarch64-linux-gnu-gcc -O2 -D_FILE_OFFSET_BITS=64 fat*.c -c -ar -rc libfat_io_aa64.a *.o -rm -f *.o - - -cd - - - -mkdir lib -mkdir include - -mv release/*.a lib/ -cp -a release/*.h include/ - diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_access.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_access.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_access.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_access.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_access.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_cache.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_cache.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_cache.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_cache.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_cache.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_defs.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_defs.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_defs.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_defs.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_filelib.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_filelib.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_filelib.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_filelib.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_format.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_format.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_format.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_format.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_format.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_list.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_list.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_list.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_list.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_misc.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_misc.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_misc.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_opts.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_opts.h similarity index 83% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_opts.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_opts.h index ac4dc860..6db158c4 100644 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_opts.h +++ b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_opts.h @@ -63,7 +63,7 @@ // Include support for formatting disks (1 / 0)? #ifndef FATFS_INC_FORMAT_SUPPORT - #define FATFS_INC_FORMAT_SUPPORT 1 + #define FATFS_INC_FORMAT_SUPPORT 0 #endif // Sector size used @@ -71,15 +71,8 @@ // Printf output (directory listing / debug) #ifndef FAT_PRINTF - // Don't include stdio, but there is a printf function available - #ifdef FAT_PRINTF_NOINC_STDIO - extern int printf(const char* ctrl1, ... ); - #define FAT_PRINTF(a) printf a - // Include stdio to use printf - #else - #include - #define FAT_PRINTF(a) printf a - #endif + void ventoy_syslog_printf(const char *Fmt, ...); + #define FAT_PRINTF(a) ventoy_syslog_printf a #endif // Time/Date support requires time.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_string.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_string.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_string.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_table.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_table.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_table.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_types.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_types.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_types.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_types.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.c similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.c rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.c diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_write.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.h similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/include/fat_write.h rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/fat_write.h diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_32.a b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_32.a deleted file mode 100644 index e68fa3865044193a9c77cdde9634650b9a512eba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45670 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 diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_64.a b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_64.a deleted file mode 100644 index 8598a87c74e5b726f4b3a04750741feee31c6799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58226 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 diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_aa64.a b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_aa64.a deleted file mode 100644 index 7b9b66c608a86043260797b4376ecd67a37f10f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47506 zcmd^o4R}@6neN*A96}(dAqfxyH79^pqNM>6$g#HB38*NxgCXs8T4!=jPJ#&uKgkIS z!k804hmm$Jk&HiWXE*_DNv5}#E1~67rvznMXU3VUXst7k_Zq-fr#c-4RH9(+`>ws# z$;##&MeoylJNNE9CwuRAul22Oed}A_Uf=rLMc0MfB8^`f|M|e^WA1{v^B2sUS2lNH zAW$M7ng0WUx#bJyxiLcHg%H(3jJ^NU|E~O@5c+rZZXtfxztxut;r;!|V?unI-?#1* z;-h}weL#qh`~CG-gm8Z=!tE=fwN0y=+J$@BQWvgWv!XWAvM$=*(5Ap>L!^C8TWwoI zxPCNpS6fqi!)S&8~0WQ@^Jv~kT{we=0{;ii_T3Uxj-QKoAr@LZxZNvJeXuFQQZf$+Iy}=FG(y;oD_C^(QRk*F$h3gwy8rmClW?B%r zw!W!N=5j-Av_0IG6vyaCs~gtqCy{WZvB8v_3y?*I@^J1xj9&1tMNw#}4Y#+0Vr|Qs zNHa2$ykFH&-xTJ3v~gW~{hGU0^LoXawGHmY3X~JF2Po3ACW@lKm0L`>051`V;6l<| z5p8H_*2vm5F4o@A(ju{jH7n#<6)FgXFv+NT*c7GQWvXl1R)w`}SIC=MXyn`ls_aIf`SV6WLQA?f+H`kAZF{(`r2#=w zph;RS(3lH~Zv-@zYXpT1Rl4$dEuXZHsKW@@wEE6)OOw{E5qy-6x^NUU)~s&Pn(TsF zCbDKGA*#JfpD7b>YKTJ6t?N(*IyHt`9bN@7tRaIc0+VseYgEONd6UIhix39!I~rCu zw6O}YN-Dg4O?$Ydc5S#FD%x;o!>F1XT~`+cJFD-|>8)*PYL{UZ5LvToZMdzWmaIXK zWX{|eV5mM?dsh?4Mq9#EW%-b`h+Nk_96dy8fT}ya%v-bfKA%W2*)TB@wX$&`M z-pLaxiw@3`GapCRtXmCcjP$ht8A;;Nwc&`)QMd&LL|Q+_81;m~M{Fl^Q5%j#8lurT zYxp)!zJV8vegn@fDOpfj8VD>5&P~37JFdUw2HUdmB6bf;{8)_KX;g@-rjJ}Z^3oAm zV!ZGPCs>pzZngbRLM(GO6lMCR1+ty20blKlg#q6$&Tsr_@9_@jvGYFBbvjE7o%V^o z!dW6=U1JS_On2mRXUI26^!HyThT7|_t{EbR7D24~xG%3SBr0AMd7?D@!^IooH~&R- zg%Hg}xuPcY$2SG*zJ62C35cvhVKrA0Te&1ySRz^*CyJWFYeeglmxvm1i6|qjj>|=Y z>5#Uj>r51-p$961;Xkho1|*%#)-d9R`znL0zE>G+_^Zm`9pA1Du6VFA7%#H2B0sGR zit9v9-A^imuLs6tt*}Kf^NS)UR4q2t@2(711$#AdxZKtmRl%>!xHPK;dCRi0 zveqJhvp;4=aOp?^XsIPgMpZ*JUpcg+!KJWM|pJ&I&yS?1u;w z5LXvjqNedTxc)7$Usnd3PE;bF*~>*(WX&w{WeMTS+8nc|{R%SZ5mr{Eu$E?IiqfLY zpA}R*ThZD(R@B5k+$GCuwqMi~LFWCJIVkH`b$FggoX&EF&To8jAN9k^6Sr3QMQf8l zndOVteW!+N>NYP4hVEMu4BxXP7`b~%unN37;58hukhYZ-LRo%mczDW6aZ%Wp)l@VNvceB#unXaI+8yIXqQjehxk~@su$%sGhie8A#}Tm{#{0!c{G4OB z4k`S<<2sP6>Amao^#z0|9`uXSgSlep zP@x!l*miSpx)&|{!Die^(vYnCbI4w_le@ec5ZWcc(~>O$^~UHcfg18 zo983~wkX{U8m!x~4BQKQ+QI*sKkZPVGZeQ)*1=q7=xaXFf7~~@Zwu)ltX zde3h>x-W$MFs-v64nK5?GRkqFr*`u==vU{ZP9jFVM|le9-*54p^hjHP25D(Jlv(H3 zs}ijH0mLO9`?{Uzgsm{s)oBJ0|1Hq_HDqH$Hm^cfzk-~fL_Ii;JkcIej(Z@-=fK+@ zq_xK{`nRGysF$vd@bwJ{k;O7$89u7YFpe@@WV>O#;Y2p`m(e`VM*b!sf76}By`bsl zF(WI2csfoTbhqG{Oyf2?LA*0$bx~%_Kl7}gF&v+hHytKs#33z~YbNw&8_L6*@7JIk zyWPB(X&!Gfc+~vOL|o0EurAEE&)}cDF^uN*{Kmslrhfu?-eHOU^Ba#SIgXWbWLTXa zo!3+t;}K_mbUEpFh7e*0eqH!=N1&fJ?yGQ*ch!y#*pMPz7m3Z^Hp7L-Q^!W)g(rLN zq1U6HL*IE%8-;ThWsY+m`4O2;V!&7X;`xpHWL{4%w|etJqzUg5I5j{AmN@CoReQ!97;jG=HqxCt}A=_$H(NPc0twP3c2A-2@M<@V`#(aoZ3m!12@0LpF^whQ^CE0QDxP8=440i=UfIjCe&-uiz3)X9^$s;J?)@NoJ?i;O(vE8$ z2HzhpJv>i9hOuLZZ83BhHaEO7RNk{PP%iwUt1uwm?u4xgUFihtW;nrcu@fweiPqge zw}SD1u!24R9cSb(zNa!+cu2G|uRnRp3X=ap-y}EBNTcpjr+4#ZqBj7Z>MpIswbe@= z)A3hYvFk^Ff}eht$s@yju!jThirW5IRTwKJ6>$)A^uIICu|y+I&z)j)UF+>^AHB zQ!|_)mdysdyO}@g&-smiE8h{!TPoR7?}SGlIv!=hXFU5L51*0;>Cm>PmB~yoM43<) zQz4TRzR~4LS)BGw9VG|Uqfadd#}~^9p`D02-bXnw@01PYqGd8Plkc66mPJU(f?-GN z$KOi*(6V4TR%D9V6#)^XY+O6qm(-JYd{!Uz<6YwyY zjiy~Xfco0;CDFPB@@T(&s^&on=$mysOt%G=9vkf3^8}wUW z52D^Mth7Z)o8cLTaTzcC;c$(Yk1D^IxZ4(q!!u}KM7Op}y3U{9_@a~r+xI#@p|K*F zX5fQiw8vnFRbCH&Rt)vbw7L#22hHV{v{{tbX4tD4jic>V4EAaZ^1oTxt35ZuPA#>9 zyZ^un4x;TEpXu5wI8HSKu-)-RR*?2v+8fxr4%nUJ$diEG=QC|Tv^)xhXr(*`$L=Z^ z$nggQ;Ip&X*|2$mvjJ_K#8a1AiAu*RJ~G})96wueYov*q8ZHj=sbZyjYup5w< zxS_HJT`BU6&J%eKsE)d8FTs7FX2aTsz!$HG;+jXG8hv(w#Z7I28=Bgp?SVyZFJj<} zfh*QuG9J%CFi_QSN7L%SEmf6(OV-N=$$%-INxI8r*IYEPtf4I#7DVew^u|Stt_@su zOVjFb+nNAw0t@Gqer{gL+~Ay&d9!&lXKnzu<#XrFoger{iwyTUBTS&J;m#&@CIreB zG(;AxSWp)XMj~?;EL^doBrj0?~b zAUQ}kpq{*CyBA-;DO+LY>1Nz8e74H+EcLKf;pGa?Q+TVwmwE853U5?+i4w`fz*D8W zUxj~IiS$j}^LP?J^0Q5e;u(nw@e76Drn3A^g};t-D*FGH20x?dysqeEDmq!Af* z3LHIVG6!9q?Q=@REZr$d30KinISS zgGe9I&+W3S1_LB-Yd0u0N0*{|OhbK`ph27uDLY7wa2h@XZPk4<#tZ?!5+-!q%8~A68@Nomb+`#u4INH0(;|T*d`G48K zP5v`8-KflOAW21t76UiwpEYokPQH3Sk&c<)Sq5(Ax5U8BbQc@=41=F14BSk2(7?@f z-!yPD-LnR6raM8sN6EjLZjFJP={}tXf8D@Me$E)U$q#z|(O@&e6|r@%!zJTg%NX{+uPi8qrPfuXbI1eZ{<0dP7xM!>Y`CG zr)>>y7<}%Waxn+**;RN^i8-s+v^UJT@he~b941dhn$0Bscdi47jI0Y~#*(BQb+uRJ zOFvN6R^Q4x%BH@PMBIy*dZ{f@gc*3Z z#2q64*fH|C^GeDwl#U}b{$j_-*Bg0oBrA>>2T8C$$LzCA-v6HUcTi@ZysyK^^oaOT zRu`6*tLom8aU-Sb)8La-eI~Te^cnS`b*)I@`d**Eq;PH5HBSFPDTUzzUND`=1=zm7 z_}O3|WsWbf#J?-k%c?;srL(!ZZX$?0l5$b^lqchROY%1L+SxEb-j+L&ffS`Z_X2HX{wV}@8jkL&0P@W^q@~<^VU|3FyY8c2ljuw;J6z2*`eqC z%oonkPK+`4|I+Gx2mRAO!u*BF%S6|dkiQH1kr&NyhL&TDx!s=l9Oo45vM0TP@v|Dt z2I>M?j&+t|?5!_W=a=^}jG@tva;&!hmzBLgQu7XIXZ5{M&-FN(J08+2$3xD5k4fO~ zpe?%Iog#(~R*9~&m^Z<(w6ho|(c_JnYmpr98}Of9sOM7rc$yf(*hw*7e;B9DE8c^# zgx!0rE*&p`F^)Je@;-n$82yhs8-_90BK~t{L!OhDbv4EbF*fjquD#Thz_ITGhL{!)&0@HwC5`9y-UNEPP%#)Ql-=Zna^z2@tM ze(vydJ{HD;-v4)hFVe_)zPKv!0mg;SeO?S<%(^(4se+;VeA8mSsabc6 zsY^RB5990ezgy5@PiclvTC)&i$}eE7i1SOBzov1bhI3FRfj(u5I+528S{&c#U*jZp zWr(?h$UDQvFjwdVWU%Le)x|Q`vP0QoEISW!cgK8BLe2~qUn3G`IMO9e(k5NX492F5 zb4h&Qee+n%y}^AI<}CG~Y=nbr)uECd~mfGI)Ji@ zA%6=p2MS)gPfV*5`RIPmU&{G43rn`3Y$i7kLbeMq{`I&jn^z$3UX0ywo?R(uccX03 zMUHwWCO!@s@;PK;l*c6G&mFrPl;trE<>B6sE)O>x=}@kuLwZM07Mw%XF&1-*FfR5Z z6BvDaXro_=N??mI^fFGExXCh zN6ungA7%D4$dYHKi!t?@S8>mJkNJs1b(ov72ME^KZZx#-il44m$*z1Wr$~8vzAp2Er#9Gb7Zy%r#AvV zLZA}^4Bi6BhOO zm`>l1c=t|N+;Lh3N+%(b6d50R)_2T@-A0^-aEThe!HH3K~ zLy!sQM^FangDQp5-c9?0{C_}#c7H7n&k6?WN z*Z5t5Yue&VU{Cj~tSj%h-D({iBWhm9eAo`Z)#|`DzmEHkABfgY%pZ7utXL4W3+Hhj z1m-z(G43s}UF4x?8d^Y(=nC7`cpLRs1e_uCZ@xWW>?}aJ_B)WrMqA|U%n%Dh_Ou+n zBM*$dY9Z#h9AllpT+X4;XI!}*fP5Z@?Ii!4OTzZT`Hg=s^|fQ0)rxmz&1~@8@wC+n zyHwNhvenx8!EjB~_7{^c^7qe>X-B5j8t3yRc>X@0i+TF_b9}zlYUR5$YFo*8uvJr{ z_GgmeevbPCRwnX2CK={QV3cVO&U_F23U!?CK8zXmA2^X6?XRe>uLjdOFIp5brV07mGjTwku!G z5d9~7(~Em>uk+Ibdx&|3$+QMCMCmSHLGu9ShJSag=;GX1ttY2{`}qZ0Zt>p^_b*p+ z3*ee^`w`mST0WE;(>SEs-x|LdxrN`wylUk28=(Iq*htRvy$yU&N2!N=X6je(rkn$q133sgejM}D=nZ^N@5W1bZA zF@t&Z(0Tmia9JE}qR`3V(vFP6w!lfsV`|^$l)U37hNXVzfu63TQ*cdsmm2gwI6quE zUg4RBEWZHUuW;MIPXbHYRb}VHkQr=wUjTMapbgy4wg@m`*w@&C#R=5^GTPY??1!W5 zF5ZQ54x4H7sZX8r7AL63o1e^t9_IC(q?};$cP;QI{vFS$w;#m^%c%x!BrhNO9UH^k z@wkn-TqsNOw5v*-rTyRaq&OQxc{1El)=9iqsUOMrfqFj)Ij>rD=baxuXuh*LQI1S= z3+AJ5Mt#%u_t#QxkN2X#S^BT^3(wLH2`53n@eJnlmTj`9!O<-(#JgcD-VJfA{fM1d z77S&H1z#N}N@JkOI`kmsAirXZ<`Z0-VNcGY-f+#z6ft=zgf{fvyuT>;=X=I2AGSs7 zi!(&dzh%1b7|u~-{a=8!6_j5LGX6H?TPUVB(>Ak=;%FC9?rb-^^N92Mehb+TLPsB& z=TA`nr|n5gg@bnp(u3~=+bNnWeb)BqF}%&5D%*b0&dtJPwTX52I6Eo382BBwCpG7a z+^n6Lzxyq`4^Dyx=Qwwq8{7JicppTtuEa)Mo#t~$(?Po-_qHj^(Z0_j4bnB~ya|7R z`JjHYek3pl6#8AvdhhzQZo5gB`QM`q$j?5U=^t?ZD`k>^y!>6Mti1!Z3A>;v|fVtX0m-N>r3od zaxN*#t;{cO#hQyg^!MZq_|7gISUJDEoxbB$a{gYI16j=gkKh;OVHd|MFuxFUY0vm_ zi}~zu1?L%xZl-PF{T{EV3^G3Hz<=r@9pbP2eJOaIjJcX>PBYr6x?PDncno$z&dHWO zk>}Y+JLhj?JBL0#+f!J7AnU!G9}8_AyEw%56?6qW^g~DAju%wjEg%Ed3DX|1-m#t? zL>a@5whHJU^dSfHyIXsxi_mrI2j0_(agYtm|3Ulgk0*=CS$y^&aMpo+ZoF#N;V|q< zCG1K7?HA-#wk4UL^BbR%?Gei9Ur?T;c^c<;eUtxzH2w_jC8o6tIMAu+=Ngd#{gY&y9JcNq^ijz6p0aIhD}}&!9PjNIcpLQCym#QckMI_&{y?T3%Ndck zyRL+O5!>|xu&Ydy{HRcN*?Q0Q+ZaDVe-zt1 zzkpsITIdYD58XHiJCW1vxUz?XnWC)2&TK{5)wp(X zTGB4=`(XH?`1ldK$o?d@r9!^x+o@|?P!_NS)wEkN*v+WzllG7H>=oF07!E_&^ywSFdfoJ*N z#e42MsB3Z1rF~rl`PiUKyLbumuoHY*u(R+1TIVYpebBbD$mc-LSMQ!pS%A-9g08lu ztPlG75Uyn#2mMlPFr$575ao zpu_q=d7gxvP9Q$(Q4#W^-}iVX*YTJ(fp$^1hl-R<7_muteHNY-SxQ~ia`(2S`0k@kartxegz!1H{3x*bB> z#rE3(+8-#RQMS4cI>L0xFX}_T+0Q=GW_SBpM(*8quq_L;^{40uv+P`b zfiGS>2)$-|0Dad(yWmfiAuQVl0{vt$=~KC3$;T_u2i?}&E9Ek|kG#75-A|x9I+o+@ zgL2=?qHj-yNU&Zz&~xg9SI>1lqizn+4xe`G%y736_y*v@bK>!h7vJEIeHX$xr|VyG)I+?#DV_H`m| zvLCJoHdp&i2-{Da$oDn*)8k`3KC3I)hYH#5&b>ZJjPbCpwv@b>VK`Ptd$0SS9M$G= z`TvD0^FOFexHMcFs@AD=zo6s_eX3^LO56D!)E%b7zAvtm(QOy>o$rXiMxTJL$UauL zyz;O-rS^v9*9NX{Yg^M6z}5>b^#ROm3bd>V*UPmlYVk|psw?Ve7jf~4d$g(ZCF8O7 z#oa|Fa7A?F`4!Q?b&GGR{*p#;|BWl^19cnP8=`;od$@+hLViB^oDN7e#gS?*hCBU- zsf<22t;bxy(yboPRQSW{{w;N$ukdY(6nq7FR4Kefv2?q_mnnP)UIaW^+>^lAhMO)1 zw|H!FPof=X@`E}dj~az{DEuXbH!Aw~%jb%?3d_^C@UtLMePpYPzf`!s*L?LTJg%bX z=l@ON`xPEnlLy!VNczjvyfB^8&lFzc!2zRLqL}B6I$ZuQ#QFG>tOxo9!fT!tX?gnB zG&q<~89qM^{<$=`lLoIzgSV!^|11suy)^jaY4B&$;3w1I@1()crNJ>)kWy|%Y4CYz z@G9V(8-@0nJeIg8akIj=DO{K7*A@P-!gak|nT9^vzA5?Kr0A3=J+4>jZqxJ?{+3ec zt~7KWPJ=&|2LE{)9PPrCd~!XT&bwk!p2onwq{1%;PI+!q^=_+*bd|!h)%?r-3ZIvT z&QcYAK!ra9J>XH3Cj2*4`1OjZayPiBSNMK~Kcnzf3Xe@xfTDk=#??GaZ6`Yw{+7Z+ zD%$-DUxtPN4;}sig%2qFcF2*(cNHF(?A|->Nj$3XkiywW;PFF+KdkV*E-cr(q>}%$ zD!jv17mh)dF8cUVmKVmOWqAeEB=MteG+{ySQqi9doaOtv3LjJ9Kbt0er3&9T%?8;Ia?8XOEpB)CU|laIk{`w z$mVyV)?6DF6>=vxwRlW!JXI?<%WGO4ZD?z+#g1L=qIP7@Deh6`?n%W&g-csrVlmvv zouq+)ATKwtVhD}lk}yt~fadPqmAo_eRZF$Pi?c0LEK>WZt;=N6a;ep*6=|dPV3Uiq zJX@T7#L^j2)iWo5Eh zFxe0LoLw+^6|mkX?P515l!W9;N4;(^)s}@=H-HW56mKJX!pz#IN(N;K$woMClJPk`!~{ua1X9K)Yn9` zt-9QU-=e}#13pz<^K^R}e6Pa2^!F)zl863LgO0f#=vf0-CR!rr3|yI9iDZH<5AtcQ z?jpl{z^}vmmxotAj>0eCCk_6z!oBi&$-o0LCHEitP2|Dw zrhM|1vU=0KO5qGY)1Y&mfnQ>GXUuDq8+!%R~ z&)Ek4s(}|9xKRF&mmj~vz5Gm2IO&`ANBdn~I*ZfLxn1Gja?yU8m(DlS(D{MFz2Wz# z39r}Pdh_*+3eSAaG34`>fnROlXVTF3s|K)_PM*TaC;AtYN4~i@h(pOO+MEu+#7zc5&lXys{G%d27kuDKWl`4GY$Q-MtHNn__N%|UVicwPX5jM zUT)y*Gt>v>-N=LCwXaE_-N4J-AoBlK17Bd^`xNfw=Vc?jDW5mf;Qk3NQSxKT=Qaa3 z)2&yyH{F;Kexb>yft&VizkwGU;omZF-Iu_}-Kt;1tG5p;+{@1o(%?ta;Cg+nR}ZJF zeh_cE0fl?hElq(A62-{m+r@X zLE)bPpR`LF$NUg^kpC|lbgokkYj3_58@S2m!v=nxK__4J2a%46e^cR_PaS24!oBi; zA`L!W^&fe|I|^sICZF93_on-B8an&a;1g6ol$TDn!oBzbOs=Od2}R zrU`#04gP~XwzZ#Kfm74A*{!Jsi*{+zNIvu?9OBBw0neBwd z23}_HS!3V}47}aI%ME;=ft%s`74GHdStI;HgU&evH{VkwDwAIQDOI?a{<1W9y}~I6 zv!4XBg5}|*vp)^~ghA&Pga4yx!ark#SC=x@%LZY!)Y5GC?4ScD={~-_k+tjlG z4}Fav^@ML!;r0F+lqdPo_zOn5UpCTx)4)wW&l{x4f=VxHrG025y#1je(nT zXjHhjyjm3QO?Q*R`JP&C zH1f=QWq##5h`8#8<0E+tc+%B4!v;Nn6Q1j9Gw6RYJC%(G-mtt^U8+VXA@-~IgQ}l}?mk}) zntv^S;$GR2(2gtkUx*H~k%N10`fT2(il1G<*h2iFdrJQI#^*SbJ8*Du-=LYVx0?6_ z`|G@}d{{E!NKPCv9y{!CPOpu5$ef4AId_w=w>RgiWBwrKsSC{Gp4khSzcz?@ zhmjdr7x{IO;ChV^z6-!LULmYS2w?uT0Op;WE5uLTICa>A0COE>oZ+5R;W=W6G?MYL z?uqGlpfn>zBu8CVms+r3|KBK4}SXxYft)o>ia(-d^=PjYp#*H3wx3Cn=RxS-)-4IzWE&=uGPbR0>zK%g<^+;xqm%BySKXjFaPwI zl@V|AKh}FHj54af|LId!wiA4{={KhqA#Od&De{073}e1xmB2m}w%z=%$g2nlxqrXC z)j33r@@G8k%Yd~6@>>SgoWm;fh&hdVFOk^zBL(BIe}ASEtG-FZPjT%+rWJ3yNerC2 z@1D%%0{fNUdr$WAt@q?FzZvO^O_|HbiQ!Yk$NC43U48xT>McLJzuLYGdVzF8GejaE zYlj<)MIsYnS3V|!;Rmf?Q(eZ{&`+#j<4>*N9oOO;Nhhpeo`@Y=@oOvC@Ea>w|642A zd=I{FWLq2R#@oRRlw*8ldwDnJ1_vhC!CiC2+Ya)ibunz`ZKwXdiFHQhc+PMPV__eP zBUf!Z<{Z2~r?dEbr$RsUZ#a^1^b~c#^1pg2d?NF#z%}P957-qi!hpzn!nFjcrw2@5y80%Ysw-SBGGWaHM<_) zG|IwSc7b(`;rlCRGkyg7pofK(#Wn62FKgu-&~#~oPq`j!C+Z2WyVRW0PpX$_@VL4N zz5GvVEpY&OVp-pY^Lps#ozT+|^wXxELO+>j+(S>@dC=>jbJWu+=&2(tsjJk}2=vvb zbd~xRfxe!Eu127zmDEwkNz|g8_P|b{>nP9urmLS#)X$O;{iN)XNARS+4dBtyOZ>58 z8UA?nm!YF?j*TCig|IWP-(0<2>FE8?(LaNZeg(MLG*W~*p$C~wbIvB(ASm|8D~3wD>i6dZHBI{gswJ0S3{?u z%kM&$-?xG*K76mg!vA+>IbK6EC@vWobU~{e5XXD4V_d>9+)O=cl^|F zX%W+gK69;g0QdYx4ev?&IOcxW*=~LL7M^?coa>Fjdk**fxmR6p!MQ>#YrP420vhZk z%G=kW+Y)}^zV-^x=b+QG63NtS3gf_wHWnQSQ|~YTDGu*G7{c4JBDQziHGQrjdZj z&yuE`v!$lTB){@_5#K6R`MFA+>C(%c=^%aX7KVKSK+<<>{YmzpEuQ91aG>H zs)~5&>%F*%YuzKGnaYQvZ?A@3B>#FWpSa;-U;zA+?y38`+R0I}DFQfwMJ&-CeK_hi zTjftbRkmB-ruFgl9?<(q90$qpQpe9Hh~rB9h?_b=e3?pjEpLoN$JbC=AK$~b4zJkJ zx3d49n6?}G!GMbYaX$LBh~TA38f9Ka6=82!-m9viLb#`L6@O4g;4SO7CadK)4wzSV zq>w+J|AqKF_muqaO+THFuJ@?EIT_Qv@W!XzTh$bes4Z|mb`RY7!G#L~^0@dtaJLy1 z$dPO~s8d;@FwY+>Lc7+=_TxKnzF(kiGlUNKuEPC=hYH^+EXTX*jWB!=uKD8g8Nvxx zWs97}*mGeE_WJ3#MaVV|pZoF_2cN>)w#}QIosU|v>Z|-t&<9#K`t9xaZo1+-8EBi{ zm^pU4Eyis3i?Q1yIA=C~wmdMw3C8>)7|6pp6X)qTPr!K=&e=GZ+RINyfzESy6)Uxo8poUg%oJEy@jF#~(q(wbkHNppSN7uP zHDB^R@A~Au-Zu}b)NPlbFXGSs5_@Z5->jE<+qlPB<))(V6rHQvS+r?0x_vv7a^e03 zc%AIn3cqWlAHwRp{~8B<6?X5oS?IGszsP;lt9rk;YfNuv3HEk@Jnn?9_5D|0@4oN* zdwa0IB-8yh+T}Ld-N<7pjF04j>02u8z^2$zen)pNbTN+p5=#`!>$pes?!Cu9O@Q8E z^eYtMd;-s{?9KxEPmi9&9&2+%F!toE?RPE^@DbrZ-eckOxv?DB_dKhyt~|VQX1Ua# zQt@^S^4+t3_n}UtQ-SY{hHc;WH{ioN!0%Auux24xi?Bz4kMzm7`y_TC%)deJu&!6` zBbCwEP`;w^it8DeX-AAaNYvz{&xs81cxZy~l7grM(t zJSz^Z$hOv_P6ivU!uO9u)}gvmu^~KNBy>6Iz9{y?q3;QOQ2ZvDCHAYQ_$^Nkr()u1~Fdg4k>(;^;_GyWUTe%0BKl{eJL2Tuf<%a|AUM>QCM3yDC&xqBQFGAc(6_4SIN;VgC>ThGB40O2#z=Q5z zV>z>1?BAoLvWlDYHdmzFJ9SRSmbTD16jnCRax z=au>TU9Q)4U(ZbC!XuS$>9&(q1KblO)%WAv@UUPh4qviGH2Ptx^{6aE8eDy_?a1S^ z_z~A_z(ImIzK9=j{k<{${8oiKiWK#N#|r!y{x*e|N>qq@6s~>dB?|uwg}B(a-?rc`=pO{h0`ZCYtMRx(OspV(J+zd!T)_8ppAOd%s@rc9X8bmQbpREN$>t~BKP z2qI0!=X;39mG}|&`hnl{q|2~87}h*!2g%c?jXxK0NmHp0uG~YfqtNz91eq{=(v>pqOQ63lpD zwB?$AU4Cq5cx4Yryu}ANYCOz&Ze<^Fs`vr*;t0EBlK;K&X_jHHnpWT88E0P@2$V=) z-Tgneq+|g<<}knflYhr1qGn3%}+@y~J1wr&-!U&HSy;8i8}7Vz0H@JPvh1=ydzxf7y$1?~O4@Ef_0 zKlYw3W;+&b@@np{&bICV_TNJ9anME@7JUAWC*VWC|EYLgw8kj&72@7Hrb#v$zebrwFx5XxWDfws?iee-!x8X{ zvOMUgyFa&!bKZg8M+^HIasSi44tr`d$HJq>9w~@o&r|FJ*muCrm3~IYslxID@V79> zpg8%x0qhl~_uf2giy)tIPsUWwiQ}6EIovyn`br;6_dV!+M43m_s$fX&n>M+RdoIqv z9+rjlhoO(lv9EUw`WQz!4PswJ&b`2Re-7!*5R;POYDBjT*MVD?I83Sv^chC z?4{}YOW3PxF8hpF=Jf@Y*V51YF}^3kxN+?HeHY}Az;`De#(4-jQ-FP<|Jk0poqL@B z#4fBYh8U`T^vZ`HW-VW~OVD z8_H)A_U@Y^%lbW}&vMO&uDzEbp35IAo;zYs*&es^x1Yv7)=#dytGqTQS}ReP>QOgd z_08&=CH&jbgvp!vR&99)p7lTu*n72a27Jz1;g|hx^C4f1jg%UodHg=gH-KxF%U|Of-vYs2lJ2)F zevEP3(0jvWlmq3$Z;711-uEm==KH^@aoy7>57O$!bL{7uH%#Z`0F}?e#2VWmO=DaEY5cB*8PIm3#<4r6=c8h%)uKqYd_IoUb zOCzVa&<~3~ zi9V!}b07Tn4(Ra~=<(l*dkZi&T?U);Hv0l;*IOXlLD)OSeH3L3y0C3ywhQz{Ik3^S zes@07;!JTX-ygoUk~0c!Mz{(!Ft}(j!e<|kJzif34FW;*;0PnV4wNE z3xJnbeHq1zkuL2zW%FA0wt@`uV2x?cK%R-SOtzv-j=)CG0^Or1yAW*pVe~_-1dR}A z3o(Xz))f%6?e05?bZ5!@h&Q%^7I+NKl6mk;xoLiG1kU#qza#T|)`cM~7>M6xAI8Ow zzi$E``bgDR!Dp%ZJZ1x@ZyjR*95MM{h)SG^%M9Xr2{Vf0tN5kzp>GGy@On-Es|<_- z{g5fcw*zPR5-1uE9d8@1iLY0_n!|@U9>tINA%)*2Q6UBtuGebsSNIDGA3y_w$4l-B zogpKQO6l$203Ud{Y-HBrv}o1ZudG>wF?Z$ke$*x`(d6bTqnv7E?-IS~hIG+WZT;f5 zZsDcZM{DnDYHzHKVsDy8mA2f#1-^KF6G(%JG_s+ljtcN^iyOT_*60|Phdn?AdVzifmz$MerAJ@E2l z`uHZDTks;|;SGO#8vH-n__p4o%+2M9Z>I03;euIpG@#CzN=SPC4P8a5fY-OXQsGMM zDmLl~BcwQ#8YQ1xgDcYfwDIR6E@^swW1arT`NrwSx4*123fku3<)8OT70qB`nTr3k ziojde15Nhhd}BSn{coeFCe3IPoro*1?D#NS`J*={L%J7U{%OYW>Eo6LHNc(x-eEf5 zc;Vc6(q#@@{P?!)6i|FP@~r2eyZgWU0+@#>$6BnuEoir0A*vE~o|EtgIL~iP@or%+ zy&i3b%{U(x{^qK!y9z?0;>8e_qXqDu@5rzd9PiNkn~o{39J+UmyO%xMGIEZ)OMgrs zWQB1Ve0vJ*-8#Dp^F^)ZZD?aH2K`;QhMlOX8(%quahZcBu?H)@+cU)bI^5HLlfVlBOJPv*wUS2(;0*KF0n0-83fk{ea)HIyYQKoMGrc zvJK1qV10w*x?aWna@#TGq38Mg`s%-A520wfL&!r%l|9sPgN-s7k*TJm$Hj6XSca4gx%bI2AT`R$SGmnelpRld3 z$Aaw=XM%T-)8KH|IO>94v%tNo0FRC>?zQOMFK zEclnX+h?FIQKm7-l=2*eKX4Fp1vGu8#Wc-yUOxvvj5_66U-1{V`@K&uUXQXL(-_^E&7ij&s*?KFdO-`*!P0`bL|7yJt0DQ5+31V(0 z{4@3$aeWNK!Tz9M$^Bj-uWia-_BFX!2>k|(_jmA-55T4b@cazwzP8sD?5~2|)%vCN zoie3y;Ij{Cry&)x4;OiqSpy58~^X)v=6^4*b( zcTq0+or}I7QpgYLbCbx;k^M~00+AB(cZ#7CizdqTb}%+5HpY%$r+W>J*w**Vopy zgjYA~ndkZe5+Q*|%erWL1NL&1p0!CqZ<6UgKyYrWse*HuJJJ|#N_xy|)~yCJ+{ROd zh)PN6`4C>;@>wN+;->HVs)3t&bDfgEH~j4eZid(U#4)^y|3~v((ceGn(7uxf)A_Ce zyt#Soa8Gis6RW033_hRj_dAM<##c@tF$;5>${c( zKe6w+P4U8fIsAwJ?)vG+a@%G6{*l{`D?}Tb^R0E;EERw0XnzgsU7>?{Y{#+9)&p7fLsl3+O41L(Z@{=+ zYbDxABl33Bjzivq$T!*H;0Ou=C9c9#)oR3YZ5$1r|LEROHSk(RuE$VrfvrduecH{XJB@OXtYG!;DfuEE^a zJg2YgZLg2zWsD7u%Io>{|_#k|9j(f^+)9CfR?tBDSzZk~*{Ev|?b!9iweH6NfxgXL7J&N)R zp&n8GyZ3+}gyD1Y#AmT{!=;CS+2}i>Un8GI@O>lb7Q+bW24r8#uq^K$&^UoIU>xcv z!}EKo)G3y^ri*V9mohHDN7xA2W3E6ebtsy%tDqIU{=WGy;9Kw=_PZRXOXtHd?N8#9 zu-(VDyFOl47gyjss!gcyFQmcInUXU6df=o#h%=9DmDB^cCjOSXZ&wY3?=uVodX6V? zp9+654gN+N9P0&A(&60SRP-07!M~ISr;FgaH**Z1C*@ZQ7&3)(kDgQsCu8A8>w&Zv-aov7p&=%bD@P^-K;3j>{MM#D>`Gnm|;^z8ZbDYy$ zH~Xp)-qcHeqlO3hF~c78deUWDJd_%_H~62< zhrHPM>3m2X|I_-AQ&rzWl2LWx<)8OTrAGw~sQB6HA?2oj45;NtF)I}(oILb5v2OJw U=($bnL+U-RZ%$HlFTC;p7bxv^zyJUM diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c deleted file mode 100644 index 5d30e5b6..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/example.c +++ /dev/null @@ -1,87 +0,0 @@ -#include -#include "fat_filelib.h" - -int media_init() -{ - // ... - return 1; -} - -int media_read(unsigned long sector, unsigned char *buffer, unsigned long sector_count) -{ - unsigned long i; - - for (i=0;im))) : 0 -#define fat_list_next(l, p) (p)->next -#define fat_list_prev(l, p) (p)->previous -#define fat_list_first(l) (l)->head -#define fat_list_last(l) (l)->tail -#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) - -//----------------------------------------------------------------- -// Inline Functions -//----------------------------------------------------------------- - -//----------------------------------------------------------------- -// fat_list_init: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_init(struct fat_list *list) -{ - FAT_ASSERT(list); - - list->head = list->tail = 0; -} -//----------------------------------------------------------------- -// fat_list_remove: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - - if(!node->previous) - list->head = node->next; - else - node->previous->next = node->next; - - if(!node->next) - list->tail = node->previous; - else - node->next->previous = node->previous; -} -//----------------------------------------------------------------- -// fat_list_insert_after: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - FAT_ASSERT(new_node); - - new_node->previous = node; - new_node->next = node->next; - if (!node->next) - list->tail = new_node; - else - node->next->previous = new_node; - node->next = new_node; -} -//----------------------------------------------------------------- -// fat_list_insert_before: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - FAT_ASSERT(new_node); - - new_node->previous = node->previous; - new_node->next = node; - if (!node->previous) - list->head = new_node; - else - node->previous->next = new_node; - node->previous = new_node; -} -//----------------------------------------------------------------- -// fat_list_insert_first: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - - if (!list->head) - { - list->head = node; - list->tail = node; - node->previous = 0; - node->next = 0; - } - else - fat_list_insert_before(list, list->head, node); -} -//----------------------------------------------------------------- -// fat_list_insert_last: -//----------------------------------------------------------------- -static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) -{ - FAT_ASSERT(list); - FAT_ASSERT(node); - - if (!list->tail) - fat_list_insert_first(list, node); - else - fat_list_insert_after(list, list->tail, node); -} -//----------------------------------------------------------------- -// fat_list_is_empty: -//----------------------------------------------------------------- -static FAT_INLINE int fat_list_is_empty(struct fat_list *list) -{ - FAT_ASSERT(list); - - return !list->head; -} -//----------------------------------------------------------------- -// fat_list_pop_head: -//----------------------------------------------------------------- -static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) -{ - struct fat_node * node; - - FAT_ASSERT(list); - - node = fat_list_first(list); - if (node) - fat_list_remove(list, node); - - return node; -} - -#endif - diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h deleted file mode 100644 index 0c026343..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_misc.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __FAT_MISC_H__ -#define __FAT_MISC_H__ - -#include "fat_defs.h" -#include "fat_opts.h" - -//----------------------------------------------------------------------------- -// Defines -//----------------------------------------------------------------------------- -#define MAX_LONGFILENAME_ENTRIES 20 -#define MAX_LFN_ENTRY_LENGTH 13 - -//----------------------------------------------------------------------------- -// Macros -//----------------------------------------------------------------------------- -#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) -#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) - -#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ - buffer[location+1] = (uint8)((value>>8)&0xFF); \ - buffer[location+2] = (uint8)((value>>16)&0xFF); \ - buffer[location+3] = (uint8)((value>>24)&0xFF); } - -#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ - buffer[location+1] = (uint8)((value>>8)&0xFF); } - -//----------------------------------------------------------------------------- -// Structures -//----------------------------------------------------------------------------- -struct lfn_cache -{ -#if FATFS_INC_LFN_SUPPORT - // Long File Name Structure (max 260 LFN length) - uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; - uint8 Null; -#endif - uint8 no_of_strings; -}; - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); -void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); -char* fatfs_lfn_cache_get(struct lfn_cache *lfn); -int fatfs_entry_lfn_text(struct fat_dir_entry *entry); -int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); -int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); -int fatfs_entry_sfn_only(struct fat_dir_entry *entry); -int fatfs_entry_is_dir(struct fat_dir_entry *entry); -int fatfs_entry_is_file(struct fat_dir_entry *entry); -int fatfs_lfn_entries_required(char *filename); -void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); -void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); -int fatfs_lfn_create_sfn(char *sfn_output, char *filename); -int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); -void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); -void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); -uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); -uint16 fatfs_convert_to_fat_date(int day, int month, int year); -void fatfs_print_sector(uint32 sector, uint8 *data); - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h deleted file mode 100644 index ac4dc860..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_opts.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef __FAT_OPTS_H__ -#define __FAT_OPTS_H__ - -#ifdef FATFS_USE_CUSTOM_OPTS_FILE - #include "fat_custom.h" -#endif - -//------------------------------------------------------------- -// Configuration -//------------------------------------------------------------- - -// Is the processor little endian (1) or big endian (0) -#ifndef FATFS_IS_LITTLE_ENDIAN - #define FATFS_IS_LITTLE_ENDIAN 1 -#endif - -// Max filename Length -#ifndef FATFS_MAX_LONG_FILENAME - #define FATFS_MAX_LONG_FILENAME 260 -#endif - -// Max open files (reduce to lower memory requirements) -#ifndef FATFS_MAX_OPEN_FILES - #define FATFS_MAX_OPEN_FILES 2 -#endif - -// Number of sectors per FAT_BUFFER (min 1) -#ifndef FAT_BUFFER_SECTORS - #define FAT_BUFFER_SECTORS 1 -#endif - -// Max FAT sectors to buffer (min 1) -// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) -#ifndef FAT_BUFFERS - #define FAT_BUFFERS 1 -#endif - -// Size of cluster chain cache (can be undefined) -// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 -// Improves access speed considerably -//#define FAT_CLUSTER_CACHE_ENTRIES 128 - -// Include support for writing files (1 / 0)? -#ifndef FATFS_INC_WRITE_SUPPORT - #define FATFS_INC_WRITE_SUPPORT 1 -#endif - -// Support long filenames (1 / 0)? -// (if not (0) only 8.3 format is supported) -#ifndef FATFS_INC_LFN_SUPPORT - #define FATFS_INC_LFN_SUPPORT 1 -#endif - -// Support directory listing (1 / 0)? -#ifndef FATFS_DIR_LIST_SUPPORT - #define FATFS_DIR_LIST_SUPPORT 1 -#endif - -// Support time/date (1 / 0)? -#ifndef FATFS_INC_TIME_DATE_SUPPORT - #define FATFS_INC_TIME_DATE_SUPPORT 0 -#endif - -// Include support for formatting disks (1 / 0)? -#ifndef FATFS_INC_FORMAT_SUPPORT - #define FATFS_INC_FORMAT_SUPPORT 1 -#endif - -// Sector size used -#define FAT_SECTOR_SIZE 512 - -// Printf output (directory listing / debug) -#ifndef FAT_PRINTF - // Don't include stdio, but there is a printf function available - #ifdef FAT_PRINTF_NOINC_STDIO - extern int printf(const char* ctrl1, ... ); - #define FAT_PRINTF(a) printf a - // Include stdio to use printf - #else - #include - #define FAT_PRINTF(a) printf a - #endif -#endif - -// Time/Date support requires time.h -#if FATFS_INC_TIME_DATE_SUPPORT - #include -#endif - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h deleted file mode 100644 index 90ca8e05..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_string.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __FILESTRING_H__ -#define __FILESTRING_H__ - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -int fatfs_total_path_levels(char *path); -int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); -int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); -int fatfs_compare_names(char* strA, char* strB); -int fatfs_string_ends_with_slash(char *path); -int fatfs_get_sfn_display_name(char* out, char* in); -int fatfs_get_extension(char* filename, char* out, int maxlen); -int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); - -#ifndef NULL - #define NULL 0 -#endif - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h deleted file mode 100644 index ead75f32..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_table.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __FAT_TABLE_H__ -#define __FAT_TABLE_H__ - -#include "fat_opts.h" -#include "fat_misc.h" - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -void fatfs_fat_init(struct fatfs *fs); -int fatfs_fat_purge(struct fatfs *fs); -uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); -void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); -int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); -int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); -int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); -int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); -uint32 fatfs_count_free_clusters(struct fatfs *fs); - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h deleted file mode 100644 index 5e2cca8a..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_types.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef __FAT_TYPES_H__ -#define __FAT_TYPES_H__ - -// Detect 64-bit compilation on GCC -#if defined(__GNUC__) && defined(__SIZEOF_LONG__) - #if __SIZEOF_LONG__ == 8 - #define FATFS_DEF_UINT32_AS_INT - #endif -#endif - -//------------------------------------------------------------- -// System specific types -//------------------------------------------------------------- -#ifndef FATFS_NO_DEF_TYPES - typedef unsigned char uint8; - typedef unsigned short uint16; - - // If compiling on a 64-bit machine, use int as 32-bits - #ifdef FATFS_DEF_UINT32_AS_INT - typedef unsigned int uint32; - // Else for 32-bit machines & embedded systems, use long... - #else - typedef unsigned long uint32; - #endif -#endif - -#ifndef NULL - #define NULL 0 -#endif - -//------------------------------------------------------------- -// Endian Macros -//------------------------------------------------------------- -// FAT is little endian so big endian systems need to swap words - -// Little Endian - No swap required -#if FATFS_IS_LITTLE_ENDIAN == 1 - - #define FAT_HTONS(n) (n) - #define FAT_HTONL(n) (n) - -// Big Endian - Swap required -#else - - #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) - #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ - ((((uint32)(n) & 0xFF00)) << 8) | \ - ((((uint32)(n) & 0xFF0000)) >> 8) | \ - ((((uint32)(n) & 0xFF000000)) >> 24)) - -#endif - -//------------------------------------------------------------- -// Structure Packing Compile Options -//------------------------------------------------------------- -#ifdef __GNUC__ - #define STRUCT_PACK - #define STRUCT_PACK_BEGIN - #define STRUCT_PACK_END - #define STRUCT_PACKED __attribute__ ((packed)) -#else - // Other compilers may require other methods of packing structures - #define STRUCT_PACK - #define STRUCT_PACK_BEGIN - #define STRUCT_PACK_END - #define STRUCT_PACKED -#endif - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h deleted file mode 100644 index 5558a86e..00000000 --- a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/fat_write.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __FAT_WRITE_H__ -#define __FAT_WRITE_H__ - -#include "fat_defs.h" -#include "fat_opts.h" - -//----------------------------------------------------------------------------- -// Prototypes -//----------------------------------------------------------------------------- -int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); -int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); -int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); - -#endif diff --git a/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/version.txt b/LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/version.txt similarity index 100% rename from LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/release/version.txt rename to LinuxGUI/Ventoy2Disk/Lib/fat_io_lib/version.txt diff --git a/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c b/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c index 755a08c2..e7329d8a 100644 --- a/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c +++ b/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c @@ -346,6 +346,8 @@ static int ventoy_clean_disk(int fd, uint64_t size) len = write(fd, buf, zerolen); vdebug("write disk at off:%llu writelen:%lld datalen:%d\n", (_ull)offset, (_ll)len, zerolen); + fsync(fd); + free(buf); return 0; } @@ -800,7 +802,7 @@ static void * ventoy_install_thread(void *data) else { vdebug("Fill MBR part table\n"); - ventoy_fill_mbr(disk->size_in_byte, thread->reserveBytes, thread->align4kb, 0, &MBR); + ventoy_fill_mbr(disk->size_in_byte, thread->reserveBytes, thread->align4kb, &MBR); Part1StartSector = MBR.PartTbl[0].StartSectorId; Part1SectorCount = MBR.PartTbl[0].SectorCount; Part2StartSector = MBR.PartTbl[1].StartSectorId; diff --git a/LinuxGUI/WebUI/index.html b/LinuxGUI/WebUI/index.html index c77ee448..8b166927 100644 --- a/LinuxGUI/WebUI/index.html +++ b/LinuxGUI/WebUI/index.html @@ -342,6 +342,7 @@ var vtoy_cur_process_disk_name; var vtoy_chrome_app_mode = (window.location.href.indexOf('chrome-app') >= 0) ? 1 : 0; + function sort_language_list() { var tmp; for (var i = 0; i < vtoy_language_data.length; i++) { diff --git a/LinuxGUI/build.sh b/LinuxGUI/build.sh index 21830acc..001c4850 100644 --- a/LinuxGUI/build.sh +++ b/LinuxGUI/build.sh @@ -5,9 +5,9 @@ build_func() { toolDir=$3 XXFLAG='-std=gnu99 -D_FILE_OFFSET_BITS=64' - XXLIB="./Ventoy2Disk/Lib/fat_io_lib/lib/libfat_io_${libsuffix}.a" + XXLIB="" - echo "CC=$1 libsuffix=$libsuffix" + echo "CC=$1 libsuffix=$libsuffix toolDir=$toolDir" $1 $XXFLAG -c -Wall -Wextra -Wshadow -Wformat-security -Winit-self \ -Wmissing-prototypes -O2 -DLINUX \ @@ -29,6 +29,7 @@ build_func() { -I./Ventoy2Disk/Lib/xz-embedded/userspace \ -I ./Ventoy2Disk/Lib/exfat/src/libexfat \ -I ./Ventoy2Disk/Lib/exfat/src/mkfs \ + -I ./Ventoy2Disk/Lib/fat_io_lib \ \ -L ./Ventoy2Disk/Lib/fat_io_lib/lib \ Ventoy2Disk/*.c \ @@ -37,6 +38,7 @@ build_func() { Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \ Ventoy2Disk/Lib/exfat/src/libexfat/*.c \ Ventoy2Disk/Lib/exfat/src/mkfs/*.c \ + Ventoy2Disk/Lib/fat_io_lib/*.c \ $XXLIB \ -l pthread \ ./civetweb.o \ diff --git a/Ventoy2Disk/Ventoy2Disk/Utility.c b/Ventoy2Disk/Ventoy2Disk/Utility.c index cf86fef4..800855e6 100644 --- a/Ventoy2Disk/Ventoy2Disk/Utility.c +++ b/Ventoy2Disk/Ventoy2Disk/Utility.c @@ -592,6 +592,7 @@ int VentoyFillWholeGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) { INT64 ReservedValue = 0; + UINT64 ModSectorCount = 0; UINT64 ReservedSector = 33; UINT64 Part1SectorCount = 0; UINT64 DiskSectorCount = DiskSizeBytes / 512; @@ -609,18 +610,28 @@ int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo) ReservedSector += ReservedValue * 2048; } + Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048; + + ModSectorCount = (Part1SectorCount % 8); + if (ModSectorCount) + { + Log("Part1SectorCount:%llu is not aligned by 4KB (%llu)", (ULONGLONG)Part1SectorCount, (ULONGLONG)ModSectorCount); + } + // check aligned with 4KB if (IsPartNeed4KBAlign()) { - if (DiskSectorCount % 8) + if (ModSectorCount) { - Log("Disk need to align with 4KB %u", (UINT32)(DiskSectorCount % 8)); - ReservedSector += (DiskSectorCount % 8); + Log("Disk need to align with 4KB %u", (UINT32)ModSectorCount); + Part1SectorCount -= ModSectorCount; + } + else + { + Log("no need to align with 4KB"); } } - Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048; - memcpy(Head->Signature, "EFI PART", 8); Head->Version[2] = 0x01; Head->Length = 92;