mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-04-23 20:15:45 -04:00
add GPT support
This commit is contained in:
parent
1d034f0a24
commit
9ecbff9ce6
Binary file not shown.
@ -12,6 +12,7 @@ print_usage() {
|
|||||||
echo ' OPTION: (optional)'
|
echo ' OPTION: (optional)'
|
||||||
echo ' -r SIZE_MB preserve some space at the bottom of the disk (only for install)'
|
echo ' -r SIZE_MB preserve some space at the bottom of the disk (only for install)'
|
||||||
echo ' -s enable secure boot support (default is disabled)'
|
echo ' -s enable secure boot support (default is disabled)'
|
||||||
|
echo ' -g use GPT partition style, default is MBR (only for install)'
|
||||||
echo ''
|
echo ''
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -27,6 +28,8 @@ while [ -n "$1" ]; do
|
|||||||
MODE="update"
|
MODE="update"
|
||||||
elif [ "$1" = "-s" ]; then
|
elif [ "$1" = "-s" ]; then
|
||||||
SECUREBOOT="YES"
|
SECUREBOOT="YES"
|
||||||
|
elif [ "$1" = "-g" ]; then
|
||||||
|
VTGPT="YES"
|
||||||
elif [ "$1" = "-r" ]; then
|
elif [ "$1" = "-r" ]; then
|
||||||
RESERVE_SPACE="YES"
|
RESERVE_SPACE="YES"
|
||||||
shift
|
shift
|
||||||
@ -110,6 +113,14 @@ fi
|
|||||||
if [ "$MODE" = "install" ]; then
|
if [ "$MODE" = "install" ]; then
|
||||||
vtdebug "install ventoy ..."
|
vtdebug "install ventoy ..."
|
||||||
|
|
||||||
|
if [ -n "$VTGPT" ]; then
|
||||||
|
if parted -v > /dev/null 2>&1; then
|
||||||
|
PARTTOOL='parted'
|
||||||
|
else
|
||||||
|
vterr "parted is not found in the sysstem, Ventoy can't create new partition."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
if parted -v > /dev/null 2>&1; then
|
if parted -v > /dev/null 2>&1; then
|
||||||
PARTTOOL='parted'
|
PARTTOOL='parted'
|
||||||
elif fdisk -v >/dev/null 2>&1; then
|
elif fdisk -v >/dev/null 2>&1; then
|
||||||
@ -118,6 +129,7 @@ if [ "$MODE" = "install" ]; then
|
|||||||
vterr "Both parted and fdisk are not found in the sysstem, Ventoy can't create new partition."
|
vterr "Both parted and fdisk are not found in the sysstem, Ventoy can't create new partition."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
version=$(get_disk_ventoy_version $DISK)
|
version=$(get_disk_ventoy_version $DISK)
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
@ -148,11 +160,15 @@ if [ "$MODE" = "install" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
#Print disk info
|
#Print disk info
|
||||||
echo "Disk : $DISK"
|
echo "Disk : $DISK"
|
||||||
parted -s $DISK p 2>&1 | grep Model
|
parted -s $DISK p 2>&1 | grep Model
|
||||||
echo "Size : $disk_size_gb GB"
|
echo "Size : $disk_size_gb GB"
|
||||||
|
if [ -n "$VTGPT" ]; then
|
||||||
|
echo "Style: GPT"
|
||||||
|
else
|
||||||
|
echo "Style: MBR"
|
||||||
|
fi
|
||||||
echo ''
|
echo ''
|
||||||
|
|
||||||
if [ -n "$RESERVE_SPACE" ]; then
|
if [ -n "$RESERVE_SPACE" ]; then
|
||||||
@ -192,7 +208,13 @@ if [ "$MODE" = "install" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
format_ventoy_disk $RESERVE_SIZE_MB $DISK $PARTTOOL
|
if [ -n "$VTGPT" ]; then
|
||||||
|
vtdebug "format_ventoy_disk_gpt $RESERVE_SIZE_MB $DISK $PARTTOOL ..."
|
||||||
|
format_ventoy_disk_gpt $RESERVE_SIZE_MB $DISK $PARTTOOL
|
||||||
|
else
|
||||||
|
vtdebug "format_ventoy_disk_mbr $RESERVE_SIZE_MB $DISK $PARTTOOL ..."
|
||||||
|
format_ventoy_disk_mbr $RESERVE_SIZE_MB $DISK $PARTTOOL
|
||||||
|
fi
|
||||||
|
|
||||||
# format part1
|
# format part1
|
||||||
if ventoy_is_linux64; then
|
if ventoy_is_linux64; then
|
||||||
@ -216,8 +238,17 @@ if [ "$MODE" = "install" ]; then
|
|||||||
chmod +x ./tool/vtoy_gen_uuid
|
chmod +x ./tool/vtoy_gen_uuid
|
||||||
|
|
||||||
vtinfo "writing data to disk ..."
|
vtinfo "writing data to disk ..."
|
||||||
|
|
||||||
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
|
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
|
||||||
|
|
||||||
|
if [ -n "$VTGPT" ]; then
|
||||||
|
echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92
|
||||||
|
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34
|
||||||
|
echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none
|
||||||
|
else
|
||||||
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
||||||
|
fi
|
||||||
|
|
||||||
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
|
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
|
||||||
|
|
||||||
#disk uuid
|
#disk uuid
|
||||||
@ -308,7 +339,10 @@ else
|
|||||||
echo -en '\x00' | dd of=$DISK conv=fsync bs=1 count=1 seek=462 status=none
|
echo -en '\x00' | dd of=$DISK conv=fsync bs=1 count=1 seek=462 status=none
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
||||||
|
|
||||||
|
|
||||||
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
|
./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
@ -126,12 +126,16 @@ is_disk_contains_ventoy() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||||
PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||||
|
|
||||||
|
if [ "$PART1_TYPE" != "EE" ]; then
|
||||||
if [ "$PART2_TYPE" != "EF" ]; then
|
if [ "$PART2_TYPE" != "EF" ]; then
|
||||||
vtdebug "part2 type is $PART2_TYPE not EF"
|
vtdebug "part2 type is $PART2_TYPE not EF"
|
||||||
ventoy_false
|
ventoy_false
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
# PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||||
# if [ "$PART1_TYPE" != "07" ]; then
|
# if [ "$PART1_TYPE" != "07" ]; then
|
||||||
@ -185,7 +189,7 @@ get_disk_ventoy_version() {
|
|||||||
ventoy_false
|
ventoy_false
|
||||||
}
|
}
|
||||||
|
|
||||||
format_ventoy_disk() {
|
format_ventoy_disk_mbr() {
|
||||||
reserve_mb=$1
|
reserve_mb=$1
|
||||||
DISK=$2
|
DISK=$2
|
||||||
PARTTOOL=$3
|
PARTTOOL=$3
|
||||||
@ -218,7 +222,7 @@ format_ventoy_disk() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Create partitions on $DISK by $PARTTOOL ..."
|
echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
|
||||||
|
|
||||||
if [ "$PARTTOOL" = "parted" ]; then
|
if [ "$PARTTOOL" = "parted" ]; then
|
||||||
vtdebug "format disk by parted ..."
|
vtdebug "format disk by parted ..."
|
||||||
@ -300,5 +304,95 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
format_ventoy_disk_gpt() {
|
||||||
|
reserve_mb=$1
|
||||||
|
DISK=$2
|
||||||
|
PARTTOOL=$3
|
||||||
|
|
||||||
|
PART1=$(get_disk_part_name $DISK 1)
|
||||||
|
PART2=$(get_disk_part_name $DISK 2)
|
||||||
|
|
||||||
|
sector_num=$(cat /sys/block/${DISK#/dev/}/size)
|
||||||
|
|
||||||
|
part1_start_sector=2048
|
||||||
|
|
||||||
|
if [ $reserve_mb -gt 0 ]; then
|
||||||
|
reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
|
||||||
|
part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
|
||||||
|
else
|
||||||
|
part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
|
||||||
|
fi
|
||||||
|
|
||||||
|
part2_start_sector=$(expr $part1_end_sector + 1)
|
||||||
|
part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
|
||||||
|
|
||||||
|
export part2_start_sector
|
||||||
|
|
||||||
|
vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
|
||||||
|
vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
|
||||||
|
|
||||||
|
if [ -e $PART2 ]; then
|
||||||
|
echo "delete $PART2"
|
||||||
|
rm -f $PART2
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
|
||||||
|
|
||||||
|
vtdebug "format disk by parted ..."
|
||||||
|
parted -a none --script $DISK \
|
||||||
|
mklabel gpt \
|
||||||
|
unit s \
|
||||||
|
mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
|
||||||
|
mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
|
||||||
|
set 2 boot on \
|
||||||
|
set 2 esp on \
|
||||||
|
set 2 hidden on \
|
||||||
|
quit
|
||||||
|
|
||||||
|
sync
|
||||||
|
|
||||||
|
udevadm trigger >/dev/null 2>&1
|
||||||
|
partprobe >/dev/null 2>&1
|
||||||
|
sleep 3
|
||||||
|
echo "Done"
|
||||||
|
|
||||||
|
echo 'mkfs on disk partitions ...'
|
||||||
|
for i in 1 2 3 4 5 6 7; do
|
||||||
|
if [ -b $PART2 ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "wait $PART2 ..."
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
if ! [ -b $PART2 ]; then
|
||||||
|
MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
|
||||||
|
echo "mknod -m 0660 $PART2 b $MajorMinor ..."
|
||||||
|
mknod -m 0660 $PART2 b $MajorMinor
|
||||||
|
|
||||||
|
if ! [ -b $PART1 ]; then
|
||||||
|
MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
|
||||||
|
echo "mknod -m 0660 $PART1 b $MajorMinor ..."
|
||||||
|
mknod -m 0660 $PART1 b $MajorMinor
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "create efi fat fs $PART2 ..."
|
||||||
|
for i in 0 1 2 3 4 5 6 7 8 9; do
|
||||||
|
if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
|
||||||
|
echo 'success'
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "$? retry ..."
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ while ! grep -q 524288 /sys/block/${LOOP#/dev/}/size 2>/dev/null; do
|
|||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
|
|
||||||
format_ventoy_disk 0 $LOOP fdisk
|
format_ventoy_disk_mbr 0 $LOOP fdisk
|
||||||
|
|
||||||
$GRUB_DIR/sbin/grub-bios-setup --skip-fs-probe --directory="./grub/i386-pc" $LOOP
|
$GRUB_DIR/sbin/grub-bios-setup --skip-fs-probe --directory="./grub/i386-pc" $LOOP
|
||||||
|
|
||||||
|
Binary file not shown.
@ -60,6 +60,9 @@ typedef enum STR_ID
|
|||||||
STR_MENU_CLEAR, //26
|
STR_MENU_CLEAR, //26
|
||||||
STR_CLEAR_SUCCESS, //27
|
STR_CLEAR_SUCCESS, //27
|
||||||
STR_CLEAR_FAILED, //28
|
STR_CLEAR_FAILED, //28
|
||||||
|
STR_MENU_PART_STYLE, //29
|
||||||
|
STR_DISK_2TB_MBR_ERROR,//30
|
||||||
|
|
||||||
|
|
||||||
STR_ID_MAX
|
STR_ID_MAX
|
||||||
}STR_ID;
|
}STR_ID;
|
||||||
@ -69,6 +72,22 @@ extern BOOL g_SecureBoot;
|
|||||||
#define VTOY_MENU_SECURE_BOOT 0xA000
|
#define VTOY_MENU_SECURE_BOOT 0xA000
|
||||||
#define VTOY_MENU_PART_CFG 0xA001
|
#define VTOY_MENU_PART_CFG 0xA001
|
||||||
#define VTOY_MENU_CLEAN 0xA002
|
#define VTOY_MENU_CLEAN 0xA002
|
||||||
|
#define VTOY_MENU_PART_STYLE 0xA003
|
||||||
|
#define VTOY_MENU_PART_MBR 0xA004
|
||||||
|
#define VTOY_MENU_PART_GPT 0xA005
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum OPT_SUBMENU
|
||||||
|
{
|
||||||
|
OPT_SUBMENU_SECURE_BOOT = 0,
|
||||||
|
OPT_SUBMENU_PART_STYLE,
|
||||||
|
OPT_SUBMENU_PART_CFG,
|
||||||
|
OPT_SUBMENU_CLEAR,
|
||||||
|
|
||||||
|
OPT_SUBMENU_MAX
|
||||||
|
}OPT_SUBMENU;
|
||||||
|
|
||||||
|
|
||||||
#define VTOY_MENU_LANGUAGE_BEGIN 0xB000
|
#define VTOY_MENU_LANGUAGE_BEGIN 0xB000
|
||||||
|
|
||||||
|
|
||||||
|
@ -798,7 +798,7 @@ static int VentoyFatDiskRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, MBR_HEAD *pMBR, CHAR *VerBuf, size_t BufLen)
|
int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
HANDLE hDrive;
|
HANDLE hDrive;
|
||||||
@ -810,7 +810,7 @@ int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, MBR_HEAD *pMBR, CHA
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_FatPhyDrive = hDrive;
|
g_FatPhyDrive = hDrive;
|
||||||
g_Part2StartSec = pMBR->PartTbl[1].StartSectorId;
|
g_Part2StartSec = Part2StartSector;
|
||||||
|
|
||||||
Log("Parse FAT fs...");
|
Log("Parse FAT fs...");
|
||||||
|
|
||||||
@ -1154,7 +1154,7 @@ End:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int WriteGrubStage1ToPhyDrive(HANDLE hDrive)
|
static int WriteGrubStage1ToPhyDrive(HANDLE hDrive, int PartStyle)
|
||||||
{
|
{
|
||||||
int Len = 0;
|
int Len = 0;
|
||||||
int readLen = 0;
|
int readLen = 0;
|
||||||
@ -1180,9 +1180,20 @@ static int WriteGrubStage1ToPhyDrive(HANDLE hDrive)
|
|||||||
|
|
||||||
unxz(ImgBuf, Len, NULL, NULL, RawBuf, &readLen, unxz_error);
|
unxz(ImgBuf, Len, NULL, NULL, RawBuf, &readLen, unxz_error);
|
||||||
|
|
||||||
|
if (PartStyle)
|
||||||
|
{
|
||||||
|
Log("Write GPT stage1 ...");
|
||||||
|
RawBuf[500] = 35;//update blocklist
|
||||||
|
SetFilePointer(hDrive, 512 * 34, NULL, FILE_BEGIN);
|
||||||
|
bRet = WriteFile(hDrive, RawBuf, SIZE_1MB - 512 * 34, &dwSize, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("Write MBR stage1 ...");
|
||||||
SetFilePointer(hDrive, 512, NULL, FILE_BEGIN);
|
SetFilePointer(hDrive, 512, NULL, FILE_BEGIN);
|
||||||
|
|
||||||
bRet = WriteFile(hDrive, RawBuf, SIZE_1MB - 512, &dwSize, NULL);
|
bRet = WriteFile(hDrive, RawBuf, SIZE_1MB - 512, &dwSize, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
Log("WriteFile Ret:%u dwSize:%u ErrCode:%u", bRet, dwSize, GetLastError());
|
Log("WriteFile Ret:%u dwSize:%u ErrCode:%u", bRet, dwSize, GetLastError());
|
||||||
|
|
||||||
free(RawBuf);
|
free(RawBuf);
|
||||||
@ -1372,7 +1383,7 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett
|
|||||||
|
|
||||||
VentoyFillLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl);
|
VentoyFillLocation(pPhyDrive->SizeInBytes, 2048, (UINT32)(pPhyDrive->SizeInBytes / 512 - 2048), MBR.PartTbl);
|
||||||
|
|
||||||
MBR.PartTbl[0].Active = 0x80; // bootable
|
MBR.PartTbl[0].Active = 0x00; // bootable
|
||||||
MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS
|
MBR.PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS
|
||||||
|
|
||||||
SET_FILE_POS(0);
|
SET_FILE_POS(0);
|
||||||
@ -1386,6 +1397,9 @@ int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLett
|
|||||||
|
|
||||||
Log("Clear Ventoy successfully finished");
|
Log("Clear Ventoy successfully finished");
|
||||||
|
|
||||||
|
//Refresh Drive Layout
|
||||||
|
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);
|
||||||
|
|
||||||
End:
|
End:
|
||||||
|
|
||||||
PROGRESS_BAR_SET_POS(PT_MOUNT_VOLUME);
|
PROGRESS_BAR_SET_POS(PT_MOUNT_VOLUME);
|
||||||
@ -1436,14 +1450,11 @@ End:
|
|||||||
FindProcessOccupyDisk(hDrive, pPhyDrive);
|
FindProcessOccupyDisk(hDrive, pPhyDrive);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Refresh Drive Layout
|
|
||||||
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);
|
|
||||||
|
|
||||||
CHECK_CLOSE_HANDLE(hDrive);
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@ -1455,14 +1466,25 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
CHAR DriveName[] = "?:\\";
|
CHAR DriveName[] = "?:\\";
|
||||||
CHAR DriveLetters[MAX_PATH] = { 0 };
|
CHAR DriveLetters[MAX_PATH] = { 0 };
|
||||||
MBR_HEAD MBR;
|
MBR_HEAD MBR;
|
||||||
|
VTOY_GPT_INFO *pGptInfo = NULL;
|
||||||
|
|
||||||
Log("InstallVentoy2PhyDrive PhyDrive%d <<%s %s %dGB>>",
|
Log("InstallVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>",
|
||||||
pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,
|
PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,
|
||||||
GetHumanReadableGBSize(pPhyDrive->SizeInBytes));
|
GetHumanReadableGBSize(pPhyDrive->SizeInBytes));
|
||||||
|
|
||||||
|
if (PartStyle)
|
||||||
|
{
|
||||||
|
pGptInfo = malloc(sizeof(VTOY_GPT_INFO));
|
||||||
|
memset(pGptInfo, 0, sizeof(VTOY_GPT_INFO));
|
||||||
|
}
|
||||||
|
|
||||||
PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);
|
PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);
|
||||||
|
|
||||||
VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR);
|
VentoyFillMBR(pPhyDrive->SizeInBytes, &MBR, PartStyle);//also used to format 1st partition in GPT mode
|
||||||
|
if (PartStyle)
|
||||||
|
{
|
||||||
|
VentoyFillGpt(pPhyDrive->SizeInBytes, pGptInfo);
|
||||||
|
}
|
||||||
|
|
||||||
Log("Lock disk for clean ............................. ");
|
Log("Lock disk for clean ............................. ");
|
||||||
|
|
||||||
@ -1470,6 +1492,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
if (hDrive == INVALID_HANDLE_VALUE)
|
if (hDrive == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
Log("Failed to open physical disk");
|
Log("Failed to open physical disk");
|
||||||
|
free(pGptInfo);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1531,7 +1554,7 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
Log("Formatting part1 exFAT ...");
|
Log("Formatting part1 exFAT ...");
|
||||||
if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))
|
if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))
|
||||||
{
|
{
|
||||||
log("FormatPart1exFAT failed.");
|
Log("FormatPart1exFAT failed.");
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
@ -1540,16 +1563,16 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
Log("Writing part2 FAT img ...");
|
Log("Writing part2 FAT img ...");
|
||||||
if (0 != FormatPart2Fat(hDrive, MBR.PartTbl[1].StartSectorId))
|
if (0 != FormatPart2Fat(hDrive, MBR.PartTbl[1].StartSectorId))
|
||||||
{
|
{
|
||||||
log("FormatPart2Fat failed.");
|
Log("FormatPart2Fat failed.");
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
|
|
||||||
PROGRESS_BAR_SET_POS(PT_WRITE_STG1_IMG);
|
PROGRESS_BAR_SET_POS(PT_WRITE_STG1_IMG);
|
||||||
Log("Writting Boot Image ............................. ");
|
Log("Writting Boot Image ............................. ");
|
||||||
if (WriteGrubStage1ToPhyDrive(hDrive) != 0)
|
if (WriteGrubStage1ToPhyDrive(hDrive, PartStyle) != 0)
|
||||||
{
|
{
|
||||||
log("WriteGrubStage1ToPhyDrive failed.");
|
Log("WriteGrubStage1ToPhyDrive failed.");
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
@ -1557,14 +1580,50 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
PROGRESS_BAR_SET_POS(PT_WRITE_PART_TABLE);
|
PROGRESS_BAR_SET_POS(PT_WRITE_PART_TABLE);
|
||||||
Log("Writting Partition Table ........................ ");
|
Log("Writting Partition Table ........................ ");
|
||||||
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
||||||
|
|
||||||
|
if (PartStyle)
|
||||||
|
{
|
||||||
|
VTOY_GPT_HDR BackupHead;
|
||||||
|
LARGE_INTEGER liCurrentPosition;
|
||||||
|
|
||||||
|
SET_FILE_POS(pPhyDrive->SizeInBytes - 512);
|
||||||
|
VentoyFillBackupGptHead(pGptInfo, &BackupHead);
|
||||||
|
if (!WriteFile(hDrive, &BackupHead, sizeof(VTOY_GPT_HDR), &dwSize, NULL))
|
||||||
|
{
|
||||||
|
rc = 1;
|
||||||
|
Log("Write GPT Backup Head Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError());
|
||||||
|
goto End;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_FILE_POS(pPhyDrive->SizeInBytes - 512 * 33);
|
||||||
|
if (!WriteFile(hDrive, pGptInfo->PartTbl, sizeof(pGptInfo->PartTbl), &dwSize, NULL))
|
||||||
|
{
|
||||||
|
rc = 1;
|
||||||
|
Log("Write GPT Backup Part Table Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError());
|
||||||
|
goto End;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_FILE_POS(0);
|
||||||
|
if (!WriteFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL))
|
||||||
|
{
|
||||||
|
rc = 1;
|
||||||
|
Log("Write GPT Info Failed, dwSize:%u (%u) ErrCode:%u", dwSize, sizeof(VTOY_GPT_INFO), GetLastError());
|
||||||
|
goto End;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log("Write GPT Info OK ...");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (!WriteFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL))
|
if (!WriteFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL))
|
||||||
{
|
{
|
||||||
rc = 1;
|
rc = 1;
|
||||||
Log("Write MBR Failed, dwSize:%u ErrCode:%u", dwSize, GetLastError());
|
Log("Write MBR Failed, dwSize:%u ErrCode:%u", dwSize, GetLastError());
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log("Write MBR OK ...");
|
Log("Write MBR OK ...");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//Refresh Drive Layout
|
//Refresh Drive Layout
|
||||||
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);
|
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);
|
||||||
@ -1619,6 +1678,11 @@ End:
|
|||||||
FindProcessOccupyDisk(hDrive, pPhyDrive);
|
FindProcessOccupyDisk(hDrive, pPhyDrive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pGptInfo)
|
||||||
|
{
|
||||||
|
free(pGptInfo);
|
||||||
|
}
|
||||||
|
|
||||||
CHECK_CLOSE_HANDLE(hDrive);
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1635,13 +1699,14 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
BOOL bRet;
|
BOOL bRet;
|
||||||
CHAR DriveName[] = "?:\\";
|
CHAR DriveName[] = "?:\\";
|
||||||
CHAR DriveLetters[MAX_PATH] = { 0 };
|
CHAR DriveLetters[MAX_PATH] = { 0 };
|
||||||
UINT32 StartSector;
|
UINT64 StartSector;
|
||||||
UINT64 ReservedMB = 0;
|
UINT64 ReservedMB = 0;
|
||||||
MBR_HEAD BootImg;
|
MBR_HEAD BootImg;
|
||||||
MBR_HEAD MBR;
|
MBR_HEAD MBR;
|
||||||
|
VTOY_GPT_INFO *pGptInfo = NULL;
|
||||||
|
|
||||||
Log("UpdateVentoy2PhyDrive PhyDrive%d <<%s %s %dGB>>",
|
Log("UpdateVentoy2PhyDrive %s PhyDrive%d <<%s %s %dGB>>",
|
||||||
pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,
|
pPhyDrive->PartStyle ? "GPT" : "MBR", pPhyDrive->PhyDrive, pPhyDrive->VendorId, pPhyDrive->ProductId,
|
||||||
GetHumanReadableGBSize(pPhyDrive->SizeInBytes));
|
GetHumanReadableGBSize(pPhyDrive->SizeInBytes));
|
||||||
|
|
||||||
PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);
|
PROGRESS_BAR_SET_POS(PT_LOCK_FOR_CLEAN);
|
||||||
@ -1655,15 +1720,38 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pPhyDrive->PartStyle)
|
||||||
|
{
|
||||||
|
pGptInfo = malloc(sizeof(VTOY_GPT_INFO));
|
||||||
|
if (!pGptInfo)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(pGptInfo, 0, sizeof(VTOY_GPT_INFO));
|
||||||
|
|
||||||
|
// Read GPT Info
|
||||||
|
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
||||||
|
ReadFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL);
|
||||||
|
|
||||||
|
StartSector = pGptInfo->PartTbl[1].StartLBA;
|
||||||
|
Log("GPT StartSector in PartTbl:%llu", (ULONGLONG)StartSector);
|
||||||
|
|
||||||
|
ReservedMB = (pPhyDrive->SizeInBytes / 512 - (StartSector + VENTOY_EFI_PART_SIZE / 512) - 33) / 2048;
|
||||||
|
Log("GPT Reserved Disk Space:%llu MB", (ULONGLONG)ReservedMB);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// Read MBR
|
// Read MBR
|
||||||
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
||||||
ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);
|
ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);
|
||||||
|
|
||||||
StartSector = MBR.PartTbl[1].StartSectorId;
|
StartSector = MBR.PartTbl[1].StartSectorId;
|
||||||
Log("StartSector in PartTbl:%u", StartSector);
|
Log("MBR StartSector in PartTbl:%llu", (ULONGLONG)StartSector);
|
||||||
|
|
||||||
ReservedMB = (pPhyDrive->SizeInBytes / 512 - (StartSector + VENTOY_EFI_PART_SIZE / 512)) / 2048;
|
ReservedMB = (pPhyDrive->SizeInBytes / 512 - (StartSector + VENTOY_EFI_PART_SIZE / 512)) / 2048;
|
||||||
Log("Reserved Disk Space:%u MB", ReservedMB);
|
Log("MBR Reserved Disk Space:%llu MB", (ULONGLONG)ReservedMB);
|
||||||
|
}
|
||||||
|
|
||||||
GetLettersBelongPhyDrive(pPhyDrive->PhyDrive, DriveLetters, sizeof(DriveLetters));
|
GetLettersBelongPhyDrive(pPhyDrive->PhyDrive, DriveLetters, sizeof(DriveLetters));
|
||||||
|
|
||||||
@ -1781,7 +1869,7 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log("Updating Boot Image ............................. ");
|
Log("Updating Boot Image ............................. ");
|
||||||
if (WriteGrubStage1ToPhyDrive(hDrive) != 0)
|
if (WriteGrubStage1ToPhyDrive(hDrive, pPhyDrive->PartStyle) != 0)
|
||||||
{
|
{
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto End;
|
goto End;
|
||||||
@ -1792,6 +1880,10 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
|
|
||||||
// Use Old UUID
|
// Use Old UUID
|
||||||
memcpy(BootImg.BootCode + 0x180, MBR.BootCode + 0x180, 16);
|
memcpy(BootImg.BootCode + 0x180, MBR.BootCode + 0x180, 16);
|
||||||
|
if (pPhyDrive->PartStyle)
|
||||||
|
{
|
||||||
|
BootImg.BootCode[92] = 0x22;
|
||||||
|
}
|
||||||
|
|
||||||
if (ForceMBR == FALSE && memcmp(BootImg.BootCode, MBR.BootCode, 440) == 0)
|
if (ForceMBR == FALSE && memcmp(BootImg.BootCode, MBR.BootCode, 440) == 0)
|
||||||
{
|
{
|
||||||
@ -1808,6 +1900,8 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
Log("Write Boot Image ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR);
|
Log("Write Boot Image ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pPhyDrive->PartStyle == 0)
|
||||||
|
{
|
||||||
if (0x00 == MBR.PartTbl[0].Active && 0x80 == MBR.PartTbl[1].Active)
|
if (0x00 == MBR.PartTbl[0].Active && 0x80 == MBR.PartTbl[1].Active)
|
||||||
{
|
{
|
||||||
Log("Need to chage 1st partition active and 2nd partition inactive.");
|
Log("Need to chage 1st partition active and 2nd partition inactive.");
|
||||||
@ -1819,6 +1913,7 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
|||||||
bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL);
|
bRet = WriteFile(hDrive, &MBR, 512, &dwSize, NULL);
|
||||||
Log("Write NEW MBR ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR);
|
Log("Write NEW MBR ret:%u dwSize:%u Error:%u", bRet, dwSize, LASTERR);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Refresh Drive Layout
|
//Refresh Drive Layout
|
||||||
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);
|
DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &dwSize, NULL);
|
||||||
@ -1836,6 +1931,11 @@ End:
|
|||||||
|
|
||||||
CHECK_CLOSE_HANDLE(hDrive);
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
|
|
||||||
|
if (pGptInfo)
|
||||||
|
{
|
||||||
|
free(pGptInfo);
|
||||||
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -424,7 +424,7 @@ int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 Sect
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR)
|
int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle)
|
||||||
{
|
{
|
||||||
GUID Guid;
|
GUID Guid;
|
||||||
int ReservedValue;
|
int ReservedValue;
|
||||||
@ -444,7 +444,14 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR)
|
|||||||
|
|
||||||
*((UINT32 *)(pMBR->BootCode + 0x1B8)) = DiskSignature;
|
*((UINT32 *)(pMBR->BootCode + 0x1B8)) = DiskSignature;
|
||||||
|
|
||||||
|
if (DiskSizeBytes / 512 > 0xFFFFFFFF)
|
||||||
|
{
|
||||||
|
DiskSectorCount = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
DiskSectorCount = (UINT32)(DiskSizeBytes / 512);
|
DiskSectorCount = (UINT32)(DiskSizeBytes / 512);
|
||||||
|
}
|
||||||
|
|
||||||
ReservedValue = GetReservedSpaceInMB();
|
ReservedValue = GetReservedSpaceInMB();
|
||||||
if (ReservedValue <= 0)
|
if (ReservedValue <= 0)
|
||||||
@ -456,6 +463,11 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR)
|
|||||||
ReservedSector = (UINT32)(ReservedValue * 2048);
|
ReservedSector = (UINT32)(ReservedValue * 2048);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PartStyle)
|
||||||
|
{
|
||||||
|
ReservedSector += 33; // backup GPT part table
|
||||||
|
}
|
||||||
|
|
||||||
Log("ReservedSector: %u", ReservedSector);
|
Log("ReservedSector: %u", ReservedSector);
|
||||||
|
|
||||||
//Part1
|
//Part1
|
||||||
@ -480,6 +492,129 @@ int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int VentoyFillProtectMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR)
|
||||||
|
{
|
||||||
|
GUID Guid;
|
||||||
|
UINT32 DiskSignature;
|
||||||
|
UINT64 DiskSectorCount;
|
||||||
|
|
||||||
|
VentoyGetLocalBootImg(pMBR);
|
||||||
|
|
||||||
|
CoCreateGuid(&Guid);
|
||||||
|
|
||||||
|
memcpy(&DiskSignature, &Guid, sizeof(UINT32));
|
||||||
|
|
||||||
|
Log("Disk signature: 0x%08x", DiskSignature);
|
||||||
|
|
||||||
|
*((UINT32 *)(pMBR->BootCode + 0x1B8)) = DiskSignature;
|
||||||
|
|
||||||
|
DiskSectorCount = DiskSizeBytes / 512 - 1;
|
||||||
|
if (DiskSectorCount > 0xFFFFFFFF)
|
||||||
|
{
|
||||||
|
DiskSectorCount = 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(pMBR->PartTbl, 0, sizeof(pMBR->PartTbl));
|
||||||
|
|
||||||
|
pMBR->PartTbl[0].Active = 0x00;
|
||||||
|
pMBR->PartTbl[0].FsFlag = 0xee; // EE
|
||||||
|
|
||||||
|
pMBR->PartTbl[0].StartHead = 0;
|
||||||
|
pMBR->PartTbl[0].StartSector = 1;
|
||||||
|
pMBR->PartTbl[0].StartCylinder = 0;
|
||||||
|
pMBR->PartTbl[0].EndHead = 254;
|
||||||
|
pMBR->PartTbl[0].EndSector = 63;
|
||||||
|
pMBR->PartTbl[0].EndCylinder = 1023;
|
||||||
|
|
||||||
|
pMBR->PartTbl[0].StartSectorId = 1;
|
||||||
|
pMBR->PartTbl[0].SectorCount = (UINT32)DiskSectorCount;
|
||||||
|
|
||||||
|
pMBR->Byte55 = 0x55;
|
||||||
|
pMBR->ByteAA = 0xAA;
|
||||||
|
|
||||||
|
pMBR->BootCode[92] = 0x22;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo)
|
||||||
|
{
|
||||||
|
INT64 ReservedValue = 0;
|
||||||
|
UINT64 ReservedSector = 33;
|
||||||
|
UINT64 Part1SectorCount = 0;
|
||||||
|
UINT64 DiskSectorCount = DiskSizeBytes / 512;
|
||||||
|
VTOY_GPT_HDR *Head = &pInfo->Head;
|
||||||
|
VTOY_GPT_PART_TBL *Table = pInfo->PartTbl;
|
||||||
|
static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } };
|
||||||
|
static GUID EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } };
|
||||||
|
|
||||||
|
VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR);
|
||||||
|
|
||||||
|
ReservedValue = GetReservedSpaceInMB();
|
||||||
|
if (ReservedValue > 0)
|
||||||
|
{
|
||||||
|
ReservedSector += ReservedValue * 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
Part1SectorCount = DiskSectorCount - ReservedSector - (VENTOY_EFI_PART_SIZE / 512) - 2048;
|
||||||
|
|
||||||
|
memcpy(Head->Signature, "EFI PART", 8);
|
||||||
|
Head->Version[2] = 0x01;
|
||||||
|
Head->Length = 92;
|
||||||
|
Head->Crc = 0;
|
||||||
|
Head->EfiStartLBA = 1;
|
||||||
|
Head->EfiBackupLBA = DiskSectorCount - 1;
|
||||||
|
Head->PartAreaStartLBA = 34;
|
||||||
|
Head->PartAreaEndLBA = DiskSectorCount - 34;
|
||||||
|
CoCreateGuid(&Head->DiskGuid);
|
||||||
|
Head->PartTblStartLBA = 2;
|
||||||
|
Head->PartTblTotNum = 128;
|
||||||
|
Head->PartTblEntryLen = 128;
|
||||||
|
|
||||||
|
|
||||||
|
memcpy(&(Table[0].PartType), &WindowsDataPartType, sizeof(GUID));
|
||||||
|
CoCreateGuid(&(Table[0].PartGuid));
|
||||||
|
Table[0].StartLBA = 2048;
|
||||||
|
Table[0].LastLBA = 2048 + Part1SectorCount - 1;
|
||||||
|
Table[0].Attr = 0;
|
||||||
|
memcpy(Table[0].Name, L"Ventoy", 6 * 2);
|
||||||
|
|
||||||
|
memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID));
|
||||||
|
CoCreateGuid(&(Table[1].PartGuid));
|
||||||
|
Table[1].StartLBA = Table[0].LastLBA + 1;
|
||||||
|
Table[1].LastLBA = Table[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1;
|
||||||
|
Table[1].Attr = 1;
|
||||||
|
memcpy(Table[1].Name, L"VTOYEFI", 7 * 2);
|
||||||
|
|
||||||
|
//Update CRC
|
||||||
|
Head->PartTblCrc = VentoyCrc32(Table, sizeof(pInfo->PartTbl));
|
||||||
|
Head->Crc = VentoyCrc32(Head, Head->Length);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead)
|
||||||
|
{
|
||||||
|
UINT64 LBA;
|
||||||
|
UINT64 BackupLBA;
|
||||||
|
|
||||||
|
memcpy(pHead, &pInfo->Head, sizeof(VTOY_GPT_HDR));
|
||||||
|
|
||||||
|
LBA = pHead->EfiStartLBA;
|
||||||
|
BackupLBA = pHead->EfiBackupLBA;
|
||||||
|
|
||||||
|
pHead->EfiStartLBA = BackupLBA;
|
||||||
|
pHead->EfiBackupLBA = LBA;
|
||||||
|
pHead->PartTblStartLBA = BackupLBA + 1 - 33;
|
||||||
|
|
||||||
|
pHead->Crc = 0;
|
||||||
|
pHead->Crc = VentoyCrc32(pHead, pHead->Length);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
CHAR GetFirstUnusedDriveLetter(void)
|
CHAR GetFirstUnusedDriveLetter(void)
|
||||||
{
|
{
|
||||||
CHAR Letter = 'D';
|
CHAR Letter = 'D';
|
||||||
|
@ -70,7 +70,7 @@ int ParseCmdLineOption(LPSTR lpCmdLine)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR)
|
static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR, UINT64 *Part2StartSector)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
BOOL bRet;
|
BOOL bRet;
|
||||||
@ -80,6 +80,7 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR)
|
|||||||
UINT32 PartStartSector;
|
UINT32 PartStartSector;
|
||||||
UINT32 PartSectorCount;
|
UINT32 PartSectorCount;
|
||||||
CHAR PhyDrivePath[128];
|
CHAR PhyDrivePath[128];
|
||||||
|
VTOY_GPT_INFO *pGpt = NULL;
|
||||||
|
|
||||||
safe_sprintf(PhyDrivePath, "\\\\.\\PhysicalDrive%d", PhyDrive);
|
safe_sprintf(PhyDrivePath, "\\\\.\\PhysicalDrive%d", PhyDrive);
|
||||||
hDrive = CreateFileA(PhyDrivePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
|
hDrive = CreateFileA(PhyDrivePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
|
||||||
@ -91,21 +92,57 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);
|
bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);
|
||||||
CHECK_CLOSE_HANDLE(hDrive);
|
|
||||||
|
|
||||||
Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);
|
Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);
|
||||||
|
|
||||||
if ((!bRet) || (dwSize != sizeof(MBR)))
|
if ((!bRet) || (dwSize != sizeof(MBR)))
|
||||||
{
|
{
|
||||||
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MBR.Byte55 != 0x55 || MBR.ByteAA != 0xAA)
|
if (MBR.Byte55 != 0x55 || MBR.ByteAA != 0xAA)
|
||||||
{
|
{
|
||||||
Log("Byte55 ByteAA not match 0x%x 0x%x", MBR.Byte55, MBR.ByteAA);
|
Log("Byte55 ByteAA not match 0x%x 0x%x", MBR.Byte55, MBR.ByteAA);
|
||||||
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MBR.PartTbl[1].FsFlag == 0xEE)
|
||||||
|
{
|
||||||
|
pGpt = malloc(sizeof(VTOY_GPT_INFO));
|
||||||
|
if (!pGpt)
|
||||||
|
{
|
||||||
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
||||||
|
bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL);
|
||||||
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
|
if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO)))
|
||||||
|
{
|
||||||
|
Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(pGpt->Head.Signature, "EFI PART", 8))
|
||||||
|
{
|
||||||
|
Log("Invalid GPT signature");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(pGpt->PartTbl[1].Name, L"VTOYEFI", 7 * 2))
|
||||||
|
{
|
||||||
|
Log("Invalid ventoy efi part name");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Part2StartSector = pGpt->PartTbl[1].StartLBA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CHECK_CLOSE_HANDLE(hDrive);
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
Log("=========== Partition Table %d ============", i + 1);
|
Log("=========== Partition Table %d ============", i + 1);
|
||||||
@ -121,7 +158,6 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR)
|
|||||||
Log("PartTbl.EndCylinder = %u", MBR.PartTbl[i].EndCylinder);
|
Log("PartTbl.EndCylinder = %u", MBR.PartTbl[i].EndCylinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (MBR.PartTbl[0].StartSectorId != 2048)
|
if (MBR.PartTbl[0].StartSectorId != 2048)
|
||||||
{
|
{
|
||||||
Log("Part1 not match %u", MBR.PartTbl[0].StartSectorId);
|
Log("Part1 not match %u", MBR.PartTbl[0].StartSectorId);
|
||||||
@ -148,6 +184,9 @@ static BOOL IsVentoyPhyDrive(int PhyDrive, UINT64 SizeBytes, MBR_HEAD *pMBR)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*Part2StartSector = MBR.PartTbl[1].StartSectorId;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(pMBR, &MBR, sizeof(MBR_HEAD));
|
memcpy(pMBR, &MBR, sizeof(MBR_HEAD));
|
||||||
Log("PhysicalDrive%d is ventoy disk", PhyDrive);
|
Log("PhysicalDrive%d is ventoy disk", PhyDrive);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -161,6 +200,7 @@ static int FilterPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount)
|
|||||||
int Letter = 'A';
|
int Letter = 'A';
|
||||||
int Id = 0;
|
int Id = 0;
|
||||||
int LetterCount = 0;
|
int LetterCount = 0;
|
||||||
|
UINT64 Part2StartSector = 0;
|
||||||
PHY_DRIVE_INFO *CurDrive;
|
PHY_DRIVE_INFO *CurDrive;
|
||||||
MBR_HEAD MBR;
|
MBR_HEAD MBR;
|
||||||
int LogLetter[VENTOY_MAX_PHY_DRIVE];
|
int LogLetter[VENTOY_MAX_PHY_DRIVE];
|
||||||
@ -217,9 +257,10 @@ static int FilterPhysicalDrive(PHY_DRIVE_INFO *pDriveList, DWORD DriveCount)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsVentoyPhyDrive(CurDrive->PhyDrive, CurDrive->SizeInBytes, &MBR))
|
if (IsVentoyPhyDrive(CurDrive->PhyDrive, CurDrive->SizeInBytes, &MBR, &Part2StartSector))
|
||||||
{
|
{
|
||||||
GetVentoyVerInPhyDrive(CurDrive, &MBR, CurDrive->VentoyVersion, sizeof(CurDrive->VentoyVersion));
|
CurDrive->PartStyle = (MBR.PartTbl[0].FsFlag == 0xEE) ? 1 : 0;
|
||||||
|
GetVentoyVerInPhyDrive(CurDrive, Part2StartSector, CurDrive->VentoyVersion, sizeof(CurDrive->VentoyVersion));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +79,43 @@ typedef struct MBR_HEAD
|
|||||||
UINT8 Byte55;
|
UINT8 Byte55;
|
||||||
UINT8 ByteAA;
|
UINT8 ByteAA;
|
||||||
}MBR_HEAD;
|
}MBR_HEAD;
|
||||||
|
|
||||||
|
typedef struct VTOY_GPT_HDR
|
||||||
|
{
|
||||||
|
CHAR Signature[8]; /* EFI PART */
|
||||||
|
UINT8 Version[4];
|
||||||
|
UINT32 Length;
|
||||||
|
UINT32 Crc;
|
||||||
|
UINT8 Reserved1[4];
|
||||||
|
UINT64 EfiStartLBA;
|
||||||
|
UINT64 EfiBackupLBA;
|
||||||
|
UINT64 PartAreaStartLBA;
|
||||||
|
UINT64 PartAreaEndLBA;
|
||||||
|
GUID DiskGuid;
|
||||||
|
UINT64 PartTblStartLBA;
|
||||||
|
UINT32 PartTblTotNum;
|
||||||
|
UINT32 PartTblEntryLen;
|
||||||
|
UINT32 PartTblCrc;
|
||||||
|
UINT8 Reserved2[420];
|
||||||
|
}VTOY_GPT_HDR;
|
||||||
|
|
||||||
|
typedef struct VTOY_GPT_PART_TBL
|
||||||
|
{
|
||||||
|
GUID PartType;
|
||||||
|
GUID PartGuid;
|
||||||
|
UINT64 StartLBA;
|
||||||
|
UINT64 LastLBA;
|
||||||
|
UINT64 Attr;
|
||||||
|
UINT16 Name[36];
|
||||||
|
}VTOY_GPT_PART_TBL;
|
||||||
|
|
||||||
|
typedef struct VTOY_GPT_INFO
|
||||||
|
{
|
||||||
|
MBR_HEAD MBR;
|
||||||
|
VTOY_GPT_HDR Head;
|
||||||
|
VTOY_GPT_PART_TBL PartTbl[128];
|
||||||
|
}VTOY_GPT_INFO;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
#define VENTOY_MAX_PHY_DRIVE 128
|
#define VENTOY_MAX_PHY_DRIVE 128
|
||||||
@ -87,6 +124,7 @@ typedef struct PHY_DRIVE_INFO
|
|||||||
{
|
{
|
||||||
int Id;
|
int Id;
|
||||||
int PhyDrive;
|
int PhyDrive;
|
||||||
|
int PartStyle;//0:MBR 1:GPT
|
||||||
UINT64 SizeInBytes;
|
UINT64 SizeInBytes;
|
||||||
BYTE DeviceType;
|
BYTE DeviceType;
|
||||||
BOOL RemovableMedia;
|
BOOL RemovableMedia;
|
||||||
@ -138,19 +176,21 @@ const CHAR * GetBusTypeString(STORAGE_BUS_TYPE Type);
|
|||||||
int VentoyGetLocalBootImg(MBR_HEAD *pMBR);
|
int VentoyGetLocalBootImg(MBR_HEAD *pMBR);
|
||||||
int GetHumanReadableGBSize(UINT64 SizeBytes);
|
int GetHumanReadableGBSize(UINT64 SizeBytes);
|
||||||
void TrimString(CHAR *String);
|
void TrimString(CHAR *String);
|
||||||
int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR);
|
int VentoyFillMBR(UINT64 DiskSizeBytes, MBR_HEAD *pMBR, int PartStyle);
|
||||||
|
int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo);
|
||||||
BOOL IsVentoyLogicalDrive(CHAR DriveLetter);
|
BOOL IsVentoyLogicalDrive(CHAR DriveLetter);
|
||||||
int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue);
|
int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue);
|
||||||
int GetPhysicalDriveCount(void);
|
int GetPhysicalDriveCount(void);
|
||||||
int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);
|
int GetAllPhysicalDriveInfo(PHY_DRIVE_INFO *pDriveList, DWORD *pDriveCount);
|
||||||
int GetPhyDriveByLogicalDrive(int DriveLetter);
|
int GetPhyDriveByLogicalDrive(int DriveLetter);
|
||||||
int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, MBR_HEAD *pMBR, CHAR *VerBuf, size_t BufLen);
|
int GetVentoyVerInPhyDrive(const PHY_DRIVE_INFO *pDriveInfo, UINT64 Part2StartSector, CHAR *VerBuf, size_t BufLen);
|
||||||
int Ventoy2DiskInit(void);
|
int Ventoy2DiskInit(void);
|
||||||
int Ventoy2DiskDestroy(void);
|
int Ventoy2DiskDestroy(void);
|
||||||
PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id);
|
PHY_DRIVE_INFO * GetPhyDriveInfoById(int Id);
|
||||||
int ParseCmdLineOption(LPSTR lpCmdLine);
|
int ParseCmdLineOption(LPSTR lpCmdLine);
|
||||||
int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);
|
int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle);
|
||||||
int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);
|
int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive);
|
||||||
|
int VentoyFillBackupGptHead(VTOY_GPT_INFO *pInfo, VTOY_GPT_HDR *pHead);
|
||||||
void SetProgressBarPos(int Pos);
|
void SetProgressBarPos(int Pos);
|
||||||
int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen);
|
int ReadWholeFileToBuf(const CHAR *FileName, int ExtLen, void **Bufer, int *BufLen);
|
||||||
int INIT unxz(unsigned char *in, int in_size,
|
int INIT unxz(unsigned char *in, int in_size,
|
||||||
@ -164,6 +204,7 @@ int GetReservedSpaceInMB(void);
|
|||||||
int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);
|
int FindProcessOccupyDisk(HANDLE hDrive, PHY_DRIVE_INFO *pPhyDrive);
|
||||||
int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);
|
int VentoyFillLocation(UINT64 DiskSizeInBytes, UINT32 StartSectorId, UINT32 SectorCount, PART_TABLE *Table);
|
||||||
int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);
|
int ClearVentoyFromPhyDrive(HWND hWnd, PHY_DRIVE_INFO *pPhyDrive, char *pDrvLetter);
|
||||||
|
UINT32 VentoyCrc32(void *Buffer, UINT32 Length);
|
||||||
|
|
||||||
#define SET_FILE_POS(pos) \
|
#define SET_FILE_POS(pos) \
|
||||||
liCurrentPosition.QuadPart = pos; \
|
liCurrentPosition.QuadPart = pos; \
|
||||||
|
Binary file not shown.
@ -91,6 +91,7 @@
|
|||||||
</Manifest>
|
</Manifest>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="crc32.c" />
|
||||||
<ClCompile Include="fat_io_lib\fat_access.c" />
|
<ClCompile Include="fat_io_lib\fat_access.c" />
|
||||||
<ClCompile Include="fat_io_lib\fat_cache.c" />
|
<ClCompile Include="fat_io_lib\fat_cache.c" />
|
||||||
<ClCompile Include="fat_io_lib\fat_filelib.c" />
|
<ClCompile Include="fat_io_lib\fat_filelib.c" />
|
||||||
|
@ -75,6 +75,9 @@
|
|||||||
<ClCompile Include="process.c">
|
<ClCompile Include="process.c">
|
||||||
<Filter>源文件</Filter>
|
<Filter>源文件</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="crc32.c">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Ventoy2Disk.h">
|
<ClInclude Include="Ventoy2Disk.h">
|
||||||
|
Binary file not shown.
275
Ventoy2Disk/Ventoy2Disk/crc32.c
Normal file
275
Ventoy2Disk/Ventoy2Disk/crc32.c
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
static UINT32 g_CrcTable[256] = {
|
||||||
|
0x00000000,
|
||||||
|
0x77073096,
|
||||||
|
0xEE0E612C,
|
||||||
|
0x990951BA,
|
||||||
|
0x076DC419,
|
||||||
|
0x706AF48F,
|
||||||
|
0xE963A535,
|
||||||
|
0x9E6495A3,
|
||||||
|
0x0EDB8832,
|
||||||
|
0x79DCB8A4,
|
||||||
|
0xE0D5E91E,
|
||||||
|
0x97D2D988,
|
||||||
|
0x09B64C2B,
|
||||||
|
0x7EB17CBD,
|
||||||
|
0xE7B82D07,
|
||||||
|
0x90BF1D91,
|
||||||
|
0x1DB71064,
|
||||||
|
0x6AB020F2,
|
||||||
|
0xF3B97148,
|
||||||
|
0x84BE41DE,
|
||||||
|
0x1ADAD47D,
|
||||||
|
0x6DDDE4EB,
|
||||||
|
0xF4D4B551,
|
||||||
|
0x83D385C7,
|
||||||
|
0x136C9856,
|
||||||
|
0x646BA8C0,
|
||||||
|
0xFD62F97A,
|
||||||
|
0x8A65C9EC,
|
||||||
|
0x14015C4F,
|
||||||
|
0x63066CD9,
|
||||||
|
0xFA0F3D63,
|
||||||
|
0x8D080DF5,
|
||||||
|
0x3B6E20C8,
|
||||||
|
0x4C69105E,
|
||||||
|
0xD56041E4,
|
||||||
|
0xA2677172,
|
||||||
|
0x3C03E4D1,
|
||||||
|
0x4B04D447,
|
||||||
|
0xD20D85FD,
|
||||||
|
0xA50AB56B,
|
||||||
|
0x35B5A8FA,
|
||||||
|
0x42B2986C,
|
||||||
|
0xDBBBC9D6,
|
||||||
|
0xACBCF940,
|
||||||
|
0x32D86CE3,
|
||||||
|
0x45DF5C75,
|
||||||
|
0xDCD60DCF,
|
||||||
|
0xABD13D59,
|
||||||
|
0x26D930AC,
|
||||||
|
0x51DE003A,
|
||||||
|
0xC8D75180,
|
||||||
|
0xBFD06116,
|
||||||
|
0x21B4F4B5,
|
||||||
|
0x56B3C423,
|
||||||
|
0xCFBA9599,
|
||||||
|
0xB8BDA50F,
|
||||||
|
0x2802B89E,
|
||||||
|
0x5F058808,
|
||||||
|
0xC60CD9B2,
|
||||||
|
0xB10BE924,
|
||||||
|
0x2F6F7C87,
|
||||||
|
0x58684C11,
|
||||||
|
0xC1611DAB,
|
||||||
|
0xB6662D3D,
|
||||||
|
0x76DC4190,
|
||||||
|
0x01DB7106,
|
||||||
|
0x98D220BC,
|
||||||
|
0xEFD5102A,
|
||||||
|
0x71B18589,
|
||||||
|
0x06B6B51F,
|
||||||
|
0x9FBFE4A5,
|
||||||
|
0xE8B8D433,
|
||||||
|
0x7807C9A2,
|
||||||
|
0x0F00F934,
|
||||||
|
0x9609A88E,
|
||||||
|
0xE10E9818,
|
||||||
|
0x7F6A0DBB,
|
||||||
|
0x086D3D2D,
|
||||||
|
0x91646C97,
|
||||||
|
0xE6635C01,
|
||||||
|
0x6B6B51F4,
|
||||||
|
0x1C6C6162,
|
||||||
|
0x856530D8,
|
||||||
|
0xF262004E,
|
||||||
|
0x6C0695ED,
|
||||||
|
0x1B01A57B,
|
||||||
|
0x8208F4C1,
|
||||||
|
0xF50FC457,
|
||||||
|
0x65B0D9C6,
|
||||||
|
0x12B7E950,
|
||||||
|
0x8BBEB8EA,
|
||||||
|
0xFCB9887C,
|
||||||
|
0x62DD1DDF,
|
||||||
|
0x15DA2D49,
|
||||||
|
0x8CD37CF3,
|
||||||
|
0xFBD44C65,
|
||||||
|
0x4DB26158,
|
||||||
|
0x3AB551CE,
|
||||||
|
0xA3BC0074,
|
||||||
|
0xD4BB30E2,
|
||||||
|
0x4ADFA541,
|
||||||
|
0x3DD895D7,
|
||||||
|
0xA4D1C46D,
|
||||||
|
0xD3D6F4FB,
|
||||||
|
0x4369E96A,
|
||||||
|
0x346ED9FC,
|
||||||
|
0xAD678846,
|
||||||
|
0xDA60B8D0,
|
||||||
|
0x44042D73,
|
||||||
|
0x33031DE5,
|
||||||
|
0xAA0A4C5F,
|
||||||
|
0xDD0D7CC9,
|
||||||
|
0x5005713C,
|
||||||
|
0x270241AA,
|
||||||
|
0xBE0B1010,
|
||||||
|
0xC90C2086,
|
||||||
|
0x5768B525,
|
||||||
|
0x206F85B3,
|
||||||
|
0xB966D409,
|
||||||
|
0xCE61E49F,
|
||||||
|
0x5EDEF90E,
|
||||||
|
0x29D9C998,
|
||||||
|
0xB0D09822,
|
||||||
|
0xC7D7A8B4,
|
||||||
|
0x59B33D17,
|
||||||
|
0x2EB40D81,
|
||||||
|
0xB7BD5C3B,
|
||||||
|
0xC0BA6CAD,
|
||||||
|
0xEDB88320,
|
||||||
|
0x9ABFB3B6,
|
||||||
|
0x03B6E20C,
|
||||||
|
0x74B1D29A,
|
||||||
|
0xEAD54739,
|
||||||
|
0x9DD277AF,
|
||||||
|
0x04DB2615,
|
||||||
|
0x73DC1683,
|
||||||
|
0xE3630B12,
|
||||||
|
0x94643B84,
|
||||||
|
0x0D6D6A3E,
|
||||||
|
0x7A6A5AA8,
|
||||||
|
0xE40ECF0B,
|
||||||
|
0x9309FF9D,
|
||||||
|
0x0A00AE27,
|
||||||
|
0x7D079EB1,
|
||||||
|
0xF00F9344,
|
||||||
|
0x8708A3D2,
|
||||||
|
0x1E01F268,
|
||||||
|
0x6906C2FE,
|
||||||
|
0xF762575D,
|
||||||
|
0x806567CB,
|
||||||
|
0x196C3671,
|
||||||
|
0x6E6B06E7,
|
||||||
|
0xFED41B76,
|
||||||
|
0x89D32BE0,
|
||||||
|
0x10DA7A5A,
|
||||||
|
0x67DD4ACC,
|
||||||
|
0xF9B9DF6F,
|
||||||
|
0x8EBEEFF9,
|
||||||
|
0x17B7BE43,
|
||||||
|
0x60B08ED5,
|
||||||
|
0xD6D6A3E8,
|
||||||
|
0xA1D1937E,
|
||||||
|
0x38D8C2C4,
|
||||||
|
0x4FDFF252,
|
||||||
|
0xD1BB67F1,
|
||||||
|
0xA6BC5767,
|
||||||
|
0x3FB506DD,
|
||||||
|
0x48B2364B,
|
||||||
|
0xD80D2BDA,
|
||||||
|
0xAF0A1B4C,
|
||||||
|
0x36034AF6,
|
||||||
|
0x41047A60,
|
||||||
|
0xDF60EFC3,
|
||||||
|
0xA867DF55,
|
||||||
|
0x316E8EEF,
|
||||||
|
0x4669BE79,
|
||||||
|
0xCB61B38C,
|
||||||
|
0xBC66831A,
|
||||||
|
0x256FD2A0,
|
||||||
|
0x5268E236,
|
||||||
|
0xCC0C7795,
|
||||||
|
0xBB0B4703,
|
||||||
|
0x220216B9,
|
||||||
|
0x5505262F,
|
||||||
|
0xC5BA3BBE,
|
||||||
|
0xB2BD0B28,
|
||||||
|
0x2BB45A92,
|
||||||
|
0x5CB36A04,
|
||||||
|
0xC2D7FFA7,
|
||||||
|
0xB5D0CF31,
|
||||||
|
0x2CD99E8B,
|
||||||
|
0x5BDEAE1D,
|
||||||
|
0x9B64C2B0,
|
||||||
|
0xEC63F226,
|
||||||
|
0x756AA39C,
|
||||||
|
0x026D930A,
|
||||||
|
0x9C0906A9,
|
||||||
|
0xEB0E363F,
|
||||||
|
0x72076785,
|
||||||
|
0x05005713,
|
||||||
|
0x95BF4A82,
|
||||||
|
0xE2B87A14,
|
||||||
|
0x7BB12BAE,
|
||||||
|
0x0CB61B38,
|
||||||
|
0x92D28E9B,
|
||||||
|
0xE5D5BE0D,
|
||||||
|
0x7CDCEFB7,
|
||||||
|
0x0BDBDF21,
|
||||||
|
0x86D3D2D4,
|
||||||
|
0xF1D4E242,
|
||||||
|
0x68DDB3F8,
|
||||||
|
0x1FDA836E,
|
||||||
|
0x81BE16CD,
|
||||||
|
0xF6B9265B,
|
||||||
|
0x6FB077E1,
|
||||||
|
0x18B74777,
|
||||||
|
0x88085AE6,
|
||||||
|
0xFF0F6A70,
|
||||||
|
0x66063BCA,
|
||||||
|
0x11010B5C,
|
||||||
|
0x8F659EFF,
|
||||||
|
0xF862AE69,
|
||||||
|
0x616BFFD3,
|
||||||
|
0x166CCF45,
|
||||||
|
0xA00AE278,
|
||||||
|
0xD70DD2EE,
|
||||||
|
0x4E048354,
|
||||||
|
0x3903B3C2,
|
||||||
|
0xA7672661,
|
||||||
|
0xD06016F7,
|
||||||
|
0x4969474D,
|
||||||
|
0x3E6E77DB,
|
||||||
|
0xAED16A4A,
|
||||||
|
0xD9D65ADC,
|
||||||
|
0x40DF0B66,
|
||||||
|
0x37D83BF0,
|
||||||
|
0xA9BCAE53,
|
||||||
|
0xDEBB9EC5,
|
||||||
|
0x47B2CF7F,
|
||||||
|
0x30B5FFE9,
|
||||||
|
0xBDBDF21C,
|
||||||
|
0xCABAC28A,
|
||||||
|
0x53B39330,
|
||||||
|
0x24B4A3A6,
|
||||||
|
0xBAD03605,
|
||||||
|
0xCDD70693,
|
||||||
|
0x54DE5729,
|
||||||
|
0x23D967BF,
|
||||||
|
0xB3667A2E,
|
||||||
|
0xC4614AB8,
|
||||||
|
0x5D681B02,
|
||||||
|
0x2A6F2B94,
|
||||||
|
0xB40BBE37,
|
||||||
|
0xC30C8EA1,
|
||||||
|
0x5A05DF1B,
|
||||||
|
0x2D02EF8D
|
||||||
|
};
|
||||||
|
|
||||||
|
UINT32 VentoyCrc32(void *Buffer, UINT32 Length)
|
||||||
|
{
|
||||||
|
UINT32 Index;
|
||||||
|
UINT32 Crc;
|
||||||
|
UINT8 *Byte = Buffer;
|
||||||
|
|
||||||
|
Crc = 0xffffffff;
|
||||||
|
for (Index = 0; Index < Length; Index++, Byte++)
|
||||||
|
{
|
||||||
|
Crc = (Crc >> 8) ^ g_CrcTable[(UINT8)Crc ^ *Byte];
|
||||||
|
}
|
||||||
|
|
||||||
|
return Crc ^ 0xffffffff;
|
||||||
|
}
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user