mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[iso] add support for VMWare ESXi 5.1
* Closes #98 * Also closes #113 * Also improves on the ISO analysis report
This commit is contained in:
		
							parent
							
								
									638f7876c4
								
							
						
					
					
						commit
						13a6b6b751
					
				
					 5 changed files with 86 additions and 60 deletions
				
			
		
							
								
								
									
										57
									
								
								src/iso.c
									
										
									
									
									
								
							
							
						
						
									
										57
									
								
								src/iso.c
									
										
									
									
									
								
							|  | @ -58,10 +58,10 @@ static const char* psz_extract_dir; | |||
| static const char* bootmgr_name = "bootmgr"; | ||||
| static const char* ldlinux_name = "ldlinux.sys"; | ||||
| static const char* isolinux_name[] = { "isolinux.cfg", "syslinux.cfg", "extlinux.conf"}; | ||||
| static const char* vesamenu_name = "vesamenu.c32"; | ||||
| static const char* pe_dirname[] = { "/i386", "/minint" }; | ||||
| static const char* pe_file[] = { "ntdetect.com", "setupldr.bin", "txtsetup.sif" }; | ||||
| static int64_t old_vesamenu_threshold = 145000; | ||||
| static const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES; | ||||
| static const int64_t old_c32_threshold[NB_OLD_C32] = OLD_C32_THRESHOLD; | ||||
| static uint8_t i_joliet_level = 0; | ||||
| static uint64_t total_blocks, nb_blocks; | ||||
| static BOOL scan_only = FALSE; | ||||
|  | @ -102,7 +102,7 @@ static void log_handler (cdio_log_level_t level, const char *message) | |||
|  * Scan and set ISO properties | ||||
|  * Returns true if the the current file does not need to be processed further | ||||
|  */ | ||||
| static __inline BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_cfg, BOOL* is_old_vesamenu,  | ||||
| static __inline BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_cfg, BOOL* is_old_c32,  | ||||
| 	int64_t i_file_length, const char* psz_basename, const char* psz_fullpath) | ||||
| { | ||||
| 	size_t i, j; | ||||
|  | @ -114,10 +114,11 @@ static __inline BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_ | |||
| 			*is_syslinux_cfg = TRUE; | ||||
| 	} | ||||
| 
 | ||||
| 	// Check for an old vesamenu.c32 file anywhere
 | ||||
| 	*is_old_vesamenu = FALSE; | ||||
| 	if ((safe_stricmp(psz_basename, vesamenu_name) == 0) && (i_file_length <= old_vesamenu_threshold)) { | ||||
| 		*is_old_vesamenu = TRUE; | ||||
| 	// Check for an old incompatible c32 file anywhere
 | ||||
| 	for (i=0; i<NB_OLD_C32; i++) { | ||||
| 		is_old_c32[i] = FALSE; | ||||
| 		if ((safe_stricmp(psz_basename, old_c32_name[i]) == 0) && (i_file_length <= old_c32_threshold[i])) | ||||
| 			is_old_c32[i] = TRUE; | ||||
| 	} | ||||
| 
 | ||||
| 	if (scan_only) { | ||||
|  | @ -137,8 +138,10 @@ static __inline BOOL check_iso_props(const char* psz_dirname, BOOL* is_syslinux_ | |||
| 			// Maintain a list of all the isolinux/syslinux configs identified so far
 | ||||
| 			StrArrayAdd(&config_path, psz_fullpath); | ||||
| 		} | ||||
| 		if (*is_old_vesamenu) | ||||
| 			iso_report.has_old_vesamenu = TRUE; | ||||
| 		for (i=0; i<NB_OLD_C32; i++) { | ||||
| 			if (is_old_c32[i]) | ||||
| 				iso_report.has_old_c32[i] = TRUE; | ||||
| 		} | ||||
| 		if (i_file_length >= FOUR_GIGABYTES) | ||||
| 			iso_report.has_4GB_file = TRUE; | ||||
| 		// Compute projected size needed
 | ||||
|  | @ -161,7 +164,7 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha | |||
| { | ||||
| 	HANDLE file_handle = NULL; | ||||
| 	DWORD buf_size, wr_size; | ||||
| 	BOOL r, is_syslinux_cfg, is_old_vesamenu; | ||||
| 	BOOL r, is_syslinux_cfg, is_old_c32[NB_OLD_C32]; | ||||
| 	int i_length; | ||||
| 	size_t i, nul_pos; | ||||
| 	char* psz_fullpath = NULL; | ||||
|  | @ -195,7 +198,7 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha | |||
| 			} | ||||
| 		} else { | ||||
| 			i_file_length = udf_get_file_length(p_udf_dirent); | ||||
| 			if (check_iso_props(psz_path, &is_syslinux_cfg, &is_old_vesamenu, i_file_length, psz_basename, psz_fullpath)) { | ||||
| 			if (check_iso_props(psz_path, &is_syslinux_cfg, is_old_c32, i_file_length, psz_basename, psz_fullpath)) { | ||||
| 				safe_free(psz_fullpath); | ||||
| 				continue; | ||||
| 			} | ||||
|  | @ -207,13 +210,17 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha | |||
| 			SetWindowTextU(hISOFileName, psz_fullpath); | ||||
| 			// Remove the appended size for extraction
 | ||||
| 			psz_fullpath[nul_pos] = 0; | ||||
| 			if (is_old_vesamenu && use_own_vesamenu) { | ||||
| 				if (CopyFileA("vesamenu.c32", psz_fullpath, FALSE)) { | ||||
| 					uprintf("  Replaced with local version\n"); | ||||
| 					continue; | ||||
| 			for (i=0; i<NB_OLD_C32; i++) { | ||||
| 				if (is_old_c32[i] && use_own_c32[i]) { | ||||
| 					if (CopyFileA(old_c32_name[i], psz_fullpath, FALSE)) { | ||||
| 						uprintf("  Replaced with local version\n"); | ||||
| 						break; | ||||
| 					} | ||||
| 					uprintf("  Could not replace file: %s\n", WindowsErrorString()); | ||||
| 				} | ||||
| 				uprintf("  Could not replace file: %s\n", WindowsErrorString()); | ||||
| 			} | ||||
| 			if (i < NB_OLD_C32) | ||||
| 				continue; | ||||
| 			file_handle = CreateFileU(psz_fullpath, GENERIC_READ | GENERIC_WRITE, | ||||
| 				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 			if (file_handle == INVALID_HANDLE_VALUE) { | ||||
|  | @ -270,7 +277,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| { | ||||
| 	HANDLE file_handle = NULL; | ||||
| 	DWORD buf_size, wr_size; | ||||
| 	BOOL s, is_syslinux_cfg, is_old_vesamenu; | ||||
| 	BOOL s, is_syslinux_cfg, is_old_c32[NB_OLD_C32]; | ||||
| 	int i_length, r = 1; | ||||
| 	char psz_fullpath[1024], *psz_basename; | ||||
| 	const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)]; | ||||
|  | @ -310,7 +317,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 				goto out; | ||||
| 		} else { | ||||
| 			i_file_length = p_statbuf->size; | ||||
| 			if (check_iso_props(psz_path, &is_syslinux_cfg, &is_old_vesamenu, i_file_length, psz_basename, psz_fullpath)) { | ||||
| 			if (check_iso_props(psz_path, &is_syslinux_cfg, is_old_c32, i_file_length, psz_basename, psz_fullpath)) { | ||||
| 				continue; | ||||
| 			} | ||||
| 			// Replace slashes with backslashes and append the size to the path for UI display
 | ||||
|  | @ -322,13 +329,17 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | |||
| 			// ISO9660 cannot handle backslashes
 | ||||
| 			for (i=0; i<nul_pos; i++) if (psz_fullpath[i] == '\\') psz_fullpath[i] = '/'; | ||||
| 			psz_fullpath[nul_pos] = 0; | ||||
| 			if (is_old_vesamenu && use_own_vesamenu) { | ||||
| 				if (CopyFileA("vesamenu.c32", psz_fullpath, FALSE)) { | ||||
| 					uprintf("  Replaced with local version\n"); | ||||
| 					continue; | ||||
| 			for (i=0; i<NB_OLD_C32; i++) { | ||||
| 				if (is_old_c32[i] && use_own_c32[i]) { | ||||
| 					if (CopyFileA(old_c32_name[i], psz_fullpath, FALSE)) { | ||||
| 						uprintf("  Replaced with local version\n"); | ||||
| 						break; | ||||
| 					} | ||||
| 					uprintf("  Could not replace file: %s\n", WindowsErrorString()); | ||||
| 				} | ||||
| 				uprintf("  Could not replace file: %s\n", WindowsErrorString()); | ||||
| 			} | ||||
| 			if (i < NB_OLD_C32) | ||||
| 				continue; | ||||
| 			file_handle = CreateFileU(psz_fullpath, GENERIC_READ | GENERIC_WRITE, | ||||
| 				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 			if (file_handle == INVALID_HANDLE_VALUE) { | ||||
|  |  | |||
|  | @ -81,7 +81,7 @@ static wchar_t* get_token_data_line(const wchar_t* wtoken, wchar_t* wline) | |||
| 	// locate end of string or quote
 | ||||
| 	while ( (wline[i] != 0) && ((wline[i] != L'"') || ((wline[i] == L'"') && (!quoteth))) ) | ||||
| 		i++; | ||||
| 	wline[i] = 0; | ||||
| 	wline[i--] = 0; | ||||
| 
 | ||||
| 	// Eliminate trailing EOL characters
 | ||||
| 	while ((i>=r) && ((wline[i] == L'\r') || (wline[i] == L'\n'))) | ||||
|  |  | |||
							
								
								
									
										66
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										66
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -103,7 +103,7 @@ float fScale = 1.0f; | |||
| int default_fs; | ||||
| HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses, hLog = NULL; | ||||
| HWND hISOProgressDlg = NULL, hLogDlg = NULL, hISOProgressBar, hISOFileName, hDiskID; | ||||
| BOOL use_own_vesamenu = FALSE, detect_fakes = TRUE, mbr_selected_by_user = FALSE; | ||||
| BOOL use_own_c32[NB_OLD_C32] = {FALSE, FALSE}, detect_fakes = TRUE, mbr_selected_by_user = FALSE; | ||||
| BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE; | ||||
| int dialog_showing = 0; | ||||
| uint16_t rufus_version[4]; | ||||
|  | @ -1247,7 +1247,9 @@ DWORD WINAPI ISOScanThread(LPVOID param) | |||
| { | ||||
| 	int i; | ||||
| 	FILE* fd; | ||||
| 	const char* vesamenu_filename = "vesamenu.c32"; | ||||
| 	const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES; | ||||
| 	const char* new_c32_url[NB_OLD_C32] = NEW_C32_URL; | ||||
| 	char msg[1024], msg_title[32]; | ||||
| 
 | ||||
| 	if (iso_path == NULL) | ||||
| 		goto out; | ||||
|  | @ -1258,10 +1260,14 @@ DWORD WINAPI ISOScanThread(LPVOID param) | |||
| 		safe_free(iso_path); | ||||
| 		goto out; | ||||
| 	} | ||||
| 	uprintf("ISO label: '%s'\r\n size: %lld bytes, 4GB:%c, bootmgr:%c, winpe:%c (/minint:%c), isolinux:%c, old vesa:%c\n", | ||||
| 		iso_report.label, iso_report.projected_size, iso_report.has_4GB_file?'Y':'N', | ||||
| 		iso_report.has_bootmgr?'Y':'N', IS_WINPE(iso_report.winpe)?'Y':'N', (iso_report.uses_minint)?'Y':'N', | ||||
| 		iso_report.has_isolinux?'Y':'N', iso_report.has_old_vesamenu?'Y':'N'); | ||||
| 	uprintf("ISO label: '%s'\r\n  Size: %lld bytes\r\n  Has a >4GB file: %s\r\n  Uses Bootmgr: %s\r\n  Uses WinPE: %s%s\r\n  Uses isolinux: %s\n", | ||||
| 		iso_report.label, iso_report.projected_size, iso_report.has_4GB_file?"Yes":"No", iso_report.has_bootmgr?"Yes":"No", | ||||
| 		IS_WINPE(iso_report.winpe)?"Yes":"No", (iso_report.uses_minint)?" (with /minint)":"", iso_report.has_isolinux?"Yes":"No"); | ||||
| 	if (iso_report.has_isolinux) { | ||||
| 		for (i=0; i<NB_OLD_C32; i++) { | ||||
| 			uprintf("    With an old %s: %s\n", old_c32_name[i], iso_report.has_old_c32[i]?"Yes":"No"); | ||||
| 		} | ||||
| 	} | ||||
| 	if ((!iso_report.has_bootmgr) && (!iso_report.has_isolinux) && (!IS_WINPE(iso_report.winpe))) { | ||||
| 		MessageBoxU(hMainDialog, "This version of Rufus only supports bootable ISOs\n" | ||||
| 			"based on 'bootmgr/WinPE' or 'isolinux'.\n" | ||||
|  | @ -1269,29 +1275,31 @@ DWORD WINAPI ISOScanThread(LPVOID param) | |||
| 		safe_free(iso_path); | ||||
| 		SetMBRProps(); | ||||
| 	} else { | ||||
| 		if (iso_report.has_old_vesamenu) { | ||||
| 			fd = fopen(vesamenu_filename, "rb"); | ||||
| 			if (fd != NULL) { | ||||
| 				// If a file already exists in the current directory, use that one
 | ||||
| 				uprintf("Will replace obsolete '%s' from ISO with the one found in current directory\n", vesamenu_filename); | ||||
| 				fclose(fd); | ||||
| 				use_own_vesamenu = TRUE; | ||||
| 			} else { | ||||
| 				PrintStatus(0, FALSE, "Obsolete vesamenu.c32 detected"); | ||||
| 				if (MessageBoxA(hMainDialog, | ||||
| 					"This ISO image seems to use an obsolete version of vesamenu.c32\n" | ||||
| 					"that may prevent boot menus from displaying properly...\n\n" | ||||
| 					"Rufus can fix this issue by downloading a newer version for you:\n" | ||||
| 					"- Select 'Yes' to connect to the internet and replace the file.\n" | ||||
| 					"- Select 'No' to leave the existing ISO file unmodified.\n" | ||||
| 					"If you don't know what to do, you should select 'Yes'.\n\n" | ||||
| 					"Note: the file will be downloaded in the current directory. Once a\n" | ||||
| 					"vesamenu.c32 exists there, it will always be used as replacement.\n", "Replace vesamenu.c32?", | ||||
| 					MB_YESNO|MB_ICONWARNING) == IDYES) { | ||||
| 					SetWindowTextU(hISOProgressDlg, "Downloading file..."); | ||||
| 					SetWindowTextU(hISOFileName, VESAMENU_URL); | ||||
| 					if (DownloadFile(VESAMENU_URL, vesamenu_filename, hISOProgressDlg)) | ||||
| 						use_own_vesamenu = TRUE; | ||||
| 		for(i=0; i<NB_OLD_C32; i++) { | ||||
| 			if (iso_report.has_old_c32[i]) { | ||||
| 				fd = fopen(old_c32_name[i], "rb"); | ||||
| 				if (fd != NULL) { | ||||
| 					// If a file already exists in the current directory, use that one
 | ||||
| 					uprintf("Will replace obsolete '%s' from ISO with the one found in current directory\n", old_c32_name[i]); | ||||
| 					fclose(fd); | ||||
| 					use_own_c32[i] = TRUE; | ||||
| 				} else { | ||||
| 					PrintStatus(0, FALSE, "Obsolete %s detected", old_c32_name[i]); | ||||
| 					safe_sprintf(msg, sizeof(msg), "This ISO image seems to use an obsolete version of %s\n" | ||||
| 						"that may prevent boot menus from displaying properly...\n\n" | ||||
| 						"Rufus can fix this issue by downloading a newer version for you:\n" | ||||
| 						"- Select 'Yes' to connect to the internet and replace the file.\n" | ||||
| 						"- Select 'No' to leave the existing ISO file unmodified.\n" | ||||
| 						"If you don't know what to do, you should select 'Yes'.\n\n" | ||||
| 						"Note: the file will be downloaded in the current directory. Once a\n" | ||||
| 						"%s exists there, it will always be used as replacement.\n", old_c32_name[i], old_c32_name[i]); | ||||
| 					safe_sprintf(msg_title, sizeof(msg_title), "Replace %s?", old_c32_name[i]); | ||||
| 					if (MessageBoxA(hMainDialog, msg, msg_title, MB_YESNO|MB_ICONWARNING) == IDYES) { | ||||
| 						SetWindowTextU(hISOProgressDlg, "Downloading file..."); | ||||
| 						SetWindowTextU(hISOFileName, new_c32_url[i]); | ||||
| 						if (DownloadFile(new_c32_url[i], old_c32_name[i], hISOProgressDlg)) | ||||
| 							use_own_c32[i] = TRUE; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
							
								
								
									
										11
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/rufus.h
									
										
									
									
									
								
							|  | @ -43,7 +43,6 @@ | |||
| #define WHITE                       RGB(255,255,255) | ||||
| #define SEPARATOR_GREY              RGB(223,223,223) | ||||
| #define RUFUS_URL                   "http://rufus.akeo.ie"
 | ||||
| #define VESAMENU_URL                "http://cloud.github.com/downloads/pbatard/rufus/vesamenu.c32"
 | ||||
| #define IGNORE_RETVAL(expr)         do { (void)(expr); } while(0) | ||||
| #ifndef ARRAYSIZE | ||||
| #define ARRAYSIZE(A)                (sizeof(A)/sizeof((A)[0])) | ||||
|  | @ -157,10 +156,17 @@ typedef struct { | |||
| 	} ClusterSize[FS_MAX]; | ||||
| } RUFUS_DRIVE_INFO; | ||||
| 
 | ||||
| /* Special handling for old .c32 files we need to replace */ | ||||
| #define NB_OLD_C32          2 | ||||
| #define OLD_C32_NAMES       {"menu.c32", "vesamenu.c32"} | ||||
| #define OLD_C32_THRESHOLD   {53500, 145000} | ||||
| #define NEW_C32_URL         {RUFUS_URL "/downloads/menu.c32", RUFUS_URL "/downloads/vesamenu.c32"} | ||||
| 
 | ||||
| /* ISO details that the application may want */ | ||||
| #define WINPE_MININT    0x2A | ||||
| #define WINPE_I386      0x15 | ||||
| #define IS_WINPE(r)     (((r&WINPE_MININT) == WINPE_MININT)||((r&WINPE_I386) == WINPE_I386)) | ||||
| 
 | ||||
| typedef struct { | ||||
| 	char label[192];		/* 3*64 to account for UTF-8 */ | ||||
| 	char usb_label[192];	/* converted USB label for workaround */ | ||||
|  | @ -171,6 +177,7 @@ typedef struct { | |||
| 	BOOL has_bootmgr; | ||||
| 	BOOL has_isolinux; | ||||
| 	BOOL has_autorun; | ||||
| 	BOOL has_old_c32[NB_OLD_C32]; | ||||
| 	BOOL has_old_vesamenu; | ||||
| 	BOOL uses_minint; | ||||
| } RUFUS_ISO_REPORT; | ||||
|  | @ -217,7 +224,7 @@ extern char* iso_path; | |||
| extern DWORD FormatStatus; | ||||
| extern RUFUS_DRIVE_INFO SelectedDrive; | ||||
| extern const int nb_steps[FS_MAX]; | ||||
| extern BOOL use_own_vesamenu, detect_fakes, iso_op_in_progress, format_op_in_progress; | ||||
| extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress; | ||||
| extern RUFUS_ISO_REPORT iso_report; | ||||
| extern int64_t iso_blocking_status; | ||||
| extern uint16_t rufus_version[4]; | ||||
|  |  | |||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | |||
| IDD_DIALOG DIALOGEX 12, 12, 206, 316 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_APPWINDOW | ||||
| CAPTION "Rufus v1.3.0.210" | ||||
| CAPTION "Rufus v1.3.0.211" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,278,50,14 | ||||
|  | @ -274,8 +274,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 1,3,0,210 | ||||
|  PRODUCTVERSION 1,3,0,210 | ||||
|  FILEVERSION 1,3,0,211 | ||||
|  PRODUCTVERSION 1,3,0,211 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -292,13 +292,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "1.3.0.210" | ||||
|             VALUE "FileVersion", "1.3.0.211" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "(c) 2011-2012 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "1.3.0.210" | ||||
|             VALUE "ProductVersion", "1.3.0.211" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue