return mount;
}
+static int ventoy_mount_path_escape(char *src, char *dst, int len)
+{
+ int i = 0;
+ int n = 0;
+
+ dst[len - 1] = 0;
+
+ for (i = 0; i < len - 1; i++)
+ {
+ if (src[i] == '\\' && src[i + 1] == '0' && src[i + 2] == '4' && src[i + 3] == '0')
+ {
+ dst[n++] = ' ';
+ i += 3;
+ }
+ else
+ {
+ dst[n++] = src[i];
+ }
+
+ if (src[i] == 0)
+ {
+ break;
+ }
+ }
+
+ return 0;
+}
+
int ventoy_try_umount_disk(const char *devpath)
{
int rc;
int len;
- char line[512];
+ char line[1024];
+ char mntpt[1024];
char *pos1 = NULL;
char *pos2 = NULL;
FILE *fp = NULL;
*pos2 = 0;
}
- rc = umount(pos1 + 1);
+ ventoy_mount_path_escape(pos1 + 1, mntpt, sizeof(mntpt));
+ rc = umount(mntpt);
if (rc)
{
- vdebug("umount %s %s [ failed ] error:%d\n", devpath, pos1 + 1, errno);
+ vdebug("umount <%s> <%s> [ failed ] error:%d\n", devpath, mntpt, errno);
}
else
{
- vdebug("umount %s %s [ success ]\n", devpath, pos1 + 1);
+ vdebug("umount <%s> <%s> [ success ]\n", devpath, mntpt);
}
}
}
return 0;
}
-
int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen)
{
int FileSize;
vdebug("Disk signature: 0x%08x\n", DiskSignature);
memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4);
+ memcpy(pMBR->BootCode + 0x180, &Guid, 16);
DiskSectorCount = DiskSizeBytes / 512 - 1;
if (DiskSectorCount > 0xFFFFFFFF)
ventoy_gen_preudo_uuid(&(Table[1].PartGuid));
Table[1].StartLBA = Table[0].LastLBA + 1;
Table[1].LastLBA = Table[1].StartLBA + VTOYEFI_PART_BYTES / 512 - 1;
- Table[1].Attr = 0xC000000000000001ULL;
+ Table[1].Attr = 0x8000000000000000ULL;
ventoy_fill_gpt_partname(Table[1].Name, "VTOYEFI");
#if 0
vdebug("Disk signature: 0x%08x\n", DiskSignature);
memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4);
+ memcpy(pMBR->BootCode + 0x180, &Guid, 16);
if (size / 512 > 0xFFFFFFFF)
{
return 0;
}
+int ventoy_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR)
+{
+ ventoy_guid Guid;
+ uint32_t DiskSignature;
+ uint32_t DiskSectorCount;
+ uint32_t PartSectorCount;
+ uint32_t PartStartSector;
+ uint32_t ReservedSector;
+
+ VentoyGetLocalBootImg(pMBR);
+
+ ventoy_gen_preudo_uuid(&Guid);
+
+ memcpy(&DiskSignature, &Guid, sizeof(uint32_t));
+
+ vdebug("Disk signature: 0x%08x\n", DiskSignature);
+
+ memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4);
+ memcpy(pMBR->BootCode + 0x180, &Guid, 16);
+
+ if (size / 4096 > 0xFFFFFFFF)
+ {
+ DiskSectorCount = 0xFFFFFFFF;
+ }
+ else
+ {
+ DiskSectorCount = (uint32_t)(size / 4096);
+ }
+
+ if (reserve <= 0)
+ {
+ ReservedSector = 0;
+ }
+ else
+ {
+ ReservedSector = (uint32_t)(reserve / 4096);
+ }
+
+ // check aligned with 4KB
+ vdebug("no need to align with 4KB for 4K native disk\n");
+
+ vlog("ReservedSector: %u\n", ReservedSector);
+
+ //Part1
+ PartStartSector = VTOYIMG_PART_START_SECTOR >> 3;
+ PartSectorCount = DiskSectorCount - ReservedSector - VTOYEFI_PART_BYTES / 4096 - PartStartSector;
+ VentoyFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl);
+
+ pMBR->PartTbl[0].Active = 0x80; // bootable
+ pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS
+
+ //Part2
+ PartStartSector += PartSectorCount;
+ PartSectorCount = VTOYEFI_PART_BYTES / 4096;
+ VentoyFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl + 1);
+
+ pMBR->PartTbl[1].Active = 0x00;
+ pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition
+
+ pMBR->Byte55 = 0x55;
+ pMBR->ByteAA = 0xAA;
+
+ return 0;
+}
+