mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[boot] write bootable mbr and fs_br (FAT32 only)
This commit is contained in:
		
							parent
							
								
									88143701ed
								
							
						
					
					
						commit
						7ae6715b55
					
				
					 3 changed files with 72 additions and 17 deletions
				
			
		|  | @ -26,7 +26,7 @@ const char* additional_copyrights = | ||||||
| "http://pcunleashed.com\r\n" | "http://pcunleashed.com\r\n" | ||||||
| "Freeware\r\n" | "Freeware\r\n" | ||||||
| "\r\n" | "\r\n" | ||||||
| "Boot record handling by ms-sys by Henrik Carlqvist:\r\n" | "Boot record handling from ms-sys by Henrik Carlqvist:\r\n" | ||||||
| "http://ms-sys.sourceforge.net\r\n" | "http://ms-sys.sourceforge.net\r\n" | ||||||
| "GNU General Public License (GPL) v2 or later\r\n" | "GNU General Public License (GPL) v2 or later\r\n" | ||||||
| "\r\n" | "\r\n" | ||||||
|  |  | ||||||
							
								
								
									
										75
									
								
								rufus.c
									
										
									
									
									
								
							
							
						
						
									
										75
									
								
								rufus.c
									
										
									
									
									
								
							|  | @ -706,13 +706,8 @@ static BOOL ProcessMBR(HANDLE hPhysicalDrive) | ||||||
| 	BOOL r = FALSE; | 	BOOL r = FALSE; | ||||||
| 	unsigned char* buf = NULL; | 	unsigned char* buf = NULL; | ||||||
| 	size_t SecSize = SelectedDrive.Geometry.BytesPerSector; | 	size_t SecSize = SelectedDrive.Geometry.BytesPerSector; | ||||||
| 	size_t nSecs = 0x200/min(0x200, SelectedDrive.Geometry.BytesPerSector); | 	size_t nSecs = (0x200 + SecSize -1) / SecSize; | ||||||
| 
 | 	FILE fake_fd; | ||||||
| 	if (SecSize * nSecs != 0x200) { |  | ||||||
| 		uprintf("Seriously? A drive where sector size is not a power of 2?!?\n"); |  | ||||||
| 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_SUPPORTED; |  | ||||||
| 		goto out; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	PrintStatus("Processing MBR...\n"); | 	PrintStatus("Processing MBR...\n"); | ||||||
| 	if (!AnalyzeMBR(hPhysicalDrive)) return FALSE; | 	if (!AnalyzeMBR(hPhysicalDrive)) return FALSE; | ||||||
|  | @ -732,7 +727,7 @@ static BOOL ProcessMBR(HANDLE hPhysicalDrive) | ||||||
| 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT; | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT; | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 	DumpBufferHex(buf, 0x200); | //	DumpBufferHex(buf, 0x200);
 | ||||||
| 	switch (ComboBox_GetCurSel(hFileSystem)) { | 	switch (ComboBox_GetCurSel(hFileSystem)) { | ||||||
| 	// TODO: check for 0x06 & 0x0b?
 | 	// TODO: check for 0x06 & 0x0b?
 | ||||||
| 	case FS_FAT16: | 	case FS_FAT16: | ||||||
|  | @ -742,14 +737,62 @@ static BOOL ProcessMBR(HANDLE hPhysicalDrive) | ||||||
| 		buf[0x1c2] = 0x0c; | 		buf[0x1c2] = 0x0c; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  | 	if (IsChecked(IDC_DOSSTARTUP)) { | ||||||
|  | 		buf[0x1be] = 0x80;		// Set first partition bootable
 | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!write_sectors(hPhysicalDrive, SelectedDrive.Geometry.BytesPerSector, 0, nSecs, buf, SecSize)) { | 	if (!write_sectors(hPhysicalDrive, SelectedDrive.Geometry.BytesPerSector, 0, nSecs, buf, SecSize*nSecs)) { | ||||||
| 		uprintf("Could not write MBR\n"); | 		uprintf("Could not write MBR\n"); | ||||||
| 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	r = TRUE; | 	fake_fd._ptr = (char*)hPhysicalDrive; | ||||||
|  | 	fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector; | ||||||
|  | 	r = write_95b_mbr(&fake_fd); | ||||||
|  | 
 | ||||||
|  | 	if (!read_sectors(hPhysicalDrive, SelectedDrive.Geometry.BytesPerSector, 0, nSecs, buf, SecSize)) { | ||||||
|  | 		uprintf("Could not re-read MBR\n"); | ||||||
|  | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT; | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	DumpBufferHex(buf, 0x200); | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	safe_free(buf); | ||||||
|  | 	return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static BOOL ProcessFS_BR(HANDLE hLogicalVolume) | ||||||
|  | { | ||||||
|  | 	BOOL r = FALSE; | ||||||
|  | 	unsigned char* buf = NULL; | ||||||
|  | 	FILE fake_fd; | ||||||
|  | 	size_t SecSize = SelectedDrive.Geometry.BytesPerSector; | ||||||
|  | 	size_t nSecs = (0x400 + SecSize -1) / SecSize; | ||||||
|  | 
 | ||||||
|  | 	fake_fd._ptr = (char*)hLogicalVolume; | ||||||
|  | 	fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector; | ||||||
|  | 	write_fat_32_br(&fake_fd, 0); | ||||||
|  | 
 | ||||||
|  | 	PrintStatus("Processing FS BR...\n"); | ||||||
|  | 	// FormatEx rewrites the MBR and removes the LBA attribute of FAT16
 | ||||||
|  | 	// and FAT32 partitions - we need to correct this in the MBR
 | ||||||
|  | 	// TODO: something else for bootable GPT
 | ||||||
|  | 	buf = (unsigned char*)malloc(SecSize * nSecs); | ||||||
|  | 	if (buf == NULL) { | ||||||
|  | 		uprintf("Could not allocate memory for FS BR"); | ||||||
|  | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY; | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!read_sectors(hLogicalVolume, SelectedDrive.Geometry.BytesPerSector, 0, nSecs, buf, SecSize*nSecs)) { | ||||||
|  | 		uprintf("Could not read FS BR\n"); | ||||||
|  | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT; | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	uprintf("FS_BR:\n"); | ||||||
|  | 	DumpBufferHex(buf, 0x400); | ||||||
| 
 | 
 | ||||||
| out: | out: | ||||||
| 	safe_free(buf); | 	safe_free(buf); | ||||||
|  | @ -854,8 +897,20 @@ static void __cdecl FormatThread(void* param) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	if (IsChecked(IDC_DOSSTARTUP)) { | 	if (IsChecked(IDC_DOSSTARTUP)) { | ||||||
|  | 		hLogicalVolume = GetDriveHandle(num, drive_name, TRUE, FALSE); | ||||||
|  | 		if (hLogicalVolume == INVALID_HANDLE_VALUE) { | ||||||
|  | 			uprintf("Could not re-mount volume\n"); | ||||||
|  | 			goto out; | ||||||
|  | 		} | ||||||
|  | 		ProcessFS_BR(hLogicalVolume); | ||||||
| 		// TODO: check return value & set bootblock
 | 		// TODO: check return value & set bootblock
 | ||||||
| 		ExtractMSDOS(drive_name); | 		ExtractMSDOS(drive_name); | ||||||
|  | 		// TODO:
 | ||||||
|  | 		// http://www.multiboot.ru/msdos8.htm & http://en.wikipedia.org/wiki/Windows_Me#Real_mode_DOS
 | ||||||
|  | 		// COMMAND.COM and IO.SYS from diskcopy.dll are from the WinME crippled version of DOS
 | ||||||
|  | 		// that removed real mode DOS => they must be patched:
 | ||||||
|  | 		// IO.SYS            000003AA          75 -> EB
 | ||||||
|  | 		// COMMAND.COM       00006510          75 -> EB
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| out: | out: | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								rufus.rc
									
										
									
									
									
								
							|  | @ -63,7 +63,7 @@ BEGIN | ||||||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP |     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||||
|     CONTROL         "<a href=""https://github.com/pbatard/rufus/wiki/Rufus"">https://github.com/pbatard/rufus</a>",IDC_ABOUT_RUFUS_URL, |     CONTROL         "<a href=""https://github.com/pbatard/rufus/wiki/Rufus"">https://github.com/pbatard/rufus</a>",IDC_ABOUT_RUFUS_URL, | ||||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 |                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||||
|     LTEXT           "Version 1.0.0 (Build 49)",IDC_STATIC,46,19,78,8 |     LTEXT           "Version 1.0.0 (Build 50)",IDC_STATIC,46,19,78,8 | ||||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP |     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL |     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 |     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||||
|  | @ -162,8 +162,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,0,0,49 |  FILEVERSION 1,0,0,50 | ||||||
|  PRODUCTVERSION 1,0,0,49 |  PRODUCTVERSION 1,0,0,50 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -180,13 +180,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "akeo.ie" |             VALUE "CompanyName", "akeo.ie" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "1.0.0.49" |             VALUE "FileVersion", "1.0.0.50" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus.exe" |             VALUE "OriginalFilename", "rufus.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "1.0.0.49" |             VALUE "ProductVersion", "1.0.0.50" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  | @ -212,7 +212,7 @@ IDI_ICON                ICON                    "rufus.ico" | ||||||
| 
 | 
 | ||||||
| STRINGTABLE | STRINGTABLE | ||||||
| BEGIN | BEGIN | ||||||
|     IDS_VERSION             "Rufus v1.0.0.49" |     IDS_VERSION             "Rufus v1.0.0.50" | ||||||
| END | END | ||||||
| 
 | 
 | ||||||
| #endif    // English resources | #endif    // English resources | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue