mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[core] work around Windows 10 CU potentially selecting the UEFI:NTFS partition for formatting
* Should only happen with Windows 10 Creator Update (1703) * Closes #931 * Also silence the flow of bcdboot benign errors on WinToGo creation (unless USB Debug is enabled) * Also ensure WaitForLogical() will not actually spends 15 seconds max before giving up
This commit is contained in:
		
							parent
							
								
									42e8d714e8
								
							
						
					
					
						commit
						caa9b06426
					
				
					 4 changed files with 24 additions and 12 deletions
				
			
		|  | @ -306,10 +306,13 @@ out: | ||||||
| /* Wait for a logical drive to reappear - Used when a drive has just been repartitioned */ | /* Wait for a logical drive to reappear - Used when a drive has just been repartitioned */ | ||||||
| BOOL WaitForLogical(DWORD DriveIndex) | BOOL WaitForLogical(DWORD DriveIndex) | ||||||
| { | { | ||||||
| 	DWORD i; | 	DWORD EndTime; | ||||||
| 	char* LogicalPath = NULL; | 	char* LogicalPath = NULL; | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < DRIVE_ACCESS_RETRIES; i++) { | 	// GetLogicalName() calls may be slow, so use the system time to
 | ||||||
|  | 	// make sure we don't spend more than DRIVE_ACCESS_TIMEOUT in wait.
 | ||||||
|  | 	EndTime = GetTickCount() + DRIVE_ACCESS_TIMEOUT; | ||||||
|  | 	do { | ||||||
| 		LogicalPath = GetLogicalName(DriveIndex, FALSE, TRUE); | 		LogicalPath = GetLogicalName(DriveIndex, FALSE, TRUE); | ||||||
| 		if (LogicalPath != NULL) { | 		if (LogicalPath != NULL) { | ||||||
| 			free(LogicalPath); | 			free(LogicalPath); | ||||||
|  | @ -318,7 +321,7 @@ BOOL WaitForLogical(DWORD DriveIndex) | ||||||
| 		if (IS_ERROR(FormatStatus))	// User cancel
 | 		if (IS_ERROR(FormatStatus))	// User cancel
 | ||||||
| 			return FALSE; | 			return FALSE; | ||||||
| 		Sleep(DRIVE_ACCESS_TIMEOUT/DRIVE_ACCESS_RETRIES); | 		Sleep(DRIVE_ACCESS_TIMEOUT/DRIVE_ACCESS_RETRIES); | ||||||
| 	} | 	} while (GetTickCount() < EndTime); | ||||||
| 	uprintf("Timeout while waiting for logical drive\n"); | 	uprintf("Timeout while waiting for logical drive\n"); | ||||||
| 	return FALSE; | 	return FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								src/format.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								src/format.c
									
										
									
									
									
								
							|  | @ -61,7 +61,7 @@ static int task_number = 0; | ||||||
| extern const int nb_steps[FS_MAX]; | extern const int nb_steps[FS_MAX]; | ||||||
| extern uint32_t dur_mins, dur_secs; | extern uint32_t dur_mins, dur_secs; | ||||||
| static int fs_index = 0, wintogo_index = -1; | static int fs_index = 0, wintogo_index = -1; | ||||||
| extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, disable_file_indexing; | extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, disable_file_indexing, usb_debug; | ||||||
| uint8_t *grub2_buf = NULL; | uint8_t *grub2_buf = NULL; | ||||||
| long grub2_len; | long grub2_len; | ||||||
| static BOOL WritePBR(HANDLE hLogicalDrive); | static BOOL WritePBR(HANDLE hLogicalDrive); | ||||||
|  | @ -681,7 +681,7 @@ static BOOL FormatDrive(DWORD DriveIndex) | ||||||
| 	BOOL r = FALSE; | 	BOOL r = FALSE; | ||||||
| 	PF_DECL(FormatEx); | 	PF_DECL(FormatEx); | ||||||
| 	PF_DECL(EnableVolumeCompression); | 	PF_DECL(EnableVolumeCompression); | ||||||
| 	char FSType[32]; | 	char FSType[32], path[MAX_PATH]; | ||||||
| 	char *locale, *VolumeName = NULL; | 	char *locale, *VolumeName = NULL; | ||||||
| 	WCHAR* wVolumeName = NULL; | 	WCHAR* wVolumeName = NULL; | ||||||
| 	WCHAR wFSType[64]; | 	WCHAR wFSType[64]; | ||||||
|  | @ -715,6 +715,16 @@ static BOOL FormatDrive(DWORD DriveIndex) | ||||||
| 	// a trailing backslash, but EnableCompression() fails without...
 | 	// a trailing backslash, but EnableCompression() fails without...
 | ||||||
| 	wVolumeName[wcslen(wVolumeName)-1] = 0;		// Remove trailing backslash
 | 	wVolumeName[wcslen(wVolumeName)-1] = 0;		// Remove trailing backslash
 | ||||||
| 
 | 
 | ||||||
|  | 	// Check if Windows picked the UEFI:NTFS partition
 | ||||||
|  | 	// NB: No need to do this for Large FAT32, as this only applies to NTFS
 | ||||||
|  | 	safe_strcpy(path, MAX_PATH, VolumeName); | ||||||
|  | 	safe_strcat(path, MAX_PATH, "EFI\\Rufus\\ntfs_x64.efi"); | ||||||
|  | 	if (PathFileExistsA(path)) { | ||||||
|  | 		uprintf("Windows selected the UEFI:NTFS partition for formatting - Retry needed", VolumeName); | ||||||
|  | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_RETRY; | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// LoadLibrary("fmifs.dll") appears to changes the locale, which can lead to
 | 	// LoadLibrary("fmifs.dll") appears to changes the locale, which can lead to
 | ||||||
| 	// problems with tolower(). Make sure we restore the locale. For more details,
 | 	// problems with tolower(). Make sure we restore the locale. For more details,
 | ||||||
| 	// see http://comments.gmane.org/gmane.comp.gnu.mingw.user/39300
 | 	// see http://comments.gmane.org/gmane.comp.gnu.mingw.user/39300
 | ||||||
|  | @ -1423,7 +1433,7 @@ static BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi) | ||||||
| 	uprintf("Enabling boot..."); | 	uprintf("Enabling boot..."); | ||||||
| 	static_sprintf(cmd, "%s\\bcdboot.exe %s\\Windows /v /f ALL /s %s", sysnative_dir, | 	static_sprintf(cmd, "%s\\bcdboot.exe %s\\Windows /v /f ALL /s %s", sysnative_dir, | ||||||
| 		drive_name, (use_ms_efi)?ms_efi:drive_name); | 		drive_name, (use_ms_efi)?ms_efi:drive_name); | ||||||
| 	if (RunCommand(cmd, sysnative_dir, TRUE) != 0) { | 	if (RunCommand(cmd, sysnative_dir, usb_debug) != 0) { | ||||||
| 		// Try to continue... but report a failure
 | 		// Try to continue... but report a failure
 | ||||||
| 		uprintf("Failed to enable boot using command '%s'", cmd); | 		uprintf("Failed to enable boot using command '%s'", cmd); | ||||||
| 		FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_ISO_EXTRACT); | 		FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_ISO_EXTRACT); | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 242, 376 | IDD_DIALOG DIALOGEX 12, 12, 242, 376 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_ACCEPTFILES | EXSTYLE WS_EX_ACCEPTFILES | ||||||
| CAPTION "Rufus 2.14.1086" | CAPTION "Rufus 2.14.1087" | ||||||
| FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 |     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 | ||||||
|  | @ -334,8 +334,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 2,14,1086,0 |  FILEVERSION 2,14,1087,0 | ||||||
|  PRODUCTVERSION 2,14,1086,0 |  PRODUCTVERSION 2,14,1087,0 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -352,13 +352,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" |             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "2.14.1086" |             VALUE "FileVersion", "2.14.1087" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2017 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", "2.14.1086" |             VALUE "ProductVersion", "2.14.1087" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
|  | @ -294,7 +294,6 @@ const char* _StrError(DWORD error_code) | ||||||
| 	case ERROR_NOT_READY: | 	case ERROR_NOT_READY: | ||||||
| 		return lmprintf(MSG_079); | 		return lmprintf(MSG_079); | ||||||
| 	default: | 	default: | ||||||
| 		uprintf("Unknown error: %08X\n", error_code); |  | ||||||
| 		SetLastError(error_code); | 		SetLastError(error_code); | ||||||
| 		return WindowsErrorString(); | 		return WindowsErrorString(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue