2. Add tip message for 4k native disk.
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
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
#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
"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":""
}
char disk_model[256]; // Sandisk/Kingston ...
char human_readable_size[32];
+ int is4kn;
int major;
int minor;
int type;
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;
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);
#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\" }"
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;
+}
+
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__ */
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");
}
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);
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)
{
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
}
-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'
\r
STR_DONATE, //54\r
\r
+ STR_4KN_UNSUPPORTED, //55\r
+\r
STR_ID_MAX\r
}STR_ID;\r
\r
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
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
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
\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
\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
}\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
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
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
\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
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
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
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
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
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
{\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
{\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
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
}\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
\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
}\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
}\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
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
\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