]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
1. Add new options for Windows CLI mode.
authorlongpanda <admin@ventoy.net>
Fri, 13 Jan 2023 12:55:40 +0000 (20:55 +0800)
committerlongpanda <admin@ventoy.net>
Fri, 13 Jan 2023 12:55:40 +0000 (20:55 +0800)
2. Add tip message for 4k native disk.

46 files changed:
INSTALL/Ventoy2Disk.exe
INSTALL/Ventoy2Disk_ARM.exe
INSTALL/Ventoy2Disk_ARM64.exe
INSTALL/Ventoy2Disk_X64.exe
INSTALL/VentoyGUI.i386
INSTALL/VentoyGUI.x86_64
INSTALL/tool/VentoyWorker.sh
INSTALL/tool/aarch64/Plugson
INSTALL/tool/aarch64/V2DServer
INSTALL/tool/aarch64/Ventoy2Disk.gtk3
INSTALL/tool/aarch64/Ventoy2Disk.qt5
INSTALL/tool/i386/Plugson
INSTALL/tool/i386/V2DServer
INSTALL/tool/i386/Ventoy2Disk.gtk2
INSTALL/tool/i386/Ventoy2Disk.gtk3
INSTALL/tool/i386/Ventoy2Disk.qt5
INSTALL/tool/i386/vlnk
INSTALL/tool/mips64el/Plugson
INSTALL/tool/mips64el/V2DServer
INSTALL/tool/mips64el/Ventoy2Disk.gtk3
INSTALL/tool/mips64el/Ventoy2Disk.qt5
INSTALL/tool/ventoy_lib.sh
INSTALL/tool/x86_64/Plugson
INSTALL/tool/x86_64/V2DServer
INSTALL/tool/x86_64/Ventoy2Disk.gtk2
INSTALL/tool/x86_64/Ventoy2Disk.gtk3
INSTALL/tool/x86_64/Ventoy2Disk.qt5
INSTALL/tool/x86_64/vlnk
INSTALL/ventoy_pack.sh
LANGUAGES/languages.json
LinuxGUI/Ventoy2Disk/Core/ventoy_define.h
LinuxGUI/Ventoy2Disk/Core/ventoy_disk.c
LinuxGUI/Ventoy2Disk/Core/ventoy_json.h
LinuxGUI/Ventoy2Disk/Core/ventoy_util.c
LinuxGUI/Ventoy2Disk/Core/ventoy_util.h
LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.c
LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.cpp
LinuxGUI/Ventoy2Disk/Web/ventoy_http.c
LinuxGUI/WebUI/index.html
LinuxGUI/build_gtk.sh
Ventoy2Disk/Ventoy2Disk/Language.h
Ventoy2Disk/Ventoy2Disk/PhyDrive.c
Ventoy2Disk/Ventoy2Disk/Utility.c
Ventoy2Disk/Ventoy2Disk/Ventoy2Disk.h
Ventoy2Disk/Ventoy2Disk/WinDialog.c
Ventoy2Disk/Ventoy2Disk/ventoy_cli.c

index 505927dd794b2678839bbbc199074764b30f9cb0..80161e2030144cc68cc3e44e5cb79ee64705536e 100644 (file)
Binary files a/INSTALL/Ventoy2Disk.exe and b/INSTALL/Ventoy2Disk.exe differ
index 83073e1d6b5c4409eb86032822fe805659cd55dd..2ded21298e7d7d5f0800ab51386dbe1e27086d57 100644 (file)
Binary files a/INSTALL/Ventoy2Disk_ARM.exe and b/INSTALL/Ventoy2Disk_ARM.exe differ
index ef82006387d73a93880a228ff02aa621f3a7d591..49031c83a01de714ec875b441d60db0448880280 100644 (file)
Binary files a/INSTALL/Ventoy2Disk_ARM64.exe and b/INSTALL/Ventoy2Disk_ARM64.exe differ
index 44fe8e4b973b3c39b044a3307634cf0fa5f3620c..4271cf07bb88e9fa754b0d5c9c7fd82c4a280c3c 100644 (file)
Binary files a/INSTALL/Ventoy2Disk_X64.exe and b/INSTALL/Ventoy2Disk_X64.exe differ
index 580e92810f81730c43b552493f14143c9259e0b7..7b53b8c1596b770f80a623c8fcd4c033113e89ad 100644 (file)
Binary files a/INSTALL/VentoyGUI.i386 and b/INSTALL/VentoyGUI.i386 differ
index fd7c46917eba783c5683319a167ebe004c78d78d..f87cb1470deb65c2ee7b8813a3a1bb3169929ad5 100644 (file)
Binary files a/INSTALL/VentoyGUI.x86_64 and b/INSTALL/VentoyGUI.x86_64 differ
index 2d18b6073cc7c5d95f8365b3b452e38bf3042533..0642cc6ea48cfa31b895f9b10b0feddd9ef68066 100644 (file)
@@ -185,14 +185,27 @@ if [ "$MODE" = "install" -a -z "$NONDESTRUCTIVE" ]; then
         fi
     else
         if parted -v > /dev/null 2>&1; then
-            PARTTOOL='parted'
+            PARTTOOL='parted'            
         elif fdisk -v >/dev/null 2>&1; then
-            PARTTOOL='fdisk'
+            PARTTOOL='fdisk'            
         else
             vterr "Both parted and fdisk are not found in the system, Ventoy can't create new partitions."
             exit 1
         fi
     fi
+    
+    if [ "$PARTTOOL" = "parted" ]; then
+        if parted $DISK p | grep -i -q 'sector size.*4096.*4096'; then
+            vterr "Currently Ventoy does not support 4K native device."
+            exit 1
+        fi
+    else
+        if fdisk -l $DISK | grep -i -q 'sector size.*4096.*4096'; then
+            vterr "Currently Ventoy does not support 4K native device."
+            exit 1
+        fi
+    fi
+    
 
     version=$(get_disk_ventoy_version $DISK)
     if [ $? -eq 0 ]; then
index de9b9dbc0d7adf450527f251f5c2f65b256c1b61..69164165865a0ab056fb017ce95156f7e8c8bbab 100644 (file)
Binary files a/INSTALL/tool/aarch64/Plugson and b/INSTALL/tool/aarch64/Plugson differ
index 0b382c1cbca5a62ba5cc1f77cf62fc503bd541e8..53859bc3ff9e43c46099f4604c347747966f5686 100644 (file)
Binary files a/INSTALL/tool/aarch64/V2DServer and b/INSTALL/tool/aarch64/V2DServer differ
index ed5738598d164839ea1e3b59ec7baf747d8207c4..ce1ae01a989f15ca5a04e76844cae7084b1068df 100644 (file)
Binary files a/INSTALL/tool/aarch64/Ventoy2Disk.gtk3 and b/INSTALL/tool/aarch64/Ventoy2Disk.gtk3 differ
index ba06df2912ac162189a997c514ad04488ec888b6..18ad203c8384194811d028bb315b86eb79b70685 100644 (file)
Binary files a/INSTALL/tool/aarch64/Ventoy2Disk.qt5 and b/INSTALL/tool/aarch64/Ventoy2Disk.qt5 differ
index 582660a567fcf267d0c4416075cf4b906a702e0c..715b9f7814fea0c31988b9f78a7003d2f4485c4a 100644 (file)
Binary files a/INSTALL/tool/i386/Plugson and b/INSTALL/tool/i386/Plugson differ
index b9b6d91865ff902c087d635393c40ec515a07c12..5cc85c02c0d7b5c8574ac4cb20b9ac193460a476 100644 (file)
Binary files a/INSTALL/tool/i386/V2DServer and b/INSTALL/tool/i386/V2DServer differ
index e71a4804edae44e8b159643f562af4f5e37222b8..dd18b8f7c2ed59954a6adbebac1c02eeaac3c958 100644 (file)
Binary files a/INSTALL/tool/i386/Ventoy2Disk.gtk2 and b/INSTALL/tool/i386/Ventoy2Disk.gtk2 differ
index cdb33d1974897574e1c49d18a4b46ca9283300e9..4d0d763dcb5e379808132323834c067d487acfbb 100644 (file)
Binary files a/INSTALL/tool/i386/Ventoy2Disk.gtk3 and b/INSTALL/tool/i386/Ventoy2Disk.gtk3 differ
index 51bc50e94b15f3a825b6d321ac7260e3ca821a51..337b2841bbc788ad50159230653cd5e822ddfe96 100644 (file)
Binary files a/INSTALL/tool/i386/Ventoy2Disk.qt5 and b/INSTALL/tool/i386/Ventoy2Disk.qt5 differ
index 2d1a6f0abd0c79bc9ad05123e07cbc4aeba10f17..81fcf3dfd99e4e279dee2867c35379317da3778a 100644 (file)
Binary files a/INSTALL/tool/i386/vlnk and b/INSTALL/tool/i386/vlnk differ
index 8870f5c00c1e5684fa0ad91dd3529fab411aef79..78c748417588937f8788b3bb2e4b1b2e5fd26f0c 100644 (file)
Binary files a/INSTALL/tool/mips64el/Plugson and b/INSTALL/tool/mips64el/Plugson differ
index 16a78cb87c4d0598e8bce6a89021e2a7a45ab409..fe1b1ea0cc7bef1b4dd353e25740e0fa3a3bafaf 100644 (file)
Binary files a/INSTALL/tool/mips64el/V2DServer and b/INSTALL/tool/mips64el/V2DServer differ
index c2af26b49d715129caf796e3c8d25219280d6a55..98d6bf26f803af8d03ec3371884718ad5f064e11 100644 (file)
Binary files a/INSTALL/tool/mips64el/Ventoy2Disk.gtk3 and b/INSTALL/tool/mips64el/Ventoy2Disk.gtk3 differ
index eee73b25e5c98002ad54ae8509dd1d7775c49777..7387ae55d3f9fccc9aad38f47f3cebbb59908aea 100644 (file)
Binary files a/INSTALL/tool/mips64el/Ventoy2Disk.qt5 and b/INSTALL/tool/mips64el/Ventoy2Disk.qt5 differ
index dbf9475cf3c00c9c96a4cc00fe5c9a6abd9d2e55..710cc37f89fe71b1b455216bf3b65243718f3bde 100644 (file)
@@ -492,7 +492,7 @@ format_ventoy_disk_gpt() {
     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
+        if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
             echo 'success'
             break
         else
index 2358244e6222697af0516f5faf4e962cfc4f7b6b..0cec4c7063ed58873f9f3d34b0905768f513eec9 100644 (file)
Binary files a/INSTALL/tool/x86_64/Plugson and b/INSTALL/tool/x86_64/Plugson differ
index e28b652db5b7ce60f26a7fb9e47418f88cc32146..8703fbf787f5eeca70aa84f312c6a6961e37be1e 100644 (file)
Binary files a/INSTALL/tool/x86_64/V2DServer and b/INSTALL/tool/x86_64/V2DServer differ
index f5c379587558b8832aee4142ad68cffe17238739..c74a2ac91323062547ee382fdaf09eb9bd6faa3e 100644 (file)
Binary files a/INSTALL/tool/x86_64/Ventoy2Disk.gtk2 and b/INSTALL/tool/x86_64/Ventoy2Disk.gtk2 differ
index 03411cf948e9ee9fd3be9efe036211cc902451d0..089d35c9c930f0f8babb31db9c081f5922f26d91 100644 (file)
Binary files a/INSTALL/tool/x86_64/Ventoy2Disk.gtk3 and b/INSTALL/tool/x86_64/Ventoy2Disk.gtk3 differ
index e3ab28e2d2a39302107964c4096d386bdb44af91..a7616ef259697f5bcdb4693e1b0503c4f233cfb9 100644 (file)
Binary files a/INSTALL/tool/x86_64/Ventoy2Disk.qt5 and b/INSTALL/tool/x86_64/Ventoy2Disk.qt5 differ
index 46bc3fddb7e8a58d855c15f7f6e02e10c0059cb8..c25e6b85ee7463f1b695d944d9f6bbb8b081fef9 100644 (file)
Binary files a/INSTALL/tool/x86_64/vlnk and b/INSTALL/tool/x86_64/vlnk differ
index 43f45ebffc419e51100d661b0730687ad6af7c9f..e03e8b02eb27866b489f4755c5f39b5d16e3f95b 100644 (file)
@@ -169,8 +169,27 @@ sed 's/.*SCRIPT_DEL_THIS \(.*\)/\1/g' -i $tmpdir/WebUI/index.html
 
 #32MB disk img
 dd status=none if=$LOOP of=$tmpdir/ventoy/ventoy.disk.img bs=512 count=$VENTOY_SECTOR_NUM skip=$part2_start_sector
+
+
+#4k image
+# echo "make 4K img ..."
+# dd status=none if=/dev/zero of=$tmpdir/ventoy/ventoy_4k.disk.img bs=1M count=32
+# mkfs.vfat -F 16 -n VTOYEFI -s 1 -S 4096 $tmpdir/ventoy/ventoy_4k.disk.img
+# vDIR1=$(mktemp -d)
+# vDIR2=$(mktemp -d)
+# mount $tmpdir/ventoy/ventoy.disk.img $vDIR1
+# mount $tmpdir/ventoy/ventoy_4k.disk.img $vDIR2
+# cp -a $vDIR1/* $vDIR2/
+# umount $vDIR1
+# umount $vDIR2
+# rm -rf $vDIR1 $vDIR2
+
+# xz --check=crc32 $tmpdir/ventoy/ventoy_4k.disk.img
+
 xz --check=crc32 $tmpdir/ventoy/ventoy.disk.img
 
+
+
 losetup -d $LOOP && rm -f img.bin
 
 rm -f ventoy-${curver}-linux.tar.gz
index 352bce0aa22b0666d681f7c07ba8f1a5c6261165..24d83268345390c3d4d0f3da8631b74f17411256 100644 (file)
@@ -60,6 +60,7 @@
         "STR_PART_CLUSTER":"حجم الكتلة",
         "STR_PART_CLUSTER_DEFAULT":"القيمة الافتراضية للنظام",
         "STR_DONATE":"يتبرع",
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
         
         "STRXXX":""
     },
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Ianə",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"클러스터 크기",
         "STR_PART_CLUSTER_DEFAULT":"시스템 기본값",
         "STR_DONATE":"기부",
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
         
         "STRXXX":""
     },
         "STR_PART_CLUSTER":"簇大小",
         "STR_PART_CLUSTER_DEFAULT":"系统默认值",
         "STR_DONATE":"捐助",
+        "STR_4KN_UNSUPPORTED":"目前 Ventoy 不支持原生 4K 扇区的磁盘。",
         
         "STRXXX":""
     },
         "STR_PART_CLUSTER":"Klynge størrelse",
         "STR_PART_CLUSTER_DEFAULT":"System Standard Værdi",
         "STR_DONATE":"Donering",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Donate",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"შემოწირულობა",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX": ""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"اهداء",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Wielkość klastra",
         "STR_PART_CLUSTER_DEFAULT":"Wartość domyślna systemu",
         "STR_DONATE":"Podarować",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Tamanho do cluster",
         "STR_PART_CLUSTER_DEFAULT":"Valor padrão do sistema",
         "STR_DONATE":"Doar",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Sektör Boyutu",
         "STR_PART_CLUSTER_DEFAULT":"Sistem varsayılan değeri",
         "STR_DONATE":"Ventoy'a Bağış yap",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Clustergröße",
         "STR_PART_CLUSTER_DEFAULT":"Systemstandardwert",
         "STR_DONATE":"Spenden",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Donate",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Taille de cluster",
         "STR_PART_CLUSTER_DEFAULT":"Valeur par défaut du système",
         "STR_DONATE":"Faire un don",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Velikost clusteru",
         "STR_PART_CLUSTER_DEFAULT":"Výchozí hodnota systému",
         "STR_DONATE":"Darovat",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Darovať",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Tamaño de cluster",
         "STR_PART_CLUSTER_DEFAULT":"Valor predeterminado del sistema",
         "STR_DONATE":"Donar",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Tamaño de cluster",
         "STR_PART_CLUSTER_DEFAULT":"Valor predeterminado del sistema",
         "STR_DONATE":"Donar",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Размер кластера:",
         "STR_PART_CLUSTER_DEFAULT":"Системное значение по умолчанию",
         "STR_DONATE":"Пожертвовать",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"ক্লাস্টারের আকার",
         "STR_PART_CLUSTER_DEFAULT":"সিস্টেমের ডিফল্ট মান",
         "STR_DONATE":"দান করুন",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"क्लस्टर साइज",
         "STR_PART_CLUSTER_DEFAULT":"सिस्टम डिफ़ॉल्ट मान",
         "STR_DONATE":"दान करें",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Clustergrootte",
         "STR_PART_CLUSTER_DEFAULT":"Standaardwaarde systeem",
         "STR_DONATE":"Doneer",
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
         
         "STRXXX":""
     },
         "STR_PART_CLUSTER":"Dimensiunea clusterului",
         "STR_PART_CLUSTER_DEFAULT":"Valoarea implicită a sistemului",
         "STR_DONATE":"Donează",
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
         
         "STRXXX":""
     },
         "STR_PART_CLUSTER":"クラスターサイズ",
         "STR_PART_CLUSTER_DEFAULT":"システムのデフォルト値",
         "STR_DONATE":"寄付",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Dimensione del cluster",
         "STR_PART_CLUSTER_DEFAULT":"Valore predefinito di sistema",
         "STR_DONATE":"Donare",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Donirajte",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Klaszter méret",
         "STR_PART_CLUSTER_DEFAULT":"Rendszer alapérték",
         "STR_DONATE":"Adományoz",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"簇的大小",
         "STR_PART_CLUSTER_DEFAULT":"系統默認值",
         "STR_DONATE":"捐助",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Veličina klastera",
         "STR_PART_CLUSTER_DEFAULT":"Podrazumevana sistemska vrednost",
         "STR_DONATE":"Donirajte",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Величина кластера",
         "STR_PART_CLUSTER_DEFAULT":"Подразумевана системска вредност",
         "STR_DONATE":"Донирајте",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"บริจาค",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"donere",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cỡ Cluster",
         "STR_PART_CLUSTER_DEFAULT":"Theo mặc định hệ thống",
         "STR_DONATE":"Thưởng tác giả",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"paaukoti",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"донира",
-                
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"לִתְרוֹם",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Tamanho do cluster",
         "STR_PART_CLUSTER_DEFAULT":"Valor predefinido do sistema",
         "STR_DONATE":"Doar",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Ukuran Kelompok",
         "STR_PART_CLUSTER_DEFAULT":"Nilai Standar Sistem",
         "STR_DONATE":"Donasi sukarela",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Donere",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Розмір кластера",
         "STR_PART_CLUSTER_DEFAULT":"Системне значення за умовчанням",
         "STR_DONATE":"Пожертвуйте",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Μέγεθος συμπλέγματος",
         "STR_PART_CLUSTER_DEFAULT":"Προεπιλεγμένη τιμή συστήματος",
         "STR_DONATE":"Προσφέρω",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     
         "STR_PART_CLUSTER":"Klusterstorlek",
         "STR_PART_CLUSTER_DEFAULT":"Systemets standardvärde",
         "STR_DONATE":"Donera",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Donirajte",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Дарете",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Նվիրաբերել",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Lahjoittaa",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Doa",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"Donar",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     
         "STR_PART_CLUSTER":"Cluster Size",
         "STR_PART_CLUSTER_DEFAULT":"System Default Value",
         "STR_DONATE":"შემოწირულობა",
-
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"கொத்து அளவு",
         "STR_PART_CLUSTER_DEFAULT":"கணினி இயல்புநிலை மதிப்பு",
         "STR_DONATE":"தானம் செய்",
-                
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
+        
         "STRXXX":""
     },
     {
         "STR_PART_CLUSTER":"Памер кластара",
         "STR_PART_CLUSTER_DEFAULT":"Сістэмнае значэнне па змаўчанні",
         "STR_DONATE":"Ахвяраваць",
+        "STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native device.",
         
         "STRXXX":""
     }
index 01c0fd8747bfc6216e06eadcf54ed7a54fa41ca2..ba1a4d28e0ec686d698e534e0cdf1deabd86ad07 100644 (file)
@@ -137,6 +137,7 @@ typedef struct ventoy_disk
     char disk_model[256]; // Sandisk/Kingston ...
     char human_readable_size[32];
 
+    int is4kn;
     int major;
     int minor;
     int type;
index 04eb7f489c55254f0821286ec0218571cfdb297d..5d4bbff736d18a27d8eb6a31bf90d0bdc2bd9544 100644 (file)
@@ -260,6 +260,33 @@ static int ventoy_is_possible_blkdev(const char *name)
     return 1;
 }
 
+int ventoy_is_disk_4k_native(const char *disk)
+{
+    int fd;
+    int rc = 0;
+    int logsector = 0;
+    int physector = 0;
+    char diskpath[256] = {0};
+
+    snprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk);
+
+    fd = open(diskpath, O_RDONLY | O_BINARY);
+    if (fd >= 0)
+    {
+        ioctl(fd, BLKSSZGET, &logsector);
+        ioctl(fd, BLKPBSZGET, &physector);
+        
+        if (logsector == 4096 && physector == 4096)
+        {
+            rc = 1;
+        }
+        close(fd);
+    }
+
+    vdebug("is 4k native disk <%s> <%d>\n", disk, rc);    
+    return rc;
+}
+
 uint64_t ventoy_get_disk_size_in_byte(const char *disk)
 {
     int fd;
@@ -591,6 +618,7 @@ int ventoy_get_disk_info(const char *name, ventoy_disk *info)
         scnprintf(info->part2_path, "/dev/%s2", name);
     }
     
+    info->is4kn = ventoy_is_disk_4k_native(name);
     info->size_in_byte = ventoy_get_disk_size_in_byte(name);
 
     ventoy_get_disk_devnum(name, &info->major, &info->minor);
index 12e6f1923653d6b7d70630e450a9222a342c6107..32fef4b199c66caa48652ea69f2a12c8ea1f3d15 100644 (file)
@@ -58,6 +58,7 @@
 #define VTOY_JSON_NOT_READY_RET    "{ \"result\" : \"notready\" }"
 #define VTOY_JSON_NOT_SUPPORT_RET  "{ \"result\" : \"notsupport\" }"
 #define VTOY_JSON_MBR_2TB_RET      "{ \"result\" : \"mbr2tb\" }"
+#define VTOY_JSON_4KN_RET          "{ \"result\" : \"4kn\" }"
 #define VTOY_JSON_INVALID_RSV_RET      "{ \"result\" : \"reserve_invalid\" }"
 #define VTOY_JSON_FILE_NOT_FOUND_RET     "{ \"result\" : \"file_not_found\" }"
 
index cc3e5e1bf7c605e9d5872e19065967e297ee1e1f..03d93192f2cef0576ef13797f1d4ffcc81c72531 100644 (file)
@@ -579,3 +579,68 @@ int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR
     return 0;
 }
 
+int ventoy_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR)
+{
+    ventoy_guid Guid;
+    uint32_t DiskSignature;
+    uint32_t DiskSectorCount;
+    uint32_t PartSectorCount;
+    uint32_t PartStartSector;
+       uint32_t ReservedSector;
+
+    VentoyGetLocalBootImg(pMBR);
+
+    ventoy_gen_preudo_uuid(&Guid);
+
+    memcpy(&DiskSignature, &Guid, sizeof(uint32_t));
+
+    vdebug("Disk signature: 0x%08x\n", DiskSignature);
+
+    memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4);
+    memcpy(pMBR->BootCode + 0x180, &Guid, 16);
+
+    if (size / 4096 > 0xFFFFFFFF)
+    {
+        DiskSectorCount = 0xFFFFFFFF;
+    }
+    else
+    {
+        DiskSectorCount = (uint32_t)(size / 4096);
+    }
+
+       if (reserve <= 0)
+       {
+               ReservedSector = 0;
+       }
+       else
+       {
+               ReservedSector = (uint32_t)(reserve / 4096);
+       }
+
+    // check aligned with 4KB
+    vdebug("no need to align with 4KB for 4K native disk\n");
+
+       vlog("ReservedSector: %u\n", ReservedSector);
+
+    //Part1
+    PartStartSector = VTOYIMG_PART_START_SECTOR >> 3;
+       PartSectorCount = DiskSectorCount - ReservedSector - VTOYEFI_PART_BYTES / 4096 - PartStartSector;
+    VentoyFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl);
+
+    pMBR->PartTbl[0].Active = 0x80; // bootable
+    pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS
+
+    //Part2
+    PartStartSector += PartSectorCount;
+    PartSectorCount = VTOYEFI_PART_BYTES / 4096;
+    VentoyFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl + 1);
+
+    pMBR->PartTbl[1].Active = 0x00; 
+    pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition
+
+    pMBR->Byte55 = 0x55;
+    pMBR->ByteAA = 0xAA;
+
+    return 0;
+}
+
index 87bdbd5e784d9e89a623f2c1a2a7aaa2a5bfae25..a5e4c8bd3332a271e479c1827ec75c4bb851446a 100644 (file)
@@ -51,6 +51,7 @@ 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, MBR_HEAD *pMBR);
 int VentoyGetLocalBootImg(MBR_HEAD *pMBR);
+int ventoy_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR);
 
 #endif /* __VENTOY_UTIL_H__ */
 
index a1e81988126d1a33409d13d2931554f1b8fa2b59..bb9215a221d2943ffba576f44d0dfc4ede63342d 100644 (file)
@@ -661,6 +661,12 @@ void on_button_install_clicked(GtkWidget *widget, gpointer data)
 
     cur = g_disk_list + active;
 
+    if (cur->is4kn)
+    {
+        msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_4KN_UNSUPPORTED");
+        return;
+    }
+
     if (ventoy_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL)
     {
         msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_DISK_2TB_MBR_ERROR");
index b0307a20328a2a263b30489ee9eb412fa70a4bb3..3615e3b7bf2b5b91ed0fefac4a0a6b97af67d650 100644 (file)
@@ -512,6 +512,14 @@ void Ventoy2DiskWindow::on_ButtonInstall_clicked()
     }
 
     cur = g_disk_list + index;
+
+    if (cur->is4kn)
+    {
+        lang_string("STR_4KN_UNSUPPORTED", msg);
+        QMessageBox::critical(NULL, title_err, msg);
+        return;
+    }
+
     if (ventoy_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL)
     {
         lang_string("STR_DISK_2TB_MBR_ERROR", msg);
index 561e0807d2b6fb0856ab07035f89dd23a1d6e963..d221dd390fd983978b02d867877ee32b1e91330e 100644 (file)
@@ -1122,6 +1122,13 @@ static int ventoy_api_install(struct mg_connection *conn, VTOY_JSON *json)
         return 0;
     }
 
+    if (disk->is4kn)
+    {
+        vlog("disk %s is 4k native, not supported.\n", diskname);
+        ventoy_json_result(conn, VTOY_JSON_4KN_RET);
+        return 0;
+    }
+
     scnprintf(path, "/sys/block/%s", diskname);
     if (access(path, F_OK) < 0)
     {
index 975ce10bc8397663e415c525d76e10a832e06a85..fa90c0452f759e3af36b9e5770a5b39cc94ebbf4 100644 (file)
                 vtoy_in_progress = true;\r
                 progressDisableItem(vtoy_in_progress);\r
                 queryProgress(1);\r
+            }else if (data.result === '4kn') {\r
+                ventoy_display_alert('error', vtoy_cur_language.STR_4KN_UNSUPPORTED);\r
             } else {\r
                 ventoy_display_alert('error', vtoy_cur_language.STR_INSTALL_FAILED);\r
             }\r
index 6e7aa5186f14c96e906589f0a07dea3d3d090071..cbcadbd41499abfa3cd77868a1cc9da19c9fe552 100644 (file)
@@ -86,9 +86,10 @@ build_func() {
 }
 
 
-build_func "gcc" '64' 'x86_64' 'gtk2'
 build_func "gcc" '64' 'x86_64' 'gtk3'
 
+build_func "gcc" '64' 'x86_64' 'gtk2'
+
 build_func "gcc -m32" '32' 'i386' 'gtk2'
 build_func "gcc -m32" '32' 'i386' 'gtk3'
 
index f1fc4816bf51165d78f7200102a455473633f7c5..57cb021980cbbce0b05690a7362e841c3f4f61c8 100644 (file)
@@ -94,6 +94,8 @@ typedef enum STR_ID
 \r
        STR_DONATE, //54\r
 \r
+       STR_4KN_UNSUPPORTED, //55\r
+\r
        STR_ID_MAX\r
 }STR_ID;\r
 \r
index ff69536fd2fb74ff5e48b90ec4d87e5b50765740..42d74d065274c0ac0b170023447910f4185faf82 100644 (file)
@@ -139,7 +139,7 @@ static DWORD GetVentoyVolumeName(int PhyDrive, UINT64 StartSectorId, CHAR *NameB
     return Status;\r
 }\r
 \r
-static int GetLettersBelongPhyDrive(int PhyDrive, char *DriveLetters, size_t Length)\r
+int GetLettersBelongPhyDrive(int PhyDrive, char *DriveLetters, size_t Length)\r
 {\r
     int n = 0;\r
     DWORD DataSize = 0;\r
@@ -355,6 +355,7 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
     STORAGE_PROPERTY_QUERY Query;\r
     STORAGE_DESCRIPTOR_HEADER DevDescHeader;\r
     STORAGE_DEVICE_DESCRIPTOR *pDevDesc;\r
+    STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR diskAlignment;\r
     int PhyDriveId[VENTOY_MAX_PHY_DRIVE];\r
 \r
     Count = GetPhysicalDriveCount();\r
@@ -468,12 +469,35 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
             continue;\r
         }\r
 \r
+\r
+\r
+        memset(&Query, 0, sizeof(STORAGE_PROPERTY_QUERY));\r
+        Query.PropertyId = StorageAccessAlignmentProperty;\r
+        Query.QueryType = PropertyStandardQuery;\r
+        memset(&diskAlignment, 0, sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR));\r
+\r
+        bRet = DeviceIoControl(Handle,\r
+                               IOCTL_STORAGE_QUERY_PROPERTY,\r
+                               &Query,\r
+                               sizeof(STORAGE_PROPERTY_QUERY),\r
+                               &diskAlignment,\r
+                               sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR),\r
+                               &dwBytes,\r
+                               NULL);\r
+        if (!bRet)\r
+        {\r
+            Log("DeviceIoControl3 error:%u dwBytes:%u", LASTERR, dwBytes);            \r
+        }\r
+\r
         CurDrive->PhyDrive = i;\r
         CurDrive->SizeInBytes = LengthInfo.Length.QuadPart;\r
         CurDrive->DeviceType = pDevDesc->DeviceType;\r
         CurDrive->RemovableMedia = pDevDesc->RemovableMedia;\r
         CurDrive->BusType = pDevDesc->BusType;\r
 \r
+        CurDrive->BytesPerLogicalSector = diskAlignment.BytesPerLogicalSector;\r
+        CurDrive->BytesPerPhysicalSector = diskAlignment.BytesPerPhysicalSector;\r
+\r
         if (pDevDesc->VendorIdOffset)\r
         {\r
             safe_strcpy(CurDrive->VendorId, (char *)pDevDesc + pDevDesc->VendorIdOffset);\r
@@ -508,9 +532,10 @@ int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount)
 \r
     for (i = 0, CurDrive = pDriveList; i < (int)DriveCount; i++, CurDrive++)\r
     {\r
-        Log("PhyDrv:%d BusType:%-4s Removable:%u Size:%dGB(%llu) Name:%s %s",\r
+        Log("PhyDrv:%d BusType:%-4s Removable:%u Size:%dGB(%llu) Sector:%u/%u Name:%s %s",\r
             CurDrive->PhyDrive, GetBusTypeString(CurDrive->BusType), CurDrive->RemovableMedia,\r
             GetHumanReadableGBSize(CurDrive->SizeInBytes), CurDrive->SizeInBytes,\r
+            CurDrive->BytesPerLogicalSector, CurDrive->BytesPerPhysicalSector,\r
             CurDrive->VendorId, CurDrive->ProductId);\r
     }\r
 \r
@@ -2351,30 +2376,37 @@ int PartitionResizeForVentoy(PHY_DRIVE_INFO *pPhyDrive)
 \r
        Sleep(2000);\r
 \r
-       //Refresh disk list\r
-       PhyDrive = pPhyDrive->PhyDrive;\r
+    if (g_CLI_Mode)\r
+    {\r
+        Log("### Ventoy non-destructive CLI installation successfully finished.");\r
+    }\r
+    else\r
+    {\r
+        //Refresh disk list\r
+        PhyDrive = pPhyDrive->PhyDrive;\r
 \r
-       Log("#### Now Refresh PhyDrive ####");\r
-       Ventoy2DiskDestroy();\r
-       Ventoy2DiskInit();\r
-       \r
-       pPhyDrive = GetPhyDriveInfoByPhyDrive(PhyDrive);\r
-       if (pPhyDrive)\r
-       {\r
-               if (pPhyDrive->VentoyVersion[0] == 0)\r
-               {\r
-                       Log("After process the Ventoy version is still invalid");\r
-                       goto End;\r
-               }\r
+        Log("#### Now Refresh PhyDrive ####");\r
+        Ventoy2DiskDestroy();\r
+        Ventoy2DiskInit();\r
 \r
-               Log("### Ventoy non-destructive installation successfully finished <%s>", pPhyDrive->VentoyVersion);\r
-       }\r
-       else\r
-       {\r
-               Log("### Ventoy non-destructive installation successfully finished <not found>");\r
-       }\r
+        pPhyDrive = GetPhyDriveInfoByPhyDrive(PhyDrive);\r
+        if (pPhyDrive)\r
+        {\r
+            if (pPhyDrive->VentoyVersion[0] == 0)\r
+            {\r
+                Log("After process the Ventoy version is still invalid");\r
+                goto End;\r
+            }\r
 \r
-       InitComboxCtrl(g_DialogHwnd, PhyDrive);\r
+            Log("### Ventoy non-destructive installation successfully finished <%s>", pPhyDrive->VentoyVersion);\r
+        }\r
+        else\r
+        {\r
+            Log("### Ventoy non-destructive installation successfully finished <not found>");\r
+        }\r
+\r
+        InitComboxCtrl(g_DialogHwnd, PhyDrive);\r
+    }\r
 \r
        rc = 0;\r
 \r
index dc9464a8d32bd73a78634c6fda88de60997abc48..daa6ecf51231f334b69909e356d24320dbd7afd4 100644 (file)
@@ -40,6 +40,56 @@ void TraceOut(const char *Fmt, ...)
     }\r
 }\r
 \r
+typedef struct LogBuf\r
+{\r
+    int Len; \r
+    char szBuf[1024];    \r
+    struct LogBuf* next;\r
+}LogBuf;\r
+\r
+static BOOL g_LogCache = FALSE;\r
+static LogBuf* g_LogHead = NULL;\r
+static LogBuf* g_LogTail = NULL;\r
+\r
+void LogCache(BOOL cache)\r
+{\r
+    g_LogCache = cache;\r
+}\r
+\r
+void LogFlush(void)\r
+{\r
+    FILE* File = NULL;\r
+    LogBuf* Node = NULL;\r
+    LogBuf* Next = NULL;\r
+\r
+    if (g_CLI_Mode)\r
+    {\r
+        fopen_s(&File, VENTOY_CLI_LOG, "a+");\r
+    }\r
+    else\r
+    {\r
+        fopen_s(&File, VENTOY_FILE_LOG, "a+");\r
+    }\r
+\r
+    if (File)\r
+    {\r
+        for (Node = g_LogHead; Node; Node = Node->next)\r
+        {\r
+            fwrite(Node->szBuf, 1, Node->Len, File);\r
+            fwrite("\n", 1, 1, File);\r
+        }\r
+        fclose(File);\r
+    }\r
+\r
+    for (Node = g_LogHead; Node; Node = Next)\r
+    {\r
+        Next = Node->next;\r
+        free(Node);\r
+    }\r
+\r
+    g_LogHead = g_LogTail = NULL;\r
+}\r
+\r
 void Log(const char *Fmt, ...)\r
 {\r
     va_list Arg;\r
@@ -59,6 +109,30 @@ void Log(const char *Fmt, ...)
     Len += vsnprintf_s(szBuf + Len, sizeof(szBuf)-Len - 1, sizeof(szBuf)-Len-1, Fmt, Arg);\r
     va_end(Arg);\r
 \r
+    if (g_LogCache)\r
+    {\r
+        LogBuf* Node = NULL;\r
+        Node = malloc(sizeof(LogBuf));\r
+        if (Node)\r
+        {\r
+            memcpy(Node->szBuf, szBuf, Len);\r
+            Node->next = NULL;\r
+            Node->Len = Len;\r
+\r
+            if (g_LogTail)\r
+            {\r
+                g_LogTail->next = Node;\r
+                g_LogTail = Node;\r
+            }\r
+            else\r
+            {\r
+                g_LogHead = g_LogTail = Node;\r
+            }\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
     if (g_CLI_Mode)\r
     {\r
         fopen_s(&File, VENTOY_CLI_LOG, "a+");\r
index 1a0a453f2add3fed1fc309e5904c3ba760995c07..b09472564f65523c8a0c1208eeb79dece1c4c7f3 100644 (file)
@@ -176,6 +176,9 @@ typedef struct PHY_DRIVE_INFO
     CHAR SerialNumber[128];\r
     STORAGE_BUS_TYPE BusType;\r
 \r
+    DWORD BytesPerLogicalSector;\r
+    DWORD BytesPerPhysicalSector;\r
+\r
     CHAR DriveLetters[64];\r
     \r
     int  VentoyFsClusterSize;\r
@@ -234,6 +237,8 @@ extern int g_FilterUSB;
 \r
 void TraceOut(const char *Fmt, ...);\r
 void Log(const char *Fmt, ...);\r
+void LogCache(BOOL cache);\r
+void LogFlush(void);\r
 BOOL IsPathExist(BOOL Dir, const char *Fmt, ...);\r
 void DumpWindowsVersion(void);\r
 const CHAR* GetLocalVentoyVersion(void);\r
@@ -370,6 +375,15 @@ BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD* pMBR, UINT64* Pa
 int GetVentoyFsNameInPhyDrive(PHY_DRIVE_INFO* CurDrive);\r
 void CLISetReserveSpace(int MB);\r
 void CLI_UpdatePercent(int Pos);\r
+int GetLettersBelongPhyDrive(int PhyDrive, char* DriveLetters, size_t Length);\r
+PHY_DRIVE_INFO* CLI_PhyDrvInfo(void);\r
+\r
+#define UTF8_Log(fmt, wstr) \\r
+{\\r
+    memset(TmpPathA, 0, sizeof(TmpPathA));\\r
+    WideCharToMultiByte(CP_UTF8, 0, wstr, -1, TmpPathA, sizeof(TmpPathA), NULL, NULL);\\r
+    Log(fmt, TmpPathA);\\r
+}\r
 \r
 #define VTSI_SUPPORT 1\r
 \r
index 40a8ab632d7f7ca677670950ffa76d8116ecfa77..7ae9195807360215c6be356ef0a0020fb4222494 100644 (file)
Binary files a/Ventoy2Disk/Ventoy2Disk/WinDialog.c and b/Ventoy2Disk/Ventoy2Disk/WinDialog.c differ
index 10c8ffe9e0301d2feb3b54c584b6e2dca185b5d7..8adffcae6c66442d3b52ec26268ea348c501c9c2 100644 (file)
@@ -17,12 +17,16 @@ typedef struct CLI_CFG
     int PartStyle;\r
     int ReserveMB;\r
     BOOL USBCheck;\r
+    BOOL NonDest;\r
+    int fstype;\r
 }CLI_CFG;\r
 \r
 BOOL g_CLI_Mode = FALSE;\r
 static int g_CLI_OP;\r
 static int g_CLI_PhyDrive;\r
 \r
+static PHY_DRIVE_INFO* g_CLI_PhyDrvInfo = NULL;\r
+\r
 static int CLI_GetPhyDriveInfo(int PhyDrive, PHY_DRIVE_INFO* pInfo)\r
 {\r
     BOOL bRet;\r
@@ -33,6 +37,7 @@ static int CLI_GetPhyDriveInfo(int PhyDrive, PHY_DRIVE_INFO* pInfo)
     STORAGE_PROPERTY_QUERY Query;\r
     STORAGE_DESCRIPTOR_HEADER DevDescHeader;\r
     STORAGE_DEVICE_DESCRIPTOR* pDevDesc;\r
+    STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR diskAlignment;\r
 \r
     safe_sprintf(PhyDrivePath, "\\\\.\\PhysicalDrive%d", PhyDrive);\r
     Handle = CreateFileA(PhyDrivePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);\r
@@ -103,12 +108,35 @@ static int CLI_GetPhyDriveInfo(int PhyDrive, PHY_DRIVE_INFO* pInfo)
         return 1;\r
     }\r
 \r
+\r
+    memset(&Query, 0, sizeof(STORAGE_PROPERTY_QUERY));\r
+    Query.PropertyId = StorageAccessAlignmentProperty;\r
+    Query.QueryType = PropertyStandardQuery;\r
+    memset(&diskAlignment, 0, sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR));\r
+\r
+    bRet = DeviceIoControl(Handle,\r
+        IOCTL_STORAGE_QUERY_PROPERTY,\r
+        &Query,\r
+        sizeof(STORAGE_PROPERTY_QUERY),\r
+        &diskAlignment,\r
+        sizeof(STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR),\r
+        &dwBytes,\r
+        NULL);\r
+    if (!bRet)\r
+    {\r
+        Log("DeviceIoControl3 error:%u dwBytes:%u", LASTERR, dwBytes);\r
+    }\r
+\r
+\r
     pInfo->PhyDrive = PhyDrive;\r
     pInfo->SizeInBytes = LengthInfo.Length.QuadPart;\r
     pInfo->DeviceType = pDevDesc->DeviceType;\r
     pInfo->RemovableMedia = pDevDesc->RemovableMedia;\r
     pInfo->BusType = pDevDesc->BusType;\r
 \r
+    pInfo->BytesPerLogicalSector = diskAlignment.BytesPerLogicalSector;\r
+    pInfo->BytesPerPhysicalSector = diskAlignment.BytesPerPhysicalSector;\r
+\r
     if (pDevDesc->VendorIdOffset)\r
     {\r
         safe_strcpy(pInfo->VendorId, (char*)pDevDesc + pDevDesc->VendorIdOffset);\r
@@ -143,12 +171,14 @@ static int CLI_GetPhyDriveInfo(int PhyDrive, PHY_DRIVE_INFO* pInfo)
 static int CLI_CheckParam(int argc, char** argv, PHY_DRIVE_INFO* pDrvInfo, CLI_CFG *pCfg)\r
 {\r
     int i;\r
+    int fstype = VTOY_FS_EXFAT;\r
     int op = -1;\r
     char* opt = NULL;\r
     int PhyDrive = -1;\r
     int PartStyle = 0;\r
     int ReserveMB = 0;\r
     BOOL USBCheck = TRUE;\r
+    BOOL NonDest = FALSE;\r
     MBR_HEAD MBR;\r
     UINT64 Part2GPTAttr = 0;\r
     UINT64 Part2StartSector = 0;\r
@@ -176,6 +206,10 @@ static int CLI_CheckParam(int argc, char** argv, PHY_DRIVE_INFO* pDrvInfo, CLI_C
         {\r
             USBCheck = FALSE;\r
         }\r
+        else if (_stricmp(opt, "/NonDest") == 0)\r
+        {\r
+            NonDest = TRUE;\r
+        }\r
         else if (_strnicmp(opt, "/Drive:", 7) == 0)\r
         {\r
             Log("Get PhyDrive by logical drive %C:", opt[7]);\r
@@ -189,6 +223,17 @@ static int CLI_CheckParam(int argc, char** argv, PHY_DRIVE_INFO* pDrvInfo, CLI_C
         {\r
             ReserveMB = (int)strtol(opt + 3, NULL, 10);\r
         }\r
+        else if (_strnicmp(opt, "/FS:", 4) == 0)\r
+        {\r
+            if (_stricmp(opt + 4, "NTFS") == 0)\r
+            {\r
+                fstype = VTOY_FS_NTFS;\r
+            }\r
+            else if (_stricmp(opt + 4, "FAT32") == 0)\r
+            {\r
+                fstype = VTOY_FS_FAT32;\r
+            }\r
+        }\r
     }\r
 \r
     if (op < 0 || PhyDrive < 0)\r
@@ -197,10 +242,10 @@ static int CLI_CheckParam(int argc, char** argv, PHY_DRIVE_INFO* pDrvInfo, CLI_C
         return 1;\r
     }\r
 \r
-    Log("Ventoy CLI %s PhyDrive:%d %s SecureBoot:%d ReserveSpace:%dMB USBCheck:%u",\r
+    Log("Ventoy CLI %s PhyDrive:%d %s SecureBoot:%d ReserveSpace:%dMB USBCheck:%u FS:%s NonDest:%d",\r
         op == 0 ? "install" : "update",\r
         PhyDrive, PartStyle ? "GPT" : "MBR",\r
-        g_SecureBoot, ReserveMB, USBCheck\r
+        g_SecureBoot, ReserveMB, USBCheck, GetVentoyFsFmtNameByTypeA(fstype), NonDest\r
         );\r
 \r
     if (CLI_GetPhyDriveInfo(PhyDrive, pDrvInfo))\r
@@ -231,14 +276,51 @@ static int CLI_CheckParam(int argc, char** argv, PHY_DRIVE_INFO* pDrvInfo, CLI_C
         }\r
     }\r
 \r
+    if (op == 0 && NonDest)\r
+    {\r
+        GetLettersBelongPhyDrive(PhyDrive, pDrvInfo->DriveLetters, sizeof(pDrvInfo->DriveLetters));\r
+    }\r
+\r
     pCfg->op = op;\r
     pCfg->PartStyle = PartStyle;\r
     pCfg->ReserveMB = ReserveMB;\r
     pCfg->USBCheck = USBCheck;\r
+    pCfg->NonDest = NonDest;\r
+    pCfg->fstype = fstype;\r
 \r
     return 0;\r
 }\r
 \r
+static int Ventoy_CLI_NonDestInstall(PHY_DRIVE_INFO* pDrvInfo, CLI_CFG* pCfg)\r
+{\r
+    int rc;\r
+    int TryId = 1;\r
+\r
+    Log("Ventoy_CLI_NonDestInstall start ...");\r
+\r
+    if (pDrvInfo->BytesPerLogicalSector == 4096 && pDrvInfo->BytesPerPhysicalSector == 4096)\r
+    {\r
+        Log("Ventoy does not support 4k native disk.");\r
+        rc = 1;\r
+        goto out;\r
+    }\r
+\r
+    if (!PartResizePreCheck(NULL))\r
+    {\r
+        Log("#### Part Resize PreCheck Failed ####");\r
+        rc = 1;\r
+        goto out;\r
+    }\r
+\r
+    rc = PartitionResizeForVentoy(pDrvInfo);\r
+\r
+out:\r
+    Log("Ventoy_CLI_NonDestInstall [%s]", rc == 0 ? "SUCCESS" : "FAILED");\r
+\r
+    return rc;\r
+}\r
+\r
+\r
 static int Ventoy_CLI_Install(PHY_DRIVE_INFO* pDrvInfo, CLI_CFG *pCfg)\r
 {\r
     int rc; \r
@@ -246,11 +328,20 @@ static int Ventoy_CLI_Install(PHY_DRIVE_INFO* pDrvInfo, CLI_CFG *pCfg)
 \r
     Log("Ventoy_CLI_Install start ...");\r
     \r
+    if (pDrvInfo->BytesPerLogicalSector == 4096 && pDrvInfo->BytesPerPhysicalSector == 4096)\r
+    {\r
+        Log("Ventoy does not support 4k native disk.");\r
+        rc = 1;\r
+        goto out;\r
+    }\r
+\r
     if (pCfg->ReserveMB > 0)\r
     {\r
         CLISetReserveSpace(pCfg->ReserveMB);\r
     }\r
 \r
+    SetVentoyFsType(pCfg->fstype);\r
+\r
     rc = InstallVentoy2PhyDrive(pDrvInfo, pCfg->PartStyle, TryId++);\r
     if (rc)\r
     {\r
@@ -274,6 +365,9 @@ static int Ventoy_CLI_Install(PHY_DRIVE_INFO* pDrvInfo, CLI_CFG *pCfg)
         }\r
     }\r
 \r
+    SetVentoyFsType(VTOY_FS_EXFAT);\r
+\r
+out:\r
     Log("Ventoy_CLI_Install [%s]", rc == 0 ? "SUCCESS" : "FAILED");\r
 \r
     return rc;\r
@@ -351,6 +445,11 @@ static void CLI_WriteDoneFile(int ret)
     }\r
 }\r
 \r
+PHY_DRIVE_INFO* CLI_PhyDrvInfo(void)\r
+{\r
+    return g_CLI_PhyDrvInfo;\r
+}\r
+\r
 /*\r
  * Ventoy2Disk.exe VTOYCLI  { /I | /U }  { /Drive:F: | /PhyDrive:1 }  /GPT  /NoSB  /R:4096 /NoUSBCheck\r
  * \r
@@ -364,7 +463,7 @@ int VentoyCLIMain(int argc, char** argv)
     DeleteFileA(VENTOY_CLI_PERCENT);\r
     DeleteFileA(VENTOY_CLI_DONE);\r
 \r
-    pDrvInfo = (PHY_DRIVE_INFO*)malloc(sizeof(PHY_DRIVE_INFO));\r
+    g_CLI_PhyDrvInfo = pDrvInfo = (PHY_DRIVE_INFO*)malloc(sizeof(PHY_DRIVE_INFO));\r
     if (!pDrvInfo)\r
     {\r
         goto end;\r
@@ -388,7 +487,16 @@ int VentoyCLIMain(int argc, char** argv)
 \r
     if (CliCfg.op == 0)\r
     {\r
-        ret = Ventoy_CLI_Install(pDrvInfo, &CliCfg);\r
+        if (CliCfg.NonDest)\r
+        {\r
+            ret = Ventoy_CLI_NonDestInstall(pDrvInfo, &CliCfg);\r
+        }\r
+        else\r
+        {\r
+            AlertSuppressInit();\r
+            SetAlertPromptHookEnable(TRUE);\r
+            ret = Ventoy_CLI_Install(pDrvInfo, &CliCfg);\r
+        }\r
     }\r
     else\r
     {\r