mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[ui] perform ISO download feature check in a background thread
This commit is contained in:
		
							parent
							
								
									a1d605f206
								
							
						
					
					
						commit
						94a2699640
					
				
					 5 changed files with 67 additions and 41 deletions
				
			
		|  | @ -6,6 +6,7 @@ o Version 3.11 (2020.06.??) | ||||||
|     Add a cheat mode (Alt-P) to toggle a GPT ESP to Basic Data (Windows 10 only) |     Add a cheat mode (Alt-P) to toggle a GPT ESP to Basic Data (Windows 10 only) | ||||||
|     Fix improper x86 32-bit NTFS driver being used for UEFI:NTFS |     Fix improper x86 32-bit NTFS driver being used for UEFI:NTFS | ||||||
|     Improve UEFI:NTFS compatibility with older UEFI firmwares |     Improve UEFI:NTFS compatibility with older UEFI firmwares | ||||||
|  |     Improve startup time by running the ISO download feature check in the background | ||||||
|     Remove Ubuntu's splash screen for persistent UEFI drives |     Remove Ubuntu's splash screen for persistent UEFI drives | ||||||
|     Enable ASLR for the Rufus executable |     Enable ASLR for the Rufus executable | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -116,7 +116,7 @@ BOOL enable_HDDs = FALSE, enable_VHDs = TRUE, enable_ntfs_compression = FALSE, n | ||||||
| BOOL advanced_mode_device, advanced_mode_format, allow_dual_uefi_bios, detect_fakes, enable_vmdk, force_large_fat32, usb_debug; | 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, fast_zeroing = FALSE, app_changed_size = FALSE; | BOOL use_fake_units, preserve_timestamps = FALSE, fast_zeroing = FALSE, app_changed_size = FALSE; | ||||||
| BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, enable_file_indexing, large_drive = FALSE; | BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, enable_file_indexing, large_drive = FALSE; | ||||||
| BOOL write_as_image = FALSE, write_as_esp = FALSE, installed_uefi_ntfs = FALSE, enable_fido = FALSE, use_vds = FALSE; | BOOL write_as_image = FALSE, write_as_esp = FALSE, installed_uefi_ntfs = FALSE, use_vds = FALSE; | ||||||
| float fScale = 1.0f; | float fScale = 1.0f; | ||||||
| int dialog_showing = 0, selection_default = BT_IMAGE, windows_to_go_selection = 0, persistence_unit_selection = -1; | int dialog_showing = 0, selection_default = BT_IMAGE, windows_to_go_selection = 0, persistence_unit_selection = -1; | ||||||
| int default_fs, fs_type, boot_type, partition_type, target_type; // file system, boot type, partition type, target type
 | int default_fs, fs_type, boot_type, partition_type, target_type; // file system, boot type, partition type, target type
 | ||||||
|  | @ -3286,7 +3286,6 @@ relaunch: | ||||||
| 	image_option_txt[0] = 0; | 	image_option_txt[0] = 0; | ||||||
| 	select_index = 0; | 	select_index = 0; | ||||||
| 	safe_free(fido_url); | 	safe_free(fido_url); | ||||||
| 	enable_fido = FALSE; |  | ||||||
| 	SetProcessDefaultLayout(right_to_left_mode ? LAYOUT_RTL : 0); | 	SetProcessDefaultLayout(right_to_left_mode ? LAYOUT_RTL : 0); | ||||||
| 	if (get_loc_data_file(loc_file, selected_locale)) | 	if (get_loc_data_file(loc_file, selected_locale)) | ||||||
| 		WriteSettingStr(SETTING_LOCALE, selected_locale->txt[0]); | 		WriteSettingStr(SETTING_LOCALE, selected_locale->txt[0]); | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 232, 326 | IDD_DIALOG DIALOGEX 12, 12, 232, 326 | ||||||
| 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 3.11.1675" | CAPTION "Rufus 3.11.1676" | ||||||
| FONT 9, "Segoe UI Symbol", 400, 0, 0x0 | FONT 9, "Segoe UI Symbol", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     LTEXT           "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP |     LTEXT           "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP | ||||||
|  | @ -395,8 +395,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 3,11,1675,0 |  FILEVERSION 3,11,1676,0 | ||||||
|  PRODUCTVERSION 3,11,1675,0 |  PRODUCTVERSION 3,11,1676,0 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -414,13 +414,13 @@ BEGIN | ||||||
|             VALUE "Comments", "https://rufus.ie" |             VALUE "Comments", "https://rufus.ie" | ||||||
|             VALUE "CompanyName", "Akeo Consulting" |             VALUE "CompanyName", "Akeo Consulting" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "3.11.1675" |             VALUE "FileVersion", "3.11.1676" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" |             VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" | ||||||
|             VALUE "OriginalFilename", "rufus-3.11.exe" |             VALUE "OriginalFilename", "rufus-3.11.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "3.11.1675" |             VALUE "ProductVersion", "3.11.1676" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
							
								
								
									
										74
									
								
								src/stdlg.c
									
										
									
									
									
								
							
							
						
						
									
										74
									
								
								src/stdlg.c
									
										
									
									
									
								
							|  | @ -45,7 +45,7 @@ | ||||||
| #include "license.h" | #include "license.h" | ||||||
| 
 | 
 | ||||||
| /* Globals */ | /* Globals */ | ||||||
| extern BOOL is_x86_32, enable_fido; | extern BOOL is_x86_32; | ||||||
| static HICON hMessageIcon = (HICON)INVALID_HANDLE_VALUE; | static HICON hMessageIcon = (HICON)INVALID_HANDLE_VALUE; | ||||||
| static char* szMessageText = NULL; | static char* szMessageText = NULL; | ||||||
| static char* szMessageTitle = NULL; | static char* szMessageTitle = NULL; | ||||||
|  | @ -1497,6 +1497,55 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l | ||||||
| 	return (INT_PTR)FALSE; | 	return (INT_PTR)FALSE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Use a thread to enable the download button as this may be a lengthy | ||||||
|  |  * operation due to the external download check. | ||||||
|  |  */ | ||||||
|  | static DWORD WINAPI CheckForFidoThread(LPVOID param) | ||||||
|  | { | ||||||
|  | 	static BOOL is_active = FALSE; | ||||||
|  | 	LONG_PTR style; | ||||||
|  | 	char* loc = NULL; | ||||||
|  | 	uint64_t len; | ||||||
|  | 	HWND hCtrl; | ||||||
|  | 
 | ||||||
|  | 	// Because a user may switch language before this thread has completed,
 | ||||||
|  | 	// we need to detect concurrency.
 | ||||||
|  | 	// Checking on a static boolean is more than good enough for our purpose.
 | ||||||
|  | 	if (is_active) | ||||||
|  | 		return -1; | ||||||
|  | 	is_active = TRUE; | ||||||
|  | 	safe_free(fido_url); | ||||||
|  | 
 | ||||||
|  | 	// Get the Fido URL from parsing a 'Fido.ver' on our server. This enables the use of different
 | ||||||
|  | 	// Fido versions from different versions of Rufus, if needed, as opposed to always downloading
 | ||||||
|  | 	// the latest release from GitHub, which may contain incompatible changes...
 | ||||||
|  | 	len = DownloadToFileOrBuffer(RUFUS_URL "/Fido.ver", NULL, (BYTE**)&loc, NULL, FALSE); | ||||||
|  | 	if ((len == 0) || (len >= 4 * KB)) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	len++;	// DownloadToFileOrBuffer allocated an extra NUL character if needed
 | ||||||
|  | 	fido_url = get_token_data_buffer(FIDO_VERSION, 1, loc, (size_t)len); | ||||||
|  | 	if (safe_strncmp(fido_url, "https://github.com/pbatard/Fido", 31) != 0) { | ||||||
|  | 		uprintf("WARNING: Download script URL %s is invalid ✗", fido_url); | ||||||
|  | 		safe_free(fido_url); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	if (IsDownloadable(fido_url)) { | ||||||
|  | 		hCtrl = GetDlgItem(hMainDialog, IDC_SELECT); | ||||||
|  | 		style = GetWindowLongPtr(hCtrl, GWL_STYLE); | ||||||
|  | 		style |= BS_SPLITBUTTON; | ||||||
|  | 		SetWindowLongPtr(hCtrl, GWL_STYLE, style); | ||||||
|  | 		RedrawWindow(hCtrl, NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW); | ||||||
|  | 		InvalidateRect(hCtrl, NULL, TRUE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	safe_free(loc); | ||||||
|  | 	is_active = FALSE; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Initial update check setup |  * Initial update check setup | ||||||
|  */ |  */ | ||||||
|  | @ -1549,27 +1598,10 @@ BOOL SetUpdateCheck(void) | ||||||
| 	if (((ReadRegistryKey32(REGKEY_HKLM, "Microsoft\\PowerShell\\1\\Install") > 0) || | 	if (((ReadRegistryKey32(REGKEY_HKLM, "Microsoft\\PowerShell\\1\\Install") > 0) || | ||||||
| 		 (ReadRegistryKey32(REGKEY_HKLM, "Microsoft\\PowerShell\\3\\Install") > 0)) && | 		 (ReadRegistryKey32(REGKEY_HKLM, "Microsoft\\PowerShell\\3\\Install") > 0)) && | ||||||
| 		(ReadSetting32(SETTING_UPDATE_INTERVAL) > 0)) { | 		(ReadSetting32(SETTING_UPDATE_INTERVAL) > 0)) { | ||||||
| 		char *loc = NULL; | 		CreateThread(NULL, 0, CheckForFidoThread, NULL, 0, NULL); | ||||||
| 		// Get the Fido URL from parsing a 'Fido.ver' on our server. This enables the use of different
 |  | ||||||
| 		// Fido versions from different versions of Rufus, if needed, as opposed to always downloading
 |  | ||||||
| 		// the latest release from GitHub, which may contain incompatible changes...
 |  | ||||||
| 		uint64_t loc_len = DownloadToFileOrBuffer(RUFUS_URL "/Fido.ver", NULL, (BYTE**)&loc, NULL, FALSE); |  | ||||||
| 		if ((loc_len != 0) && (loc_len < 4 * KB)) { |  | ||||||
| 			loc_len++;	// DownloadToFileOrBuffer allocated an extra NUL character if needed
 |  | ||||||
| 			fido_url = get_token_data_buffer(FIDO_VERSION, 1, loc, (size_t)loc_len); |  | ||||||
| 			if (safe_strncmp(fido_url, "https://github.com/pbatard/Fido", 31) != 0) { |  | ||||||
| 				ubprintf("WARNING: Download script URL %s is invalid ✗", fido_url); |  | ||||||
| 				safe_free(fido_url); |  | ||||||
| 	} else { | 	} else { | ||||||
| 				uprintf("Fido URL is %s", fido_url); | 		ubprintf("Notice: The ISO download feature has been deactivated because " | ||||||
| 				enable_fido = IsDownloadable(fido_url); | 			"'Check for updates' is disabled in your settings."); | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		safe_free(loc); |  | ||||||
| 	} |  | ||||||
| 	if (!enable_fido) { |  | ||||||
| 		ubprintf("Notice: The ISO download feature has been deactivated because %s", (ReadSetting32(SETTING_UPDATE_INTERVAL) <= 0) ? |  | ||||||
| 			"'Check for updates' is disabled in your settings." : "the remote download script can not be accessed."); |  | ||||||
| 	} | 	} | ||||||
| 	return TRUE; | 	return TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/ui.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/ui.c
									
										
									
									
									
								
							|  | @ -43,7 +43,7 @@ | ||||||
| 
 | 
 | ||||||
| UINT_PTR UM_LANGUAGE_MENU_MAX = UM_LANGUAGE_MENU; | UINT_PTR UM_LANGUAGE_MENU_MAX = UM_LANGUAGE_MENU; | ||||||
| HIMAGELIST hUpImageList, hDownImageList; | HIMAGELIST hUpImageList, hDownImageList; | ||||||
| extern BOOL enable_fido, use_vds; | extern BOOL use_vds; | ||||||
| int update_progress_type = UPT_PERCENT; | int update_progress_type = UPT_PERCENT; | ||||||
| int advanced_device_section_height, advanced_format_section_height; | int advanced_device_section_height, advanced_format_section_height; | ||||||
| // (empty) check box width, (empty) drop down width, button height (for and without dropdown match)
 | // (empty) check box width, (empty) drop down width, button height (for and without dropdown match)
 | ||||||
|  | @ -149,7 +149,6 @@ void GetMainButtonsWidth(HWND hDlg) | ||||||
| { | { | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 	RECT rc; | 	RECT rc; | ||||||
| 	LONG_PTR style; |  | ||||||
| 	char download[64]; | 	char download[64]; | ||||||
| 
 | 
 | ||||||
| 	GetWindowRect(GetDlgItem(hDlg, main_button_ids[0]), &rc); | 	GetWindowRect(GetDlgItem(hDlg, main_button_ids[0]), &rc); | ||||||
|  | @ -158,19 +157,14 @@ void GetMainButtonsWidth(HWND hDlg) | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < ARRAYSIZE(main_button_ids); i++) { | 	for (i = 0; i < ARRAYSIZE(main_button_ids); i++) { | ||||||
| 		// Make sure we add extra space for the SELECT split button (i == 0) if Fido is enabled
 | 		// Make sure we add extra space for the SELECT split button (i == 0) if Fido is enabled
 | ||||||
| 		bw = max(bw, GetTextWidth(hDlg, main_button_ids[i]) + ((enable_fido && i == 0) ? (3 * cbw) / 2 : cbw)); | 		bw = max(bw, GetTextWidth(hDlg, main_button_ids[i]) + ((i == 0) ? (3 * cbw) / 2 : cbw)); | ||||||
| 	} | 	} | ||||||
| 	// The 'CLOSE' button is also be used to display 'CANCEL' and we sometimes
 | 	// The 'CLOSE' button is also be used to display 'CANCEL' and we sometimes
 | ||||||
| 	// want to add "DOWNLOAD" into the Select split button => measure that too.
 | 	// want to add "DOWNLOAD" into the Select split button => measure that too.
 | ||||||
| 	bw = max(bw, GetTextSize(GetDlgItem(hDlg, IDCANCEL), lmprintf(MSG_007)).cx + cbw); | 	bw = max(bw, GetTextSize(GetDlgItem(hDlg, IDCANCEL), lmprintf(MSG_007)).cx + cbw); | ||||||
| 	if (enable_fido) { |  | ||||||
| 	static_strcpy(download, lmprintf(MSG_040)); | 	static_strcpy(download, lmprintf(MSG_040)); | ||||||
| 	CharUpperBuffU(download, sizeof(download)); | 	CharUpperBuffU(download, sizeof(download)); | ||||||
| 	bw = max(bw, GetTextSize(GetDlgItem(hDlg, IDC_SELECT), download).cx + (3 * cbw) / 2); | 	bw = max(bw, GetTextSize(GetDlgItem(hDlg, IDC_SELECT), download).cx + (3 * cbw) / 2); | ||||||
| 		style = GetWindowLongPtr(GetDlgItem(hDlg, IDC_SELECT), GWL_STYLE); |  | ||||||
| 		style |= BS_SPLITBUTTON; |  | ||||||
| 		SetWindowLongPtr(GetDlgItem(hDlg, IDC_SELECT), GWL_STYLE, style); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // The following goes over the data that gets populated into the half-width dropdowns
 | // The following goes over the data that gets populated into the half-width dropdowns
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue