mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[core] add and use WriteFileWithRetry() where possible
This commit is contained in:
		
							parent
							
								
									2430c66a68
								
							
						
					
					
						commit
						f2a539a48c
					
				
					 11 changed files with 123 additions and 109 deletions
				
			
		
							
								
								
									
										10
									
								
								src/dos.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/dos.c
									
										
									
									
									
								
							|  | @ -2,7 +2,7 @@ | |||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * DOS boot file extraction, from the FAT12 floppy image in diskcopy.dll | ||||
|  * (MS WinME DOS) or from the embedded FreeDOS resource files | ||||
|  * Copyright © 2011-2015 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2016 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -257,8 +257,8 @@ static BOOL ExtractFAT(int entry, const char* path) | |||
| 		return FALSE; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((!WriteFile(hFile, &DiskImage[filestart], (DWORD)filesize, &Size, 0)) || (filesize != Size)) { | ||||
| 		uprintf("Couldn't write file '%s': %s.\n", filename, WindowsErrorString()); | ||||
| 	if (!WriteFileWithRetry(hFile, &DiskImage[filestart], (DWORD)filesize, &Size, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write file '%s': %s.\n", filename, WindowsErrorString()); | ||||
| 		safe_closehandle(hFile); | ||||
| 		return FALSE; | ||||
| 	} | ||||
|  | @ -394,8 +394,8 @@ BOOL ExtractFreeDOS(const char* path) | |||
| 			return FALSE; | ||||
| 		} | ||||
| 
 | ||||
| 		if ((!WriteFile(hFile, res_data, res_size, &Size, 0)) || (res_size != Size)) { | ||||
| 			uprintf("Couldn't write file '%s': %s.\n", filename, WindowsErrorString()); | ||||
| 		if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) { | ||||
| 			uprintf("Could not write file '%s': %s.\n", filename, WindowsErrorString()); | ||||
| 			safe_closehandle(hFile); | ||||
| 			return FALSE; | ||||
| 		} | ||||
|  |  | |||
							
								
								
									
										10
									
								
								src/drive.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/drive.c
									
										
									
									
									
								
							|  | @ -1065,7 +1065,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m | |||
| 			bufsize = 65536;	// 64K should be enough for everyone
 | ||||
| 			buffer = calloc(bufsize, 1); | ||||
| 			if (buffer != NULL) { | ||||
| 				if ((!WriteFile(hDrive, buffer, bufsize, &size, NULL)) || (size != bufsize)) | ||||
| 				if (!WriteFileWithRetry(hDrive, buffer, bufsize, &size, WRITE_RETRIES)) | ||||
| 					uprintf("  Could not zero MSR: %s", WindowsErrorString()); | ||||
| 				free(buffer); | ||||
| 			} | ||||
|  | @ -1165,12 +1165,8 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m | |||
| 				uprintf("Could not access uefi-ntfs.img"); | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 			r = WriteFile(hDrive, buffer, bufsize, &size, NULL); | ||||
| 			if ((!r) || (size != bufsize)) { | ||||
| 				if (!r) | ||||
| 					uprintf("Write error: %s", WindowsErrorString()); | ||||
| 				else | ||||
| 					uprintf("Write error: Wrote %d bytes, expected %d bytes\n", size, bufsize); | ||||
| 			if(!WriteFileWithRetry(hDrive, buffer, bufsize, &size, WRITE_RETRIES)) { | ||||
| 				uprintf("Write error: %s", WindowsErrorString()); | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
|  | @ -1251,7 +1251,7 @@ static BOOL SetupWinPE(char drive_letter) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if ((!WriteFile(handle, buf, size, &rw_size, NULL)) || (size != rw_size)) { | ||||
| 	if (!WriteFileWithRetry(handle, buf, size, &rw_size, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write patched file: %s\n", WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										29
									
								
								src/icon.c
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								src/icon.c
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Extract icon from executable and set autorun.inf | ||||
|  * Copyright © 2012-2013 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2012-2016 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -103,13 +103,13 @@ static BOOL SaveIcon(const char* filename) | |||
| 	hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, | ||||
| 			NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 	if (hFile == INVALID_HANDLE_VALUE) { | ||||
| 		uprintf("Unable to create icon '%s': %s.\n", filename, WindowsErrorString()); | ||||
| 		uprintf("Unable to create icon '%s': %s.", filename, WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	// Write .ico header
 | ||||
| 	if ((!WriteFile(hFile, icondir, 3*sizeof(WORD), &Size, NULL)) || (Size != 3*sizeof(WORD))) { | ||||
| 		uprintf("Couldn't write icon header: %s.\n", WindowsErrorString()); | ||||
| 	if (!WriteFileWithRetry(hFile, icondir, 3*sizeof(WORD), &Size, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write icon header: %s.", WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -117,15 +117,14 @@ static BOOL SaveIcon(const char* filename) | |||
| 	offset = 3*sizeof(WORD) + icondir->idCount*sizeof(ICONDIRENTRY); | ||||
| 	for (i=0; i<icondir->idCount; i++) { | ||||
| 		// Write the common part of ICONDIRENTRY
 | ||||
| 		if ( (!WriteFile(hFile, &icondir->idEntries[i], sizeof(GRPICONDIRENTRY)-sizeof(WORD), &Size, NULL)) | ||||
| 		   || (Size != sizeof(GRPICONDIRENTRY)-sizeof(WORD)) ) { | ||||
| 			uprintf("Couldn't write ICONDIRENTRY[%d]: %s.\n", i, WindowsErrorString()); | ||||
| 		if (!WriteFileWithRetry(hFile, &icondir->idEntries[i], sizeof(GRPICONDIRENTRY)-sizeof(WORD), &Size, WRITE_RETRIES)) { | ||||
| 			uprintf("Could not write ICONDIRENTRY[%d]: %s.", i, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		res = FindResourceA(hMainInstance, MAKEINTRESOURCEA(icondir->idEntries[i].nID), _RT_ICON); | ||||
| 		// Write the DWORD offset
 | ||||
| 		if ( (!WriteFile(hFile, &offset, sizeof(offset), &Size, NULL)) || (Size != sizeof(offset)) ) { | ||||
| 			uprintf("Couldn't write ICONDIRENTRY[%d] offset: %s.\n", i, WindowsErrorString()); | ||||
| 		if (!WriteFileWithRetry(hFile, &offset, sizeof(offset), &Size, WRITE_RETRIES)) { | ||||
| 			uprintf("Could not write ICONDIRENTRY[%d] offset: %s.", i, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		offset += SizeofResource(NULL, res); | ||||
|  | @ -136,12 +135,12 @@ static BOOL SaveIcon(const char* filename) | |||
| 		res_handle = LoadResource(NULL, res); | ||||
| 		res_data = (BYTE*)LockResource(res_handle); | ||||
| 		res_size = SizeofResource(NULL, res); | ||||
| 		if ( (!WriteFile(hFile, res_data, res_size, &Size, NULL)) || (Size != res_size) ) { | ||||
| 			uprintf("Couldn't write icon data #%d: %s.\n", i, WindowsErrorString()); | ||||
| 		if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) { | ||||
| 			uprintf("Could not write icon data #%d: %s.", i, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
| 	} | ||||
| 	uprintf("Created: %s\n", filename); | ||||
| 	uprintf("Created: %s", filename); | ||||
| 	r = TRUE; | ||||
| 
 | ||||
| out: | ||||
|  | @ -163,14 +162,14 @@ BOOL SetAutorun(const char* path) | |||
| 	safe_sprintf(filename, sizeof(filename), "%sautorun.inf", path); | ||||
| 	fd = fopen(filename, "r");	// If there's an existing autorun, don't overwrite
 | ||||
| 	if (fd != NULL) { | ||||
| 		uprintf("%s already exists - keeping it\n", filename); | ||||
| 		uprintf("%s already exists - keeping it", filename); | ||||
| 		fclose(fd); | ||||
| 		return FALSE; | ||||
| 	} | ||||
| 	// No "/autorun.inf" => create a new one in UTF-16 LE mode
 | ||||
| 	fd = fopen(filename, "w, ccs=UTF-16LE"); | ||||
| 	if (fd == NULL) { | ||||
| 		uprintf("Unable to create %s\n", filename); | ||||
| 		uprintf("Unable to create %s", filename); | ||||
| 		uprintf("NOTE: This may be caused by a poorly designed security solution. " | ||||
| 			"See http://rufus.akeo.ie/compatibility."); | ||||
| 		return FALSE; | ||||
|  | @ -181,7 +180,7 @@ BOOL SetAutorun(const char* path) | |||
| 	fwprintf(fd, L"; Created by %s\n; " LTEXT(RUFUS_URL) L"\n", wRufusVersion); | ||||
| 	fwprintf(fd, L"[autorun]\nicon  = autorun.ico\nlabel = %s\n", wlabel); | ||||
| 	fclose(fd); | ||||
| 	uprintf("Created: %s\n", filename); | ||||
| 	uprintf("Created: %s", filename); | ||||
| 
 | ||||
| 	// .inf -> .ico
 | ||||
| 	filename[strlen(filename)-1] = 'o'; | ||||
|  |  | |||
							
								
								
									
										41
									
								
								src/iso.c
									
										
									
									
									
								
							
							
						
						
									
										41
									
								
								src/iso.c
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * ISO file extraction | ||||
|  * Copyright © 2011-2015 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2016 Pete Batard <pete@akeo.ie> | ||||
|  * Based on libcdio's iso & udf samples: | ||||
|  * Copyright © 2003-2014 Rocky Bernstein <rocky@gnu.org> | ||||
|  * | ||||
|  | @ -429,17 +429,11 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha | |||
| 					goto out; | ||||
| 				} | ||||
| 				buf_size = (DWORD)MIN(i_file_length, i_read); | ||||
| 				for (i=0; i<WRITE_RETRIES; i++) { | ||||
| 					ISO_BLOCKING(r = WriteFile(file_handle, buf, buf_size, &wr_size, NULL)); | ||||
| 					if ((!r) || (buf_size != wr_size)) { | ||||
| 						uprintf("  Error writing file: %s", WindowsErrorString()); | ||||
| 						if (i < WRITE_RETRIES-1) | ||||
| 							uprintf("  RETRYING...\n"); | ||||
| 					} else { | ||||
| 						break; | ||||
| 					} | ||||
| 				ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)); | ||||
| 				if (!r) { | ||||
| 					uprintf("  Error writing file: %s", WindowsErrorString()); | ||||
| 					goto out; | ||||
| 				} | ||||
| 				if (i >= WRITE_RETRIES) goto out; | ||||
| 				i_file_length -= i_read; | ||||
| 				if (nb_blocks++ % PROGRESS_THRESHOLD == 0) | ||||
| 					UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks); | ||||
|  | @ -476,7 +470,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 	HANDLE file_handle = NULL; | ||||
| 	DWORD buf_size, wr_size, err; | ||||
| 	EXTRACT_PROPS props; | ||||
| 	BOOL s, is_symlink, is_identical; | ||||
| 	BOOL is_symlink, is_identical; | ||||
| 	int i_length, r = 1; | ||||
| 	char tmp[128], psz_fullpath[MAX_PATH], *psz_basename, *psz_sanpath; | ||||
| 	const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)]; | ||||
|  | @ -484,7 +478,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 	CdioListNode_t* p_entnode; | ||||
| 	iso9660_stat_t *p_statbuf; | ||||
| 	CdioList_t* p_entlist; | ||||
| 	size_t i, j; | ||||
| 	size_t i; | ||||
| 	lsn_t lsn; | ||||
| 	int64_t i_file_length; | ||||
| 
 | ||||
|  | @ -582,17 +576,11 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 					goto out; | ||||
| 				} | ||||
| 				buf_size = (DWORD)MIN(i_file_length, ISO_BLOCKSIZE); | ||||
| 				for (j=0; j<WRITE_RETRIES; j++) { | ||||
| 					ISO_BLOCKING(s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL)); | ||||
| 					if ((!s) || (buf_size != wr_size)) { | ||||
| 						uprintf("  Error writing file: %s", WindowsErrorString()); | ||||
| 						if (j < WRITE_RETRIES-1) | ||||
| 							uprintf("  RETRYING...\n"); | ||||
| 					} else { | ||||
| 						break; | ||||
| 					} | ||||
| 				ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)); | ||||
| 				if (!r) { | ||||
| 					uprintf("  Error writing file: %s", WindowsErrorString()); | ||||
| 					goto out; | ||||
| 				} | ||||
| 				if (j >= WRITE_RETRIES) goto out; | ||||
| 				i_file_length -= ISO_BLOCKSIZE; | ||||
| 				if (nb_blocks++ % PROGRESS_THRESHOLD == 0) | ||||
| 					UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks); | ||||
|  | @ -918,7 +906,6 @@ int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_f | |||
| 	int64_t file_length, r = 0; | ||||
| 	char buf[UDF_BLOCKSIZE]; | ||||
| 	DWORD buf_size, wr_size; | ||||
| 	BOOL s; | ||||
| 	iso9660_t* p_iso = NULL; | ||||
| 	udf_t* p_udf = NULL; | ||||
| 	udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL; | ||||
|  | @ -957,8 +944,7 @@ int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_f | |||
| 			goto out; | ||||
| 		} | ||||
| 		buf_size = (DWORD)MIN(file_length, read_size); | ||||
| 		s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL); | ||||
| 		if ((!s) || (buf_size != wr_size)) { | ||||
| 		if (!WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)) { | ||||
| 			uprintf("  Error writing file %s: %s\n", dest_file, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
|  | @ -989,8 +975,7 @@ try_iso: | |||
| 			goto out; | ||||
| 		} | ||||
| 		buf_size = (DWORD)MIN(file_length, ISO_BLOCKSIZE); | ||||
| 		s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL); | ||||
| 		if ((!s) || (buf_size != wr_size)) { | ||||
| 		if (!WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)) { | ||||
| 			uprintf("  Error writing file %s: %s\n", dest_file, WindowsErrorString()); | ||||
| 			goto out; | ||||
| 		} | ||||
|  |  | |||
|  | @ -2947,7 +2947,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | |||
| 
 | ||||
| 		hFile = CreateFileU(loc_file, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, | ||||
| 			NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 		if ((hFile == INVALID_HANDLE_VALUE) || (!WriteFile(hFile, loc_data, loc_size, &size, 0)) || (loc_size != size)) { | ||||
| 		if ((hFile == INVALID_HANDLE_VALUE) || (!WriteFileWithRetry(hFile, loc_data, loc_size, &size, WRITE_RETRIES))) { | ||||
| 			uprintf("localization: unable to extract '%s': %s.\n", loc_file, WindowsErrorString()); | ||||
| 			safe_closehandle(hFile); | ||||
| 			goto out; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Copyright © 2011-2015 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2011-2016 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -457,6 +457,8 @@ extern int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid | |||
| extern void LostTranslatorCheck(void); | ||||
| extern LONG ValidateSignature(HWND hDlg, const char* path); | ||||
| extern BOOL IsFontAvailable(const char* font_name); | ||||
| extern BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, | ||||
| 	LPDWORD lpNumberOfBytesWritten, DWORD nNumRetries); | ||||
| 
 | ||||
| DWORD WINAPI FormatThread(void* param); | ||||
| DWORD WINAPI SaveImageThread(void* param); | ||||
|  |  | |||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								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.7.830" | ||||
| CAPTION "Rufus 2.7.831" | ||||
| FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | ||||
| BEGIN | ||||
|     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 | ||||
|  | @ -319,8 +319,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 2,7,830,0 | ||||
|  PRODUCTVERSION 2,7,830,0 | ||||
|  FILEVERSION 2,7,831,0 | ||||
|  PRODUCTVERSION 2,7,831,0 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -337,13 +337,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "2.7.830" | ||||
|             VALUE "FileVersion", "2.7.831" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011-2016 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "2.7.830" | ||||
|             VALUE "ProductVersion", "2.7.831" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  |  | |||
							
								
								
									
										37
									
								
								src/stdfn.c
									
										
									
									
									
								
							
							
						
						
									
										37
									
								
								src/stdfn.c
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Standard Windows function calls | ||||
|  * Copyright © 2013-2015 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2013-2016 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -810,3 +810,38 @@ BOOL SetLGP(BOOL bRestore, BOOL* bExistingKey, const char* szPath, const char* s | |||
| 		return FALSE; | ||||
| 	return (BOOL) r; | ||||
| } | ||||
| 
 | ||||
| BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, | ||||
| 	LPDWORD lpNumberOfBytesWritten, DWORD nNumRetries) | ||||
| { | ||||
| 	DWORD nTry = 1; | ||||
| 	BOOL readFilePointer; | ||||
| 	LARGE_INTEGER liFilePointer, liZero = { {0,0} }; | ||||
| 	static char* retry_msg = " - retrying..."; | ||||
| 
 | ||||
| 	// Need to get the current file pointer in case we need to retry
 | ||||
| 	readFilePointer = SetFilePointerEx(hFile, liZero, &liFilePointer, FILE_CURRENT); | ||||
| 	if (!readFilePointer) | ||||
| 		uprintf("  Warning  - could not read file pointer: %s", WindowsErrorString()); | ||||
| 
 | ||||
| 	do { | ||||
| 		// Need to rewind our file position on retry
 | ||||
| 		if ((nTry > 1) && (!SetFilePointerEx(hFile, liFilePointer, NULL, FILE_BEGIN))) { | ||||
| 			uprintf("  Could not set file pointer%s", retry_msg); | ||||
| 			goto next_try; | ||||
| 		} | ||||
| 		if (WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, NULL)) { | ||||
| 			if (nNumberOfBytesToWrite == *lpNumberOfBytesWritten) | ||||
| 				return TRUE; | ||||
| 			uprintf("  Wrote %d bytes but requested %d%s", *lpNumberOfBytesWritten, | ||||
| 				nNumberOfBytesToWrite, nTry < nNumRetries ? retry_msg : ""); | ||||
| 			SetLastError(ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INCORRECT_SIZE); | ||||
| 		} else { | ||||
| 			uprintf("  Write error%s", nTry < nNumRetries ? retry_msg : ""); | ||||
| 		} | ||||
| next_try: | ||||
| 		Sleep(200); | ||||
| 		nTry++; | ||||
| 	} while((readFilePointer) && (nTry < nNumRetries)); | ||||
| 	return FALSE; | ||||
| } | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|  * | ||||
|  *   Copyright 2003 Lars Munch Christensen - All Rights Reserved | ||||
|  *   Copyright 1998-2008 H. Peter Anvin - All Rights Reserved | ||||
|  *   Copyright 2012-2015 Pete Batard | ||||
|  *   Copyright 2012-2016 Pete Batard | ||||
|  * | ||||
|  *   Based on the Linux installer program for SYSLINUX by H. Peter Anvin | ||||
|  * | ||||
|  | @ -137,16 +137,16 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 				img_report.sl_version_ext, ldlinux, i==0?"sys":"bss"); | ||||
| 			fd = fopen(path, "rb"); | ||||
| 			if (fd == NULL) { | ||||
| 				uprintf("Could not open %s\n", path); | ||||
| 				uprintf("Could not open %s", path); | ||||
| 				goto out; | ||||
| 			} | ||||
| 			length = fread(syslinux_ldlinux[i], 1, (size_t)syslinux_ldlinux_len[i], fd); | ||||
| 			fclose(fd); | ||||
| 			if (length != (size_t)syslinux_ldlinux_len[i]) { | ||||
| 				uprintf("Could not read %s\n", path); | ||||
| 				uprintf("Could not read %s", path); | ||||
| 				goto out; | ||||
| 			} | ||||
| 			uprintf("Using existing './%s'\n", path); | ||||
| 			uprintf("Using existing './%s'", path); | ||||
| 		} | ||||
| 	} else { | ||||
| 		for (i=0; i<2; i++) { | ||||
|  | @ -167,38 +167,36 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 			  FILE_ATTRIBUTE_HIDDEN, NULL); | ||||
| 
 | ||||
| 	if (f_handle == INVALID_HANDLE_VALUE) { | ||||
| 		uprintf("Unable to create '%s'\n", &path[3]); | ||||
| 		uprintf("Unable to create '%s'", &path[3]); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Write ldlinux.sys file */ | ||||
| 	if (!WriteFile(f_handle, (const char _force *)syslinux_ldlinux[0], | ||||
| 		   syslinux_ldlinux_len[0], &bytes_written, NULL) || | ||||
| 		bytes_written != syslinux_ldlinux_len[0]) { | ||||
| 		uprintf("Could not write '%s'\n", &path[3]); | ||||
| 	if (!WriteFileWithRetry(f_handle, (const char _force *)syslinux_ldlinux[0], | ||||
| 		   syslinux_ldlinux_len[0], &bytes_written, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write '%s': %s", &path[3], WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
| 	if (!WriteFile(f_handle, syslinux_adv, 2 * ADV_SIZE, | ||||
| 		   &bytes_written, NULL) || | ||||
| 		bytes_written != 2 * ADV_SIZE) { | ||||
| 		uprintf("Could not write ADV to '%s'\n", &path[3]); | ||||
| 	if (!WriteFileWithRetry(f_handle, syslinux_adv, 2 * ADV_SIZE, | ||||
| 		   &bytes_written, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write ADV to '%s': %s", &path[3], WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	uprintf("Successfully wrote '%s'\n", &path[3]); | ||||
| 	uprintf("Successfully wrote '%s'", &path[3]); | ||||
| 	if (bt != BT_ISO) | ||||
| 		UpdateProgress(OP_DOS, -1.0f); | ||||
| 
 | ||||
| 	/* Now flush the media */ | ||||
| 	if (!FlushFileBuffers(f_handle)) { | ||||
| 		uprintf("FlushFileBuffers failed\n"); | ||||
| 		uprintf("FlushFileBuffers failed"); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Reopen the volume (we already have a lock) */ | ||||
| 	d_handle = GetLogicalHandle(drive_index, TRUE, FALSE); | ||||
| 	if (d_handle == INVALID_HANDLE_VALUE) { | ||||
| 		uprintf("Could open volume for Syslinux installation\n"); | ||||
| 		uprintf("Could open volume for Syslinux installation"); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -242,7 +240,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 	case FS_EXFAT: | ||||
| 		fs = libfat_open(libfat_readfile, (intptr_t) d_handle); | ||||
| 		if (fs == NULL) { | ||||
| 			uprintf("Syslinux FAT access error\n"); | ||||
| 			uprintf("Syslinux FAT access error"); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		ldlinux_cluster = libfat_searchdir(fs, 0, "LDLINUX SYS", NULL); | ||||
|  | @ -257,7 +255,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 		libfat_close(fs); | ||||
| 		break; | ||||
| 	default: | ||||
| 		uprintf("Unsupported Syslinux filesystem\n"); | ||||
| 		uprintf("Unsupported Syslinux filesystem"); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -269,9 +267,8 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 
 | ||||
| 	/* Rewrite the file */ | ||||
| 	if (SetFilePointer(f_handle, 0, NULL, FILE_BEGIN) != 0 || | ||||
| 		!WriteFile(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0], | ||||
| 			   &bytes_written, NULL) | ||||
| 		|| bytes_written != syslinux_ldlinux_len[0]) { | ||||
| 		!WriteFileWithRetry(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0], | ||||
| 			   &bytes_written, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write '%s': %s\n", &path[3], WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
|  | @ -282,9 +279,12 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 	/* Read existing FAT data into boot sector */ | ||||
| 	if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 || | ||||
| 		!ReadFile(d_handle, sectbuf, SECTOR_SIZE, | ||||
| 			   &bytes_read, NULL) | ||||
| 		|| bytes_read != SECTOR_SIZE) { | ||||
| 		uprintf("Could not read boot record: %s\n", WindowsErrorString()); | ||||
| 			   &bytes_read, NULL)) { | ||||
| 		uprintf("Could not read Syslinux boot record: %s", WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
| 	if (bytes_read < SECTOR_SIZE) { | ||||
| 		uprintf("Partial read of Syslinux boot record: read %d bytes but requested %d", bytes_read, SECTOR_SIZE); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -293,14 +293,12 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 
 | ||||
| 	/* Write boot sector back */ | ||||
| 	if (SetFilePointer(d_handle, 0, NULL, FILE_BEGIN) != 0 || | ||||
| 		!WriteFile(d_handle, sectbuf, SECTOR_SIZE, | ||||
| 			   &bytes_written, NULL) | ||||
| 		|| bytes_written != SECTOR_SIZE) { | ||||
| 		uprintf("Could not write Syslinux boot record: %s\n", WindowsErrorString()); | ||||
| 		!WriteFileWithRetry(d_handle, sectbuf, SECTOR_SIZE, | ||||
| 			   &bytes_written, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write Syslinux boot record: %s", WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	uprintf("Successfully wrote Syslinux boot record\n"); | ||||
| 	uprintf("Successfully wrote Syslinux boot record"); | ||||
| 
 | ||||
| 	if (bt == BT_SYSLINUX_V6) { | ||||
| 		IGNORE_RETVAL(_chdirU(app_dir)); | ||||
|  | @ -309,17 +307,17 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 		static_sprintf(path, "%C:\\%s.%s", drive_letter, ldlinux, ldlinux_ext[2]); | ||||
| 		fd = fopen(&path[3], "rb"); | ||||
| 		if (fd == NULL) { | ||||
| 			uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!\n", &path[3]); | ||||
| 			uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!", &path[3]); | ||||
| 		} else { | ||||
| 			fclose(fd); | ||||
| 			if (CopyFileA(&path[3], path, TRUE)) { | ||||
| 				uprintf("Created '%s' (from '%s/%s-%s/%s')", path, FILES_DIR, syslinux, embedded_sl_version_str[1], &path[3]); | ||||
| 			} else { | ||||
| 				uprintf("Failed to create '%s': %s\n", path, WindowsErrorString()); | ||||
| 				uprintf("Failed to create '%s': %s", path, WindowsErrorString()); | ||||
| 			} | ||||
| 		} | ||||
| 	} else if (IS_REACTOS(img_report)) { | ||||
| 		uprintf("Setting up ReactOS...\n"); | ||||
| 		uprintf("Setting up ReactOS..."); | ||||
| 		syslinux_mboot = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_SL_MBOOT_C32), | ||||
| 			_RT_RCDATA, "mboot.c32", &syslinux_mboot_len, FALSE); | ||||
| 		if (syslinux_mboot == NULL) { | ||||
|  | @ -334,21 +332,20 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) | |||
| 			uprintf("Unable to create '%s'\n", path); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		if (!WriteFile(f_handle, syslinux_mboot, syslinux_mboot_len, | ||||
| 			   &bytes_written, NULL) || | ||||
| 			bytes_written != syslinux_mboot_len) { | ||||
| 			uprintf("Could not write '%s'\n", path); | ||||
| 		if (!WriteFileWithRetry(f_handle, syslinux_mboot, syslinux_mboot_len, | ||||
| 			   &bytes_written, WRITE_RETRIES)) { | ||||
| 			uprintf("Could not write '%s'", path); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		safe_closehandle(f_handle); | ||||
| 		static_sprintf(path, "%C:\\syslinux.cfg", drive_letter); | ||||
| 		fd = fopen(path, "w"); | ||||
| 		if (fd == NULL) { | ||||
| 			uprintf("Could not create ReactOS 'syslinux.cfg'\n"); | ||||
| 			uprintf("Could not create ReactOS 'syslinux.cfg'"); | ||||
| 			goto out; | ||||
| 		} | ||||
| 		/* Write the syslinux.cfg for ReactOS */ | ||||
| 		fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n  KERNEL %s\n  APPEND %s\n", | ||||
| 		fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n  KERNEL %s\n  APPEND %s", | ||||
| 			mboot_c32, img_report.reactos_path); | ||||
| 		fclose(fd); | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  * Rufus: The Reliable USB Formatting Utility | ||||
|  * Virtual Disk Handling functions | ||||
|  * Copyright © 2013-2015 Pete Batard <pete@akeo.ie> | ||||
|  * Copyright © 2013-2016 Pete Batard <pete@akeo.ie> | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  | @ -207,7 +207,7 @@ BOOL AppendVHDFooter(const char* vhd_path) | |||
| 		checksum += ((uint8_t*)footer)[i]; | ||||
| 	footer->checksum = bswap_uint32(~checksum); | ||||
| 
 | ||||
| 	if (!WriteFile(handle, footer, sizeof(vhd_footer), &size, NULL) || (size != sizeof(vhd_footer))) { | ||||
| 	if (!WriteFileWithRetry(handle, footer, sizeof(vhd_footer), &size, WRITE_RETRIES)) { | ||||
| 		uprintf("Could not write VHD footer: %s", WindowsErrorString()); | ||||
| 		goto out; | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue