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…
Reference in a new issue