diff --git a/src/drive.c b/src/drive.c index 5203137e..85497e63 100644 --- a/src/drive.c +++ b/src/drive.c @@ -842,6 +842,9 @@ BOOL MountVolume(char* drive_name, char *drive_guid) char mounted_letter[16] = {0}; DWORD size; + if (drive_name[0] == '?') + return FALSE; + // For fixed disks, Windows may already have remounted the volume, but with a different letter // than the one we want. If that's the case, we need to unmount first. if ( (GetVolumePathNamesForVolumeNameA(drive_guid, mounted_letter, sizeof(mounted_letter), &size)) diff --git a/src/format.c b/src/format.c index a3d66d5a..9997f9b5 100644 --- a/src/format.c +++ b/src/format.c @@ -1264,12 +1264,22 @@ out: } // http://technet.microsoft.com/en-ie/library/jj721578.aspx + +// As opposed to the technet guide above, we no longer set internal drives offline, +// due to people wondering why they can't see them by default, and also due to dism +// incompatibilities from one version of Windows to the next. +// Maybe when we use wimlib we'll review this, but for now just turn it off. +//#define SET_INTERNAL_DRIVES_OFFLINE BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi) { - char san_policy_path[] = "?:\\san_policy.xml", unattend_path[] = "?:\\Windows\\System32\\sysprep\\unattend.xml"; - char *mounted_iso, *ms_efi = NULL, image[128], cmd[128]; - wchar_t wVolumeName[] = L"?:"; +#ifdef SET_INTERNAL_DRIVES_OFFLINE + static char san_policy_path[] = "?:\\san_policy.xml"; +#endif + static char unattend_path[] = "?:\\Windows\\System32\\sysprep\\unattend.xml"; + char *mounted_iso, *ms_efi = NULL, image[128], cmd[MAX_PATH], system_root[128]; unsigned char *buffer; + int i; + wchar_t wVolumeName[] = L"?:"; DWORD bufsize; ULONG cluster_size; FILE* fd; @@ -1340,17 +1350,27 @@ BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi) } } - static_sprintf(cmd, "%s\\Windows\\System32\\bcdboot.exe %s\\Windows /f ALL /s %s", - drive_name, drive_name, (use_ms_efi)?ms_efi:drive_name); - uprintf("Enabling boot: '%s'", cmd); - if (RunCommand(cmd, NULL, TRUE) != 0) { + // Try the 'bcdboot' command, first using the one from the target drive and, if that doesn't work, the system's + uprintf("Enabling boot..."); + for (i = 0; i < 2; i++) { + if (i == 0) + static_sprintf(system_root, "%s\\Windows\\System32", drive_name); + else + GetSystemDirectoryA(system_root, sizeof(system_root)); + static_sprintf(cmd, "%s\\bcdboot.exe %s\\Windows /f ALL /s %s", + system_root, drive_name, (use_ms_efi)?ms_efi:drive_name); + if (RunCommand(cmd, NULL, TRUE) == 0) + break; + } + if (i >= 2) { // Fatal, as the UFD is unlikely to boot then - uprintf("Command '%s' failed to run", cmd); + uprintf("Failed to enable boot - aborting", cmd); FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_EXTRACT); if (use_ms_efi) AltUnmountVolume(ms_efi); return FALSE; } + uprintf("Boot was successfully enabled using command '%s'", cmd); if (use_ms_efi) { Sleep(200); @@ -1360,10 +1380,12 @@ BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi) UpdateProgress(OP_DOS, 99.9f); // The following are non fatal if they fail + +#ifdef SET_INTERNAL_DRIVES_OFFLINE + uprintf("Applying 'san_policy.xml', to set the target's internal drives offline..."); buffer = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_TOGO_SAN_POLICY_XML), _RT_RCDATA, "san_policy.xml", &bufsize, FALSE); san_policy_path[0] = drive_name[0]; - uprintf("Applying san_policy.xml..."); fd = fopenU(san_policy_path, "wb"); if ((fd == NULL) || (fwrite(buffer, 1, bufsize, fd) != bufsize)) { uprintf("Could not write '%s'\n", san_policy_path); @@ -1379,8 +1401,9 @@ BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi) if (RunCommand(cmd, NULL, TRUE) != 0) uprintf("Command '%s' failed to run", cmd); } +#endif - uprintf("Copying 'unattend.xml'"); + uprintf("Copying 'unattend.xml', to disable the use of the Windows Recovery Environment..."); buffer = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_TOGO_UNATTEND_XML), _RT_RCDATA, "unattend.xml", &bufsize, FALSE); unattend_path[0] = drive_name[0]; diff --git a/src/rufus.rc b/src/rufus.rc index 2fdad42a..ec755e8c 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 2.3.678" +CAPTION "Rufus 2.3.679" FONT 8, "Segoe UI", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -157,7 +157,7 @@ END IDD_DIALOG_XP DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 2.3.678" +CAPTION "Rufus 2.3.679" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -283,7 +283,7 @@ END IDD_DIALOG_RTL DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 2.3.678" +CAPTION "Rufus 2.3.679" FONT 8, "Segoe UI", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -415,7 +415,7 @@ END IDD_DIALOG_RTL_XP DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 2.3.678" +CAPTION "Rufus 2.3.679" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -671,8 +671,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,3,678,0 - PRODUCTVERSION 2,3,678,0 + FILEVERSION 2,3,679,0 + PRODUCTVERSION 2,3,679,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -689,13 +689,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "2.3.678" + VALUE "FileVersion", "2.3.679" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2015 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "2.3.678" + VALUE "ProductVersion", "2.3.679" END END BLOCK "VarFileInfo" diff --git a/src/stdfn.c b/src/stdfn.c index b328ffb2..884300d6 100644 --- a/src/stdfn.c +++ b/src/stdfn.c @@ -561,7 +561,7 @@ DWORD RunCommand(const char* cmd, const char* dir, BOOL log) if (!CreateProcessU(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, dir, &si, &pi)) { ret = GetLastError(); - uprintf("Unable to launch command '%s': %s", WindowsErrorString()); + uprintf("Unable to launch command '%s': %s", cmd, WindowsErrorString()); goto out; }