mirror of https://github.com/ventoy/Ventoy
update
parent
b32cf97f1f
commit
4fda20d844
Binary file not shown.
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