mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	Merge d14029310f into 5602494690
				
					
				
			This commit is contained in:
		
						commit
						3f8ae10ed6
					
				
					 3 changed files with 89 additions and 4 deletions
				
			
		|  | @ -566,6 +566,7 @@ t MSG_303 "Show the log" | |||
| t MSG_304 "Create a disk image of the selected device" | ||||
| t MSG_305 "Use this option to indicate whether you want to use this device to install Windows on another disk, " | ||||
| 	"or if you want to run Windows directly from this drive (Windows To Go)." | ||||
| t MSG_306 "Erasing drive: %0.1f%% completed" | ||||
| 
 | ||||
| ################################################################################ | ||||
| ############################# TRANSLATOR END COPY ############################## | ||||
|  | @ -4552,6 +4553,7 @@ t MSG_303 "Toon het logboek" | |||
| t MSG_304 "Maak een schijfkopie van het geselecteerde apparaat" | ||||
| t MSG_305 "Gebruik deze optie om aan te geven of u dit apparaat wilt gebruiken om Windows op een andere schijf te installeren, " | ||||
| 	"of als u Windows rechtstreeks vanaf deze schijf wilt opstarten (Windows To Go)." | ||||
| t MSG_306 "Schijf wissen: %0.1f%% voltooid" | ||||
| 
 | ||||
| ################################################################################ | ||||
| l "fi-FI" "Finnish (Suomi)" 0x040B | ||||
|  |  | |||
							
								
								
									
										81
									
								
								src/format.c
									
										
									
									
									
								
							
							
						
						
									
										81
									
								
								src/format.c
									
										
									
									
									
								
							|  | @ -62,7 +62,7 @@ static int task_number = 0; | |||
| extern const int nb_steps[FS_MAX]; | ||||
| extern uint32_t dur_mins, dur_secs; | ||||
| static int fs_index = 0, wintogo_index = -1; | ||||
| extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, enable_file_indexing, write_as_image; | ||||
| extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, smart_skip, enable_file_indexing, write_as_image; | ||||
| uint8_t *grub2_buf = NULL; | ||||
| long grub2_len; | ||||
| static BOOL WritePBR(HANDLE hLogicalDrive); | ||||
|  | @ -1548,11 +1548,13 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) | |||
| { | ||||
| 	BOOL s, ret = FALSE; | ||||
| 	LARGE_INTEGER li; | ||||
| 	DWORD rSize, wSize, BufSize; | ||||
| 	DWORD rSize, wSize, xSize, BufSize; | ||||
| 	uint64_t wb, target_size = hSourceImage?img_report.image_size:SelectedDrive.DiskSize; | ||||
| 	int64_t bled_ret; | ||||
| 	uint8_t *buffer = NULL; | ||||
| 	uint8_t *readbuffer = NULL; | ||||
| 	int i; | ||||
| 	int smartskip_backoff = 0; | ||||
| 
 | ||||
| 	// We poked the MBR and other stuff, so we need to rewind
 | ||||
| 	li.QuadPart = 0; | ||||
|  | @ -1572,7 +1574,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) | |||
| 			goto out; | ||||
| 		} | ||||
| 	} else { | ||||
| 		uprintf(hSourceImage?"Writing Image...":"Zeroing drive..."); | ||||
| 		uprintf(hSourceImage?"Writing Image...":smart_skip?"Erasing drive...":"Zeroing drive..."); | ||||
| 		// Our buffer size must be a multiple of the sector size and *ALIGNED* to the sector size
 | ||||
| 		BufSize = ((DD_BUFFER_SIZE + SelectedDrive.SectorSize - 1) / SelectedDrive.SectorSize) * SelectedDrive.SectorSize; | ||||
| 		buffer = (uint8_t*)_mm_malloc(BufSize, SelectedDrive.SectorSize); | ||||
|  | @ -1587,6 +1589,21 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) | |||
| 			uprintf("Write buffer is not aligned"); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		// Clear buffer
 | ||||
| 		memset(buffer, smart_skip?0xff:0x00, BufSize); | ||||
| 
 | ||||
| 		readbuffer = (uint8_t*)_mm_malloc(BufSize, SelectedDrive.SectorSize); | ||||
| 		if (readbuffer == NULL) { | ||||
| 			FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY; | ||||
| 			uprintf("Could not allocate disk read buffer"); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		// Sanity check
 | ||||
| 		if ((uintptr_t)readbuffer % SelectedDrive.SectorSize != 0) { | ||||
| 			FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT; | ||||
| 			uprintf("Read buffer is not aligned"); | ||||
| 			goto out; | ||||
| 		} | ||||
| 
 | ||||
| 		// Don't bother trying for something clever, using double buffering overlapped and whatnot:
 | ||||
| 		// With Windows' default optimizations, sync read + sync write for sequential operations
 | ||||
|  | @ -1596,7 +1613,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) | |||
| 			if (GetTickCount64() > LastRefresh + MAX_REFRESH) { | ||||
| 				LastRefresh = GetTickCount64(); | ||||
| 				format_percent = (100.0f*wb) / (1.0f*target_size); | ||||
| 				PrintInfo(0, hSourceImage?MSG_261:MSG_286, format_percent); | ||||
| 				PrintInfo(0, hSourceImage?MSG_261:smart_skip?MSG_306:MSG_286, format_percent); | ||||
| 				UpdateProgress(OP_FORMAT, format_percent); | ||||
| 			} | ||||
| 
 | ||||
|  | @ -1618,6 +1635,61 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) | |||
| 			// WriteFile fails unless the size is a multiple of sector size
 | ||||
| 			if (rSize % SelectedDrive.SectorSize != 0) | ||||
| 				rSize = ((rSize + SelectedDrive.SectorSize - 1) / SelectedDrive.SectorSize) * SelectedDrive.SectorSize; | ||||
| 
 | ||||
| 			// Smart-skip: Reading a flash drive is faster than writing, so we
 | ||||
| 			// can skip erasing empty blocks, or skip writing when the data is the same
 | ||||
| 			// * a block is empty when all bits are either 0 (zeros) or 1 (flash block erased)
 | ||||
| 			// * a back-off strategy is used to limit reading
 | ||||
| 
 | ||||
| 			if (smartskip_backoff) { | ||||
| 				smartskip_backoff--; | ||||
| 			} else if (smart_skip && (hSourceImage == NULL)) { // currently only enabled for erase
 | ||||
| 
 | ||||
| 				CHECK_FOR_USER_CANCEL; | ||||
| 
 | ||||
| 				// Read block and compare against the block that needs to be written
 | ||||
| 				s = ReadFile(hPhysicalDrive, readbuffer, rSize, &xSize, NULL); | ||||
| 				if (!s || (xSize != rSize) ) { | ||||
| 					uprintf("Read error: could not read data to compare - %s", WindowsErrorString()); | ||||
| 					goto out; | ||||
| 				} | ||||
| 
 | ||||
| 				// erase or write
 | ||||
| 				if (hSourceImage == NULL) { | ||||
| 					// Erase, check for an empty block
 | ||||
| 					int *ptr = (int*)(readbuffer); | ||||
| 					// Get first element
 | ||||
| 					int value = ptr[0]; | ||||
| 					// Check all bits are the same
 | ||||
| 					if (value!=0 && value!=-1) { | ||||
| 						goto blocknotempty; | ||||
| 					} | ||||
| 					// Compare the rest of the block against the first element
 | ||||
| 					for (i = 1; i < (int)(rSize/sizeof(int)); i++) { | ||||
| 						if (ptr[i] != value) | ||||
| 							goto blocknotempty; | ||||
| 					} | ||||
| 					// Block is empty, skip write
 | ||||
| 					wSize = rSize; | ||||
| 					continue; | ||||
| 				blocknotempty: | ||||
| 					; | ||||
| 				} else if (memcmp(readbuffer, buffer, rSize)==0) { | ||||
| 					// Write, block is unchanged, skip write
 | ||||
| 					wSize = rSize; | ||||
| 					continue; | ||||
| 				} | ||||
| 
 | ||||
| 				// Move the file pointer position back for writing
 | ||||
| 				li.QuadPart = wb; | ||||
| 				if (!SetFilePointerEx(hPhysicalDrive, li, NULL, FILE_BEGIN)) { | ||||
| 					uprintf("Error: Could not reset position - %s", WindowsErrorString()); | ||||
| 					goto out; | ||||
| 				} | ||||
| 				// throttle reading
 | ||||
| 				smartskip_backoff = 15; | ||||
| 			} | ||||
| 
 | ||||
| 			for (i = 1; i <= WRITE_RETRIES; i++) { | ||||
| 				CHECK_FOR_USER_CANCEL; | ||||
| 				s = WriteFile(hPhysicalDrive, buffer, rSize, &wSize, NULL); | ||||
|  | @ -1649,6 +1721,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) | |||
| 	ret = TRUE; | ||||
| out: | ||||
| 	safe_mm_free(buffer); | ||||
| 	safe_mm_free(readbuffer); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										10
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -116,6 +116,7 @@ BOOL enable_HDDs = FALSE, force_update = FALSE, enable_ntfs_compression = FALSE, | |||
| BOOL advanced_mode_device, advanced_mode_format, allow_dual_uefi_bios, detect_fakes, enable_vmdk, force_large_fat32, usb_debug; | ||||
| BOOL use_fake_units, preserve_timestamps = FALSE; | ||||
| BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, enable_file_indexing, large_drive = FALSE, write_as_image = FALSE; | ||||
| BOOL smart_skip = FALSE; | ||||
| int dialog_showing = 0; | ||||
| uint16_t rufus_version[3], embedded_sl_version[2]; | ||||
| char embedded_sl_version_str[2][12] = { "?.??", "?.??" }; | ||||
|  | @ -4319,6 +4320,15 @@ relaunch: | |||
| 		// Alt-Z => Zero the drive
 | ||||
| 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'Z')) { | ||||
| 			zero_drive = TRUE; | ||||
| 			smart_skip = FALSE; | ||||
| 			// Simulate a button click for Start
 | ||||
| 			PostMessage(hDlg, WM_COMMAND, (WPARAM)IDC_START, 0); | ||||
| 			continue; | ||||
| 		} | ||||
| 		// Alt-"-" => Erase the drive (skips empty blocks)
 | ||||
| 		if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == VK_OEM_MINUS)) { | ||||
| 			zero_drive = TRUE; | ||||
| 			smart_skip = TRUE; | ||||
| 			// Simulate a button click for Start
 | ||||
| 			PostMessage(hDlg, WM_COMMAND, (WPARAM)IDC_START, 0); | ||||
| 			continue; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue