mirror of https://github.com/ventoy/Ventoy.git
Fix the issue that Linux WEB/GUI does not restore MBR when updating. (#1935)
This commit is contained in:
parent
7d90912a09
commit
553c853865
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -50,6 +50,7 @@ int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int
|
|||
const char * ventoy_get_local_version(void);
|
||||
int ventoy_fill_gpt(uint64_t size, uint64_t reserve, int align4k, VTOY_GPT_INFO *gpt);
|
||||
int ventoy_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR);
|
||||
int VentoyGetLocalBootImg(MBR_HEAD *pMBR);
|
||||
|
||||
#endif /* __VENTOY_UTIL_H__ */
|
||||
|
||||
|
|
|
@ -683,10 +683,45 @@ static int ventoy_write_gpt_part_table(int fd, uint64_t disksize, VTOY_GPT_INFO
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_mbr_need_update(ventoy_disk *disk, MBR_HEAD *mbr)
|
||||
{
|
||||
int update = 0;
|
||||
int partition_style;
|
||||
MBR_HEAD LocalMBR;
|
||||
|
||||
partition_style = disk->vtoydata.partition_style;
|
||||
memcpy(mbr, &(disk->vtoydata.gptinfo.MBR), 512);
|
||||
|
||||
VentoyGetLocalBootImg(&LocalMBR);
|
||||
memcpy(LocalMBR.BootCode + 0x180, mbr->BootCode + 0x180, 16);
|
||||
if (partition_style)
|
||||
{
|
||||
LocalMBR.BootCode[92] = 0x22;
|
||||
}
|
||||
|
||||
if (memcmp(LocalMBR.BootCode, mbr->BootCode, 440))
|
||||
{
|
||||
memcpy(mbr->BootCode, LocalMBR.BootCode, 440);
|
||||
vlog("MBR boot code different, must update it.\n");
|
||||
update = 1;
|
||||
}
|
||||
|
||||
if (partition_style == 0 && mbr->PartTbl[0].Active == 0)
|
||||
{
|
||||
mbr->PartTbl[0].Active = 0x80;
|
||||
mbr->PartTbl[1].Active = 0;
|
||||
mbr->PartTbl[2].Active = 0;
|
||||
mbr->PartTbl[3].Active = 0;
|
||||
vlog("set MBR partition 1 active flag enabled\n");
|
||||
update = 1;
|
||||
}
|
||||
|
||||
return update;
|
||||
}
|
||||
|
||||
static void * ventoy_update_thread(void *data)
|
||||
{
|
||||
int fd;
|
||||
int updateMBR;
|
||||
ssize_t len;
|
||||
off_t offset;
|
||||
MBR_HEAD MBR;
|
||||
|
@ -744,34 +779,17 @@ static void * ventoy_update_thread(void *data)
|
|||
len = write(fd, disk->vtoydata.rsvdata, sizeof(disk->vtoydata.rsvdata));
|
||||
vlog("Writing reserve data offset:%llu len:%llu ...\n", (_ull)offset, (_ull)len);
|
||||
|
||||
updateMBR = 0;
|
||||
memcpy(&MBR, &(disk->vtoydata.gptinfo.MBR), 512);
|
||||
|
||||
if (disk->vtoydata.partition_style == 0 && MBR.PartTbl[0].Active == 0)
|
||||
{
|
||||
MBR.PartTbl[0].Active = 0x80;
|
||||
MBR.PartTbl[1].Active = 0;
|
||||
MBR.PartTbl[2].Active = 0;
|
||||
MBR.PartTbl[3].Active = 0;
|
||||
updateMBR = 1;
|
||||
vlog("set MBR partition 1 active flag enabled\n");
|
||||
}
|
||||
|
||||
if (MBR.BootCode[0x190] != 0x56 || MBR.BootCode[0x191] != 0x54)
|
||||
{
|
||||
vlog("set VT data %02x %02x\n", MBR.BootCode[0x190], MBR.BootCode[0x191]);
|
||||
MBR.BootCode[0x190] = 0x56;
|
||||
MBR.BootCode[0x191] = 0x54;
|
||||
updateMBR = 1;
|
||||
}
|
||||
|
||||
if (updateMBR)
|
||||
if (ventoy_mbr_need_update(disk, &MBR))
|
||||
{
|
||||
offset = lseek(fd, 0, SEEK_SET);
|
||||
len = write(fd, &MBR, 512);
|
||||
vlog("update MBR offset:%llu len:%llu\n", (_ull)offset, (_ull)len);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
vlog("No need to update MBR\n");
|
||||
}
|
||||
|
||||
g_current_progress = PT_SYNC_DATA1;
|
||||
|
||||
vlog("fsync data1...\n");
|
||||
|
|
Loading…
Reference in New Issue