Correct key fields in VBR generated by mformat
All checks were successful
All checks were successful
This commit is contained in:
committed by
CodingWorkshop Signing Team
parent
2271d6bde1
commit
ef272847e1
@@ -266,7 +266,7 @@ int main(int argc, char **argv)
|
|||||||
Partition.BootFlag = 0x80;
|
Partition.BootFlag = 0x80;
|
||||||
Partition.Type = (FatFormat == 16) ? 0x06 : 0x0B;
|
Partition.Type = (FatFormat == 16) ? 0x06 : 0x0B;
|
||||||
Partition.StartLBA = 2048;
|
Partition.StartLBA = 2048;
|
||||||
Partition.Size = (DiskSizeBytes / SECTOR_SIZE) - 2048;
|
Partition.Size = (DiskSizeBytes / SECTOR_SIZE) - Partition.StartLBA;
|
||||||
|
|
||||||
/* Write MBR */
|
/* Write MBR */
|
||||||
memcpy(&Mbr[446], &Partition, sizeof(MBR_PARTITION));
|
memcpy(&Mbr[446], &Partition, sizeof(MBR_PARTITION));
|
||||||
@@ -318,6 +318,52 @@ int main(int argc, char **argv)
|
|||||||
perror("Failed to reopen disk image");
|
perror("Failed to reopen disk image");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read the VBR created by mformat */
|
||||||
|
fseek(File, Partition.StartLBA * SECTOR_SIZE, SEEK_SET);
|
||||||
|
if(fread(ImageVbr, 1, SECTOR_SIZE, File) != SECTOR_SIZE)
|
||||||
|
{
|
||||||
|
/* Failed to read VBR */
|
||||||
|
perror("Failed to read VBR from disk image");
|
||||||
|
fclose(File);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the number of hidden sectors, as mformat sets it to 0 */
|
||||||
|
if(*(uint32_t*)&ImageVbr[0x1C] == 0)
|
||||||
|
{
|
||||||
|
memcpy(&ImageVbr[0x1C], &Partition.StartLBA, sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if parition size exceeds 65535 sectors */
|
||||||
|
if(Partition.Size < 65536)
|
||||||
|
{
|
||||||
|
/* Partition smaller than 32MB (65536 sectors), use 16-bit field TotalSectors16 */
|
||||||
|
if(*(uint16_t*)&ImageVbr[0x13] == 0)
|
||||||
|
{
|
||||||
|
/* Mformat did not set the field, update it */
|
||||||
|
memcpy(&ImageVbr[0x13], &((uint16_t){Partition.Size}), sizeof(uint16_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Partition larger than 32MB (65536 sectors), use 32-bit field TotalSectors32 */
|
||||||
|
if(*(uint32_t*)&ImageVbr[0x20] == 0)
|
||||||
|
{
|
||||||
|
/* Mformat did not set the field, update it */
|
||||||
|
memcpy(&ImageVbr[0x20], &Partition.Size, sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write the corrected VBR back to the disk image */
|
||||||
|
fseek(File, Partition.StartLBA * SECTOR_SIZE, SEEK_SET);
|
||||||
|
if(fwrite(ImageVbr, 1, SECTOR_SIZE, File) != SECTOR_SIZE)
|
||||||
|
{
|
||||||
|
/* Failed to write VBR */
|
||||||
|
perror("Failed to write VBR to disk image");
|
||||||
|
fclose(File);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write VBR to the start of the partition, if provided */
|
/* Write VBR to the start of the partition, if provided */
|
||||||
|
Reference in New Issue
Block a user