mirror of https://github.com/ventoy/Ventoy.git
update
This commit is contained in:
parent
b32cf97f1f
commit
4fda20d844
|
@ -12,7 +12,7 @@ make install
|
||||||
PATH=$PATH:$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/
|
PATH=$PATH:$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/
|
||||||
|
|
||||||
net_modules_legacy="net tftp http"
|
net_modules_legacy="net tftp http"
|
||||||
all_modules_legacy="date drivemap blocklist ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu"
|
all_modules_legacy="date drivemap blocklist vga_text ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
net_modules_uefi="efinet net tftp http"
|
net_modules_uefi="efinet net tftp http"
|
||||||
all_modules_uefi="blocklist ventoy test search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu"
|
all_modules_uefi="blocklist ventoy test search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu"
|
||||||
|
|
Binary file not shown.
|
@ -23,6 +23,8 @@ sh buildlib.sh
|
||||||
cd $VTOY_PATH/vtoyfat
|
cd $VTOY_PATH/vtoyfat
|
||||||
sh build.sh || exit 1
|
sh build.sh || exit 1
|
||||||
|
|
||||||
|
cd $VTOY_PATH/vtoygpt
|
||||||
|
sh build.sh || exit 1
|
||||||
|
|
||||||
cd $VTOY_PATH/ExFAT
|
cd $VTOY_PATH/ExFAT
|
||||||
sh buidlibfuse.sh || exit 1
|
sh buidlibfuse.sh || exit 1
|
||||||
|
|
|
@ -30,6 +30,29 @@ function ventoy_debug_pause {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ventoy_cli_console {
|
||||||
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
|
terminal_output vga_text
|
||||||
|
else
|
||||||
|
if [ "$vtoy_display_mode" != "CLI" ]; then
|
||||||
|
terminal_output console
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function ventoy_gui_console {
|
||||||
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
|
if [ "$vtoy_display_mode" = "CLI" ]; then
|
||||||
|
terminal_output console
|
||||||
|
else
|
||||||
|
terminal_output gfxterm
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$vtoy_display_mode" != "CLI" ]; then
|
||||||
|
terminal_output gfxterm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function ventoy_power {
|
function ventoy_power {
|
||||||
configfile $prefix/power.cfg
|
configfile $prefix/power.cfg
|
||||||
|
@ -186,7 +209,7 @@ function uefi_windows_menu_func {
|
||||||
ventoy_debug_pause
|
ventoy_debug_pause
|
||||||
|
|
||||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
boot
|
boot
|
||||||
else
|
else
|
||||||
|
@ -262,7 +285,7 @@ function uefi_linux_menu_func {
|
||||||
vt_linux_chain_data ${1}${chosen_path}
|
vt_linux_chain_data ${1}${chosen_path}
|
||||||
|
|
||||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
boot
|
boot
|
||||||
else
|
else
|
||||||
|
@ -327,7 +350,7 @@ function uefi_iso_menu_func {
|
||||||
uefi_linux_menu_func $1 ${chosen_path}
|
uefi_linux_menu_func $1 ${chosen_path}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
}
|
}
|
||||||
|
|
||||||
function uefi_iso_memdisk {
|
function uefi_iso_memdisk {
|
||||||
|
@ -336,11 +359,11 @@ function uefi_iso_memdisk {
|
||||||
echo 'Loading ISO file to memory ...'
|
echo 'Loading ISO file to memory ...'
|
||||||
vt_load_iso_to_mem ${1}${chosen_path} vtoy_iso_buf
|
vt_load_iso_to_mem ${1}${chosen_path} vtoy_iso_buf
|
||||||
|
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
|
||||||
boot
|
boot
|
||||||
|
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -527,9 +550,9 @@ function wim_common_menuentry {
|
||||||
if [ "$grub_platform" = "pc" ]; then
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
else
|
else
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
fi
|
fi
|
||||||
boot
|
boot
|
||||||
else
|
else
|
||||||
|
@ -545,10 +568,10 @@ function wim_unsupport_menuentry {
|
||||||
function efi_common_menuentry {
|
function efi_common_menuentry {
|
||||||
vt_chosen_img_path chosen_path
|
vt_chosen_img_path chosen_path
|
||||||
|
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${iso_path}${chosen_path}
|
chainloader ${iso_path}${chosen_path}
|
||||||
boot
|
boot
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
}
|
}
|
||||||
|
|
||||||
function efi_unsupport_menuentry {
|
function efi_unsupport_menuentry {
|
||||||
|
|
|
@ -327,6 +327,14 @@ else
|
||||||
SHORT_PART2=${PART2#/dev/}
|
SHORT_PART2=${PART2#/dev/}
|
||||||
part2_start=$(cat /sys/class/block/$SHORT_PART2/start)
|
part2_start=$(cat /sys/class/block/$SHORT_PART2/start)
|
||||||
|
|
||||||
|
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||||
|
|
||||||
|
if [ "$PART1_TYPE" = "EE" ]; then
|
||||||
|
vtdebug "This is GPT partition style ..."
|
||||||
|
./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
|
||||||
|
vtdebug "This is MBR partition style ..."
|
||||||
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
|
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
|
||||||
|
|
||||||
PART1_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=446 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
PART1_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=446 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||||
|
@ -338,10 +346,8 @@ else
|
||||||
echo -en '\x80' | dd of=$DISK conv=fsync bs=1 count=1 seek=446 status=none
|
echo -en '\x80' | dd of=$DISK conv=fsync bs=1 count=1 seek=446 status=none
|
||||||
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
|
||||||
|
fi
|
||||||
|
|
||||||
./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
|
||||||
|
|
||||||
|
|
|
@ -345,13 +345,21 @@ format_ventoy_disk_gpt() {
|
||||||
unit s \
|
unit s \
|
||||||
mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
|
mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
|
||||||
mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
|
mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
|
||||||
set 2 boot on \
|
set 2 msftdata on \
|
||||||
set 2 esp on \
|
|
||||||
set 2 hidden on \
|
set 2 hidden on \
|
||||||
quit
|
quit
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
||||||
|
if ventoy_is_linux64; then
|
||||||
|
vtoygpt=./tool/vtoygpt_64
|
||||||
|
else
|
||||||
|
vtoygpt=./tool/vtoygpt_32
|
||||||
|
fi
|
||||||
|
|
||||||
|
$vtoygpt -f $DISK
|
||||||
|
sync
|
||||||
|
|
||||||
udevadm trigger >/dev/null 2>&1
|
udevadm trigger >/dev/null 2>&1
|
||||||
partprobe >/dev/null 2>&1
|
partprobe >/dev/null 2>&1
|
||||||
sleep 3
|
sleep 3
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -934,6 +934,7 @@ int VentoyProcSecureBoot(BOOL SecureBoot)
|
||||||
fl_remove("/EFI/BOOT/grubx64.efi");
|
fl_remove("/EFI/BOOT/grubx64.efi");
|
||||||
fl_remove("/EFI/BOOT/grubx64_real.efi");
|
fl_remove("/EFI/BOOT/grubx64_real.efi");
|
||||||
fl_remove("/EFI/BOOT/MokManager.efi");
|
fl_remove("/EFI/BOOT/MokManager.efi");
|
||||||
|
fl_remove("/ENROLL_THIS_KEY_IN_MOKMANAGER.cer");
|
||||||
|
|
||||||
file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb");
|
file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb");
|
||||||
Log("Open bootx64 efi file %p ", file);
|
Log("Open bootx64 efi file %p ", file);
|
||||||
|
@ -1551,6 +1552,12 @@ int InstallVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive, int PartStyle)
|
||||||
|
|
||||||
PROGRESS_BAR_SET_POS(PT_FORMAT_PART1);
|
PROGRESS_BAR_SET_POS(PT_FORMAT_PART1);
|
||||||
|
|
||||||
|
if (PartStyle == 1 && pPhyDrive->PartStyle == 0)
|
||||||
|
{
|
||||||
|
Log("Wait for format part1 ...");
|
||||||
|
Sleep(1000 * 5);
|
||||||
|
}
|
||||||
|
|
||||||
Log("Formatting part1 exFAT ...");
|
Log("Formatting part1 exFAT ...");
|
||||||
if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))
|
if (0 != FormatPart1exFAT(pPhyDrive->SizeInBytes))
|
||||||
{
|
{
|
||||||
|
@ -1734,6 +1741,9 @@ int UpdateVentoy2PhyDrive(PHY_DRIVE_INFO *pPhyDrive)
|
||||||
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);
|
||||||
ReadFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL);
|
ReadFile(hDrive, pGptInfo, sizeof(VTOY_GPT_INFO), &dwSize, NULL);
|
||||||
|
|
||||||
|
//MBR will be used to compare with local boot image
|
||||||
|
memcpy(&MBR, &pGptInfo->MBR, sizeof(MBR_HEAD));
|
||||||
|
|
||||||
StartSector = pGptInfo->PartTbl[1].StartLBA;
|
StartSector = pGptInfo->PartTbl[1].StartLBA;
|
||||||
Log("GPT StartSector in PartTbl:%llu", (ULONGLONG)StartSector);
|
Log("GPT StartSector in PartTbl:%llu", (ULONGLONG)StartSector);
|
||||||
|
|
||||||
|
|
|
@ -549,7 +549,7 @@ int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo)
|
||||||
VTOY_GPT_PART_TBL *Table = pInfo->PartTbl;
|
VTOY_GPT_PART_TBL *Table = pInfo->PartTbl;
|
||||||
static GUID WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } };
|
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 } };
|
static GUID EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } };
|
||||||
//static GUID BiosGrubPartType = { 0x21686148, 0x6449, 0x6e6f, { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } };
|
static GUID BiosGrubPartType = { 0x21686148, 0x6449, 0x6e6f, { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } };
|
||||||
|
|
||||||
VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR);
|
VentoyFillProtectMBR(DiskSizeBytes, &pInfo->MBR);
|
||||||
|
|
||||||
|
@ -582,11 +582,13 @@ int VentoyFillGpt(UINT64 DiskSizeBytes, VTOY_GPT_INFO *pInfo)
|
||||||
Table[0].Attr = 0;
|
Table[0].Attr = 0;
|
||||||
memcpy(Table[0].Name, L"Ventoy", 6 * 2);
|
memcpy(Table[0].Name, L"Ventoy", 6 * 2);
|
||||||
|
|
||||||
memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID));
|
// to fix windows issue
|
||||||
|
//memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID));
|
||||||
|
memcpy(&(Table[1].PartType), &WindowsDataPartType, sizeof(GUID));
|
||||||
CoCreateGuid(&(Table[1].PartGuid));
|
CoCreateGuid(&(Table[1].PartGuid));
|
||||||
Table[1].StartLBA = Table[0].LastLBA + 1;
|
Table[1].StartLBA = Table[0].LastLBA + 1;
|
||||||
Table[1].LastLBA = Table[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1;
|
Table[1].LastLBA = Table[1].StartLBA + VENTOY_EFI_PART_SIZE / 512 - 1;
|
||||||
Table[1].Attr = 1;
|
Table[1].Attr = 0xC000000000000001ULL;
|
||||||
memcpy(Table[1].Name, L"VTOYEFI", 7 * 2);
|
memcpy(Table[1].Name, L"VTOYEFI", 7 * 2);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
rm -f vtoytool/00/*
|
||||||
|
|
||||||
|
/opt/diet64/bin/diet -Os gcc -D_FILE_OFFSET_BITS=64 vtoygpt.c crc32.c -o vtoygpt_64
|
||||||
|
/opt/diet32/bin/diet -Os gcc -D_FILE_OFFSET_BITS=64 -m32 vtoygpt.c crc32.c -o vtoygpt_32
|
||||||
|
|
||||||
|
#gcc -D_FILE_OFFSET_BITS=64 -static -Wall vtoygpt.c -o vtoytool_64
|
||||||
|
#gcc -D_FILE_OFFSET_BITS=64 -Wall -m32 vtoygpt.c -o vtoytool_32
|
||||||
|
|
||||||
|
if [ -e vtoygpt_64 ] && [ -e vtoygpt_32 ]; then
|
||||||
|
echo -e '\n############### SUCCESS ###############\n'
|
||||||
|
mv vtoygpt_64 ../INSTALL/tool/
|
||||||
|
mv vtoygpt_32 ../INSTALL/tool/
|
||||||
|
else
|
||||||
|
echo -e '\n############### FAILED ################\n'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
|
@ -0,0 +1,315 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* vtoygpt.c ---- ventoy gpt util
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
#define VOID void
|
||||||
|
#define CHAR char
|
||||||
|
#define UINT64 unsigned long long
|
||||||
|
#define UINT32 unsigned int
|
||||||
|
#define UINT16 unsigned short
|
||||||
|
#define CHAR16 unsigned short
|
||||||
|
#define UINT8 unsigned char
|
||||||
|
|
||||||
|
UINT32 g_crc_table[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 VtoyCrc32(VOID *Buffer, UINT32 Length)
|
||||||
|
{
|
||||||
|
UINT32 i;
|
||||||
|
UINT8 *Ptr = Buffer;
|
||||||
|
UINT32 Crc = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
for (i = 0; i < Length; i++, Ptr++)
|
||||||
|
{
|
||||||
|
Crc = (Crc >> 8) ^ g_crc_table[(UINT8) Crc ^ *Ptr];
|
||||||
|
}
|
||||||
|
|
||||||
|
return Crc ^ 0xffffffff;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,320 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* vtoygpt.c ---- ventoy gpt util
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020, longpanda <admin@ventoy.net>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
#define VOID void
|
||||||
|
#define CHAR char
|
||||||
|
#define UINT64 unsigned long long
|
||||||
|
#define UINT32 unsigned int
|
||||||
|
#define UINT16 unsigned short
|
||||||
|
#define CHAR16 unsigned short
|
||||||
|
#define UINT8 unsigned char
|
||||||
|
|
||||||
|
UINT32 VtoyCrc32(VOID *Buffer, UINT32 Length);
|
||||||
|
|
||||||
|
#define COMPILE_ASSERT(expr) extern char __compile_assert[(expr) ? 1 : -1]
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
typedef struct PART_TABLE
|
||||||
|
{
|
||||||
|
UINT8 Active;
|
||||||
|
|
||||||
|
UINT8 StartHead;
|
||||||
|
UINT16 StartSector : 6;
|
||||||
|
UINT16 StartCylinder : 10;
|
||||||
|
|
||||||
|
UINT8 FsFlag;
|
||||||
|
|
||||||
|
UINT8 EndHead;
|
||||||
|
UINT16 EndSector : 6;
|
||||||
|
UINT16 EndCylinder : 10;
|
||||||
|
|
||||||
|
UINT32 StartSectorId;
|
||||||
|
UINT32 SectorCount;
|
||||||
|
}PART_TABLE;
|
||||||
|
|
||||||
|
typedef struct MBR_HEAD
|
||||||
|
{
|
||||||
|
UINT8 BootCode[446];
|
||||||
|
PART_TABLE PartTbl[4];
|
||||||
|
UINT8 Byte55;
|
||||||
|
UINT8 ByteAA;
|
||||||
|
}MBR_HEAD;
|
||||||
|
|
||||||
|
typedef struct GUID
|
||||||
|
{
|
||||||
|
UINT32 data1;
|
||||||
|
UINT16 data2;
|
||||||
|
UINT16 data3;
|
||||||
|
UINT8 data4[8];
|
||||||
|
}GUID;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
COMPILE_ASSERT(sizeof(VTOY_GPT_HDR) == 512);
|
||||||
|
|
||||||
|
typedef struct VTOY_GPT_PART_TBL
|
||||||
|
{
|
||||||
|
GUID PartType;
|
||||||
|
GUID PartGuid;
|
||||||
|
UINT64 StartLBA;
|
||||||
|
UINT64 LastLBA;
|
||||||
|
UINT64 Attr;
|
||||||
|
CHAR16 Name[36];
|
||||||
|
}VTOY_GPT_PART_TBL;
|
||||||
|
COMPILE_ASSERT(sizeof(VTOY_GPT_PART_TBL) == 128);
|
||||||
|
|
||||||
|
typedef struct VTOY_GPT_INFO
|
||||||
|
{
|
||||||
|
MBR_HEAD MBR;
|
||||||
|
VTOY_GPT_HDR Head;
|
||||||
|
VTOY_GPT_PART_TBL PartTbl[128];
|
||||||
|
}VTOY_GPT_INFO;
|
||||||
|
|
||||||
|
typedef struct VTOY_BK_GPT_INFO
|
||||||
|
{
|
||||||
|
VTOY_GPT_PART_TBL PartTbl[128];
|
||||||
|
VTOY_GPT_HDR Head;
|
||||||
|
}VTOY_BK_GPT_INFO;
|
||||||
|
|
||||||
|
COMPILE_ASSERT(sizeof(VTOY_GPT_INFO) == 512 * 34);
|
||||||
|
COMPILE_ASSERT(sizeof(VTOY_BK_GPT_INFO) == 512 * 33);
|
||||||
|
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
void DumpGuid(const char *prefix, GUID *guid)
|
||||||
|
{
|
||||||
|
printf("%s: %08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||||
|
prefix,
|
||||||
|
guid->data1, guid->data2, guid->data3,
|
||||||
|
guid->data4[0], guid->data4[1], guid->data4[2], guid->data4[3],
|
||||||
|
guid->data4[4], guid->data4[5], guid->data4[6], guid->data4[7]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DumpHead(VTOY_GPT_HDR *pHead)
|
||||||
|
{
|
||||||
|
UINT32 CrcRead;
|
||||||
|
UINT32 CrcCalc;
|
||||||
|
|
||||||
|
printf("Signature:<%s>\n", pHead->Signature);
|
||||||
|
printf("Version:<%02x %02x %02x %02x>\n", pHead->Version[0], pHead->Version[1], pHead->Version[2], pHead->Version[3]);
|
||||||
|
printf("Length:%u\n", pHead->Length);
|
||||||
|
printf("Crc:0x%08x\n", pHead->Crc);
|
||||||
|
printf("EfiStartLBA:%lu\n", pHead->EfiStartLBA);
|
||||||
|
printf("EfiBackupLBA:%lu\n", pHead->EfiBackupLBA);
|
||||||
|
printf("PartAreaStartLBA:%lu\n", pHead->PartAreaStartLBA);
|
||||||
|
printf("PartAreaEndLBA:%lu\n", pHead->PartAreaEndLBA);
|
||||||
|
DumpGuid("DiskGuid", &pHead->DiskGuid);
|
||||||
|
|
||||||
|
printf("PartTblStartLBA:%lu\n", pHead->PartTblStartLBA);
|
||||||
|
printf("PartTblTotNum:%u\n", pHead->PartTblTotNum);
|
||||||
|
printf("PartTblEntryLen:%u\n", pHead->PartTblEntryLen);
|
||||||
|
printf("PartTblCrc:0x%08x\n", pHead->PartTblCrc);
|
||||||
|
|
||||||
|
CrcRead = pHead->Crc;
|
||||||
|
pHead->Crc = 0;
|
||||||
|
CrcCalc = VtoyCrc32(pHead, pHead->Length);
|
||||||
|
|
||||||
|
if (CrcCalc != CrcRead)
|
||||||
|
{
|
||||||
|
printf("Head CRC Check Failed\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Head CRC Check SUCCESS [%x] [%x]\n", CrcCalc, CrcRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
CrcRead = pHead->PartTblCrc;
|
||||||
|
CrcCalc = VtoyCrc32(pHead + 1, pHead->PartTblEntryLen * pHead->PartTblTotNum);
|
||||||
|
if (CrcCalc != CrcRead)
|
||||||
|
{
|
||||||
|
printf("Part Table CRC Check Failed\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Part Table CRC Check SUCCESS [%x] [%x]\n", CrcCalc, CrcRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DumpPartTable(VTOY_GPT_PART_TBL *Tbl)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
DumpGuid("PartType", &Tbl->PartType);
|
||||||
|
DumpGuid("PartGuid", &Tbl->PartGuid);
|
||||||
|
printf("StartLBA:%lu\n", Tbl->StartLBA);
|
||||||
|
printf("LastLBA:%lu\n", Tbl->LastLBA);
|
||||||
|
printf("Attr:0x%lx\n", Tbl->Attr);
|
||||||
|
printf("Name:");
|
||||||
|
|
||||||
|
for (i = 0; i < 36 && Tbl->Name[i]; i++)
|
||||||
|
{
|
||||||
|
printf("%c", (CHAR)(Tbl->Name[i]));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void DumpMBR(MBR_HEAD *pMBR)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
printf("=========== Partition Table %d ============\n", i + 1);
|
||||||
|
printf("PartTbl.Active = 0x%x\n", pMBR->PartTbl[i].Active);
|
||||||
|
printf("PartTbl.FsFlag = 0x%x\n", pMBR->PartTbl[i].FsFlag);
|
||||||
|
printf("PartTbl.StartSectorId = %u\n", pMBR->PartTbl[i].StartSectorId);
|
||||||
|
printf("PartTbl.SectorCount = %u\n", pMBR->PartTbl[i].SectorCount);
|
||||||
|
printf("PartTbl.StartHead = %u\n", pMBR->PartTbl[i].StartHead);
|
||||||
|
printf("PartTbl.StartSector = %u\n", pMBR->PartTbl[i].StartSector);
|
||||||
|
printf("PartTbl.StartCylinder = %u\n", pMBR->PartTbl[i].StartCylinder);
|
||||||
|
printf("PartTbl.EndHead = %u\n", pMBR->PartTbl[i].EndHead);
|
||||||
|
printf("PartTbl.EndSector = %u\n", pMBR->PartTbl[i].EndSector);
|
||||||
|
printf("PartTbl.EndCylinder = %u\n", pMBR->PartTbl[i].EndCylinder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int DumpGptInfo(VTOY_GPT_INFO *pGptInfo)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
DumpMBR(&pGptInfo->MBR);
|
||||||
|
DumpHead(&pGptInfo->Head);
|
||||||
|
|
||||||
|
for (i = 0; i < 128; i++)
|
||||||
|
{
|
||||||
|
if (pGptInfo->PartTbl[i].StartLBA == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("=====Part %d=====\n", i);
|
||||||
|
DumpPartTable(pGptInfo->PartTbl + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define VENTOY_EFI_PART_ATTR 0xC000000000000001ULL
|
||||||
|
|
||||||
|
int main(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int fd;
|
||||||
|
UINT64 DiskSize;
|
||||||
|
CHAR16 *Name = NULL;
|
||||||
|
VTOY_GPT_INFO *pMainGptInfo = NULL;
|
||||||
|
VTOY_BK_GPT_INFO *pBackGptInfo = NULL;
|
||||||
|
|
||||||
|
if (argc != 3)
|
||||||
|
{
|
||||||
|
printf("usage: vtoygpt -f /dev/sdb\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = open(argv[2], O_RDWR);
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
printf("Failed to open %s\n", argv[2]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMainGptInfo = malloc(sizeof(VTOY_GPT_INFO));
|
||||||
|
pBackGptInfo = malloc(sizeof(VTOY_BK_GPT_INFO));
|
||||||
|
if (NULL == pMainGptInfo || NULL == pBackGptInfo)
|
||||||
|
{
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
read(fd, pMainGptInfo, sizeof(VTOY_GPT_INFO));
|
||||||
|
|
||||||
|
if (argv[1][0] == '-' && argv[1][1] == 'd')
|
||||||
|
{
|
||||||
|
DumpGptInfo(pMainGptInfo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DiskSize = lseek(fd, 0, SEEK_END);
|
||||||
|
lseek(fd, DiskSize - 33 * 512, SEEK_SET);
|
||||||
|
read(fd, pBackGptInfo, sizeof(VTOY_BK_GPT_INFO));
|
||||||
|
|
||||||
|
Name = pMainGptInfo->PartTbl[1].Name;
|
||||||
|
if (Name[0] == 'V' && Name[1] == 'T' && Name[2] == 'O' && Name[3] == 'Y')
|
||||||
|
{
|
||||||
|
pMainGptInfo->PartTbl[1].Attr = VENTOY_EFI_PART_ATTR;
|
||||||
|
pMainGptInfo->Head.PartTblCrc = VtoyCrc32(pMainGptInfo->PartTbl, sizeof(pMainGptInfo->PartTbl));
|
||||||
|
pMainGptInfo->Head.Crc = 0;
|
||||||
|
pMainGptInfo->Head.Crc = VtoyCrc32(&pMainGptInfo->Head, pMainGptInfo->Head.Length);
|
||||||
|
|
||||||
|
pBackGptInfo->PartTbl[1].Attr = VENTOY_EFI_PART_ATTR;
|
||||||
|
pBackGptInfo->Head.PartTblCrc = VtoyCrc32(pBackGptInfo->PartTbl, sizeof(pBackGptInfo->PartTbl));
|
||||||
|
pBackGptInfo->Head.Crc = 0;
|
||||||
|
pBackGptInfo->Head.Crc = VtoyCrc32(&pBackGptInfo->Head, pBackGptInfo->Head.Length);
|
||||||
|
|
||||||
|
lseek(fd, 512, SEEK_SET);
|
||||||
|
write(fd, (UINT8 *)pMainGptInfo + 512, sizeof(VTOY_GPT_INFO) - 512);
|
||||||
|
|
||||||
|
lseek(fd, DiskSize - 33 * 512, SEEK_SET);
|
||||||
|
write(fd, pBackGptInfo, sizeof(VTOY_BK_GPT_INFO));
|
||||||
|
|
||||||
|
fsync(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pMainGptInfo);
|
||||||
|
free(pBackGptInfo);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue