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/
|
||||
|
||||
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"
|
||||
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
|
||||
sh build.sh || exit 1
|
||||
|
||||
cd $VTOY_PATH/vtoygpt
|
||||
sh build.sh || exit 1
|
||||
|
||||
cd $VTOY_PATH/ExFAT
|
||||
sh buidlibfuse.sh || exit 1
|
||||
|
|
|
@ -30,6 +30,29 @@ function ventoy_debug_pause {
|
|||
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 {
|
||||
configfile $prefix/power.cfg
|
||||
|
@ -186,7 +209,7 @@ function uefi_windows_menu_func {
|
|||
ventoy_debug_pause
|
||||
|
||||
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}
|
||||
boot
|
||||
else
|
||||
|
@ -262,7 +285,7 @@ function uefi_linux_menu_func {
|
|||
vt_linux_chain_data ${1}${chosen_path}
|
||||
|
||||
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}
|
||||
boot
|
||||
else
|
||||
|
@ -327,7 +350,7 @@ function uefi_iso_menu_func {
|
|||
uefi_linux_menu_func $1 ${chosen_path}
|
||||
fi
|
||||
|
||||
terminal_output gfxterm
|
||||
ventoy_gui_console
|
||||
}
|
||||
|
||||
function uefi_iso_memdisk {
|
||||
|
@ -336,11 +359,11 @@ function uefi_iso_memdisk {
|
|||
echo 'Loading ISO file to memory ...'
|
||||
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}
|
||||
boot
|
||||
|
||||
terminal_output gfxterm
|
||||
ventoy_gui_console
|
||||
}
|
||||
|
||||
|
||||
|
@ -527,9 +550,9 @@ function wim_common_menuentry {
|
|||
if [ "$grub_platform" = "pc" ]; then
|
||||
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||
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}
|
||||
terminal_output gfxterm
|
||||
ventoy_gui_console
|
||||
fi
|
||||
boot
|
||||
else
|
||||
|
@ -545,10 +568,10 @@ function wim_unsupport_menuentry {
|
|||
function efi_common_menuentry {
|
||||
vt_chosen_img_path chosen_path
|
||||
|
||||
terminal_output console
|
||||
ventoy_cli_console
|
||||
chainloader ${iso_path}${chosen_path}
|
||||
boot
|
||||
terminal_output gfxterm
|
||||
ventoy_gui_console
|
||||
}
|
||||
|
||||
function efi_unsupport_menuentry {
|
||||
|
|
|
@ -327,22 +327,28 @@ else
|
|||
SHORT_PART2=${PART2#/dev/}
|
||||
part2_start=$(cat /sys/class/block/$SHORT_PART2/start)
|
||||
|
||||
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
|
||||
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 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"')
|
||||
PART2_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=462 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
|
||||
|
||||
vtdebug "PART1_ACTIVE=$PART1_ACTIVE PART2_ACTIVE=$PART2_ACTIVE"
|
||||
if [ "$PART1_ACTIVE" = "00" ] && [ "$PART2_ACTIVE" = "80" ]; then
|
||||
vtdebug "change 1st partition active, 2nd partition inactive ..."
|
||||
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
|
||||
PART1_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=446 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
PART2_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=462 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
|
||||
|
||||
vtdebug "PART1_ACTIVE=$PART1_ACTIVE PART2_ACTIVE=$PART2_ACTIVE"
|
||||
if [ "$PART1_ACTIVE" = "00" ] && [ "$PART2_ACTIVE" = "80" ]; then
|
||||
vtdebug "change 1st partition active, 2nd partition inactive ..."
|
||||
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
|
||||
fi
|
||||
./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
|
||||
fi
|
||||
|
||||
|
||||
./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
|
||||
|
||||
sync
|
||||
|
|
|
@ -345,11 +345,19 @@ format_ventoy_disk_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 msftdata on \
|
||||
set 2 hidden on \
|
||||
quit
|
||||
|
||||
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
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
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