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
						CodingWorkshop Signing Team
					
				
			
			
				
	
				
						parent
						
							2271d6bde1
						
					
				
				
					commit
					ef272847e1
				
			| @@ -266,7 +266,7 @@ int main(int argc, char **argv) | ||||
|     Partition.BootFlag = 0x80; | ||||
|     Partition.Type = (FatFormat == 16) ? 0x06 : 0x0B; | ||||
|     Partition.StartLBA = 2048; | ||||
|     Partition.Size = (DiskSizeBytes / SECTOR_SIZE) - 2048; | ||||
|     Partition.Size = (DiskSizeBytes / SECTOR_SIZE) - Partition.StartLBA; | ||||
|  | ||||
|     /* Write MBR */ | ||||
|     memcpy(&Mbr[446], &Partition, sizeof(MBR_PARTITION)); | ||||
| @@ -318,6 +318,52 @@ int main(int argc, char **argv) | ||||
|             perror("Failed to reopen disk image"); | ||||
|             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 */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user