mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[xp] Add rdisk() masquerading
* Also add MBR support from resource file * Also fix an issue with WDK
This commit is contained in:
parent
d87f069963
commit
04a20922d5
3 changed files with 48 additions and 11 deletions
45
src/format.c
45
src/format.c
|
@ -399,6 +399,33 @@ static BOOL ClearMBR(HANDLE hPhysicalDrive)
|
||||||
return clear_mbr(&fake_fd);
|
return clear_mbr(&fake_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Our own MBR, not in ms-sys
|
||||||
|
*/
|
||||||
|
BOOL WriteRufusMBR(FILE *fp)
|
||||||
|
{
|
||||||
|
HGLOBAL res_handle;
|
||||||
|
HRSRC res;
|
||||||
|
unsigned char aucRef[] = {0x55, 0xAA};
|
||||||
|
unsigned char* rufus_mbr;
|
||||||
|
|
||||||
|
res = FindResource(hMainInstance, MAKEINTRESOURCE(IDR_BR_MBR_BIN), RT_RCDATA);
|
||||||
|
if (res == NULL) {
|
||||||
|
uprintf("Unable to locate mbr.bin resource: %s\n", WindowsErrorString());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
res_handle = LoadResource(NULL, res);
|
||||||
|
if (res_handle == NULL) {
|
||||||
|
uprintf("Unable to load mbr.bin resource: %s\n", WindowsErrorString());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
rufus_mbr = (unsigned char*)LockResource(res_handle);
|
||||||
|
|
||||||
|
return
|
||||||
|
write_data(fp, 0x0, rufus_mbr, 0x1b8) &&
|
||||||
|
write_data(fp, 0x1fe, aucRef, sizeof(aucRef));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process the Master Boot Record
|
* Process the Master Boot Record
|
||||||
*/
|
*/
|
||||||
|
@ -448,7 +475,8 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (IsChecked(IDC_DOS)) {
|
if (IsChecked(IDC_DOS)) {
|
||||||
buf[0x1be] = 0x80; // Set first partition bootable
|
// Set first partition bootable - masquerade as 0x81 for XP
|
||||||
|
buf[0x1be] = ((iso_report.winpe&WINPE_I386)==WINPE_I386)?0x81:0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!write_sectors(hPhysicalDrive, SecSize, 0, nSecs, buf)) {
|
if (!write_sectors(hPhysicalDrive, SecSize, 0, nSecs, buf)) {
|
||||||
|
@ -466,7 +494,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
|
||||||
} else {
|
} else {
|
||||||
if (IsChecked(IDC_RUFUS_MBR)) {
|
if (IsChecked(IDC_RUFUS_MBR)) {
|
||||||
uprintf("Using Rufus bootable USB selection MBR\n");
|
uprintf("Using Rufus bootable USB selection MBR\n");
|
||||||
r = write_rufus_mbr(&fake_fd);
|
r = WriteRufusMBR(&fake_fd);
|
||||||
} else {
|
} else {
|
||||||
uprintf("Using Windows 7 MBR\n");
|
uprintf("Using Windows 7 MBR\n");
|
||||||
r = write_win7_mbr(&fake_fd);
|
r = write_win7_mbr(&fake_fd);
|
||||||
|
@ -554,6 +582,7 @@ static BOOL SetupWinPE(char drive_letter)
|
||||||
const char* patch_str_org[] = { "\\minint\\txtsetup.sif", "\\minint\\system32\\" };
|
const char* patch_str_org[] = { "\\minint\\txtsetup.sif", "\\minint\\system32\\" };
|
||||||
const char* patch_str_rep[] = { "\\$\\i386\\txtsetup.sif", "\\$\\i386\\system32\\" };
|
const char* patch_str_rep[] = { "\\$\\i386\\txtsetup.sif", "\\$\\i386\\system32\\" };
|
||||||
const char *win_nt_bt_org = "$win_nt$.~bt", *win_nt_bt_rep = "$\\i386";
|
const char *win_nt_bt_org = "$win_nt$.~bt", *win_nt_bt_rep = "$\\i386";
|
||||||
|
const char *rdisk_zero = "rdisk(0)";
|
||||||
const char* winnt_sif = "[Data]\n msdosinitiated = \"1\"\n";
|
const char* winnt_sif = "[Data]\n msdosinitiated = \"1\"\n";
|
||||||
const wchar_t* win_nt_ls = L"$win_nt$.~ls";
|
const wchar_t* win_nt_ls = L"$win_nt$.~ls";
|
||||||
STARTUPINFOA si;
|
STARTUPINFOA si;
|
||||||
|
@ -570,7 +599,7 @@ static BOOL SetupWinPE(char drive_letter)
|
||||||
buf = get_token_data(src, "OsLoadOptions");
|
buf = get_token_data(src, "OsLoadOptions");
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
for (i=0; i<strlen(buf); i++)
|
for (i=0; i<strlen(buf); i++)
|
||||||
buf[i] = tolower(buf[i]);
|
buf[i] = (char)tolower(buf[i]);
|
||||||
uprintf("OsLoadOptions = %s\n", buf);
|
uprintf("OsLoadOptions = %s\n", buf);
|
||||||
minint = (strstr(buf, "/minint") != NULL);
|
minint = (strstr(buf, "/minint") != NULL);
|
||||||
}
|
}
|
||||||
|
@ -635,12 +664,19 @@ static BOOL SetupWinPE(char drive_letter)
|
||||||
}else {
|
}else {
|
||||||
// Finish patching \bootmgr
|
// Finish patching \bootmgr
|
||||||
for (i=0; i<size-32; i++) {
|
for (i=0; i<size-32; i++) {
|
||||||
|
// $WIN_NT$_~BT -> $\i386
|
||||||
if (safe_strnicmp(&buf[i], win_nt_bt_org, strlen(win_nt_bt_org)-1) == 0) {
|
if (safe_strnicmp(&buf[i], win_nt_bt_org, strlen(win_nt_bt_org)-1) == 0) {
|
||||||
uprintf(" 0x%08X: '%s' -> '%s%s'\n", i, &buf[i], win_nt_bt_rep, &buf[i+strlen(win_nt_bt_org)]);
|
uprintf(" 0x%08X: '%s' -> '%s%s'\n", i, &buf[i], win_nt_bt_rep, &buf[i+strlen(win_nt_bt_org)]);
|
||||||
strcpy(&buf[i], win_nt_bt_rep);
|
strcpy(&buf[i], win_nt_bt_rep);
|
||||||
buf[i+strlen(win_nt_bt_rep)] = buf[i+strlen(win_nt_bt_org)];
|
buf[i+strlen(win_nt_bt_rep)] = buf[i+strlen(win_nt_bt_org)];
|
||||||
buf[i+strlen(win_nt_bt_rep)+1] = 0;
|
buf[i+strlen(win_nt_bt_rep)+1] = 0;
|
||||||
}
|
}
|
||||||
|
// rdisk(0) -> rdisk(1) (MBR disk masquerading)
|
||||||
|
// TODO: only the first one seems to be needed
|
||||||
|
if (safe_strnicmp(&buf[i], rdisk_zero, strlen(rdisk_zero)-1) == 0) {
|
||||||
|
buf[i+6] = '1';
|
||||||
|
uprintf(" 0x%08X: '%s' -> 'rdisk(1)'\n", i, rdisk_zero);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!WriteFile(handle, buf, size, &rw_size, NULL)) || (size != rw_size)) {
|
if ((!WriteFile(handle, buf, size, &rw_size, NULL)) || (size != rw_size)) {
|
||||||
|
@ -919,7 +955,8 @@ DWORD WINAPI FormatThread(LPVOID param)
|
||||||
|
|
||||||
PrintStatus(0, TRUE, "Writing master boot record...");
|
PrintStatus(0, TRUE, "Writing master boot record...");
|
||||||
if (!WriteMBR(hPhysicalDrive)) {
|
if (!WriteMBR(hPhysicalDrive)) {
|
||||||
// Errorcode has already been set
|
if (!FormatStatus)
|
||||||
|
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
UpdateProgress(OP_FIX_MBR, -1.0f);
|
UpdateProgress(OP_FIX_MBR, -1.0f);
|
||||||
|
|
|
@ -144,7 +144,7 @@ typedef struct {
|
||||||
/* ISO details that the application may want */
|
/* ISO details that the application may want */
|
||||||
#define WINPE_MININT 0x2A
|
#define WINPE_MININT 0x2A
|
||||||
#define WINPE_I386 0x15
|
#define WINPE_I386 0x15
|
||||||
#define IS_WINPE(r) (((r&WINPE_MININT) == WINPE_MININT)||((r&WINPE_I386)==WINPE_I386))
|
#define IS_WINPE(r) (((r&WINPE_MININT) == WINPE_MININT)||((r&WINPE_I386) == WINPE_I386))
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char label[192]; /* 3*64 to account for UTF-8 */
|
char label[192]; /* 3*64 to account for UTF-8 */
|
||||||
char usb_label[192]; /* converted USB label for workaround */
|
char usb_label[192]; /* converted USB label for workaround */
|
||||||
|
|
12
src/rufus.rc
12
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 206, 289
|
IDD_DIALOG DIALOGEX 12, 12, 206, 289
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_APPWINDOW
|
EXSTYLE WS_EX_APPWINDOW
|
||||||
CAPTION "Rufus v1.1.6.158"
|
CAPTION "Rufus v1.1.6.159"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
BEGIN
|
BEGIN
|
||||||
DEFPUSHBUTTON "Start",IDC_START,94,248,50,14
|
DEFPUSHBUTTON "Start",IDC_START,94,248,50,14
|
||||||
|
@ -74,7 +74,7 @@ BEGIN
|
||||||
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
|
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
|
||||||
CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL,
|
CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL,
|
||||||
"SysLink",WS_TABSTOP,46,47,114,9
|
"SysLink",WS_TABSTOP,46,47,114,9
|
||||||
LTEXT "Version 1.1.6 (Build 158)",IDC_STATIC,46,19,78,8
|
LTEXT "Version 1.1.6 (Build 159)",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
|
||||||
|
@ -224,8 +224,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,1,6,158
|
FILEVERSION 1,1,6,159
|
||||||
PRODUCTVERSION 1,1,6,158
|
PRODUCTVERSION 1,1,6,159
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -242,13 +242,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "akeo.ie"
|
VALUE "CompanyName", "akeo.ie"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "1.1.6.158"
|
VALUE "FileVersion", "1.1.6.159"
|
||||||
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.1.6.158"
|
VALUE "ProductVersion", "1.1.6.159"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue