mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[misc] improve retrieval of core directories
* This *might* help with the issue reported in #2296.
This commit is contained in:
		
							parent
							
								
									866aa22a8b
								
							
						
					
					
						commit
						d5bf53054b
					
				
					 2 changed files with 56 additions and 30 deletions
				
			
		
							
								
								
									
										70
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										70
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -135,7 +135,7 @@ int dialog_showing = 0, selection_default = BT_IMAGE, persistence_unit_selection | ||||||
| int default_fs, fs_type, boot_type, partition_type, target_type; | int default_fs, fs_type, boot_type, partition_type, target_type; | ||||||
| int force_update = 0, default_thread_priority = THREAD_PRIORITY_ABOVE_NORMAL; | int force_update = 0, default_thread_priority = THREAD_PRIORITY_ABOVE_NORMAL; | ||||||
| char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], temp_dir[MAX_PATH], sysnative_dir[MAX_PATH]; | char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], temp_dir[MAX_PATH], sysnative_dir[MAX_PATH]; | ||||||
| char app_data_dir[MAX_PATH], user_dir[MAX_PATH]; | char app_data_dir[MAX_PATH], user_dir[MAX_PATH], cur_dir[MAX_PATH]; | ||||||
| char embedded_sl_version_str[2][12] = { "?.??", "?.??" }; | char embedded_sl_version_str[2][12] = { "?.??", "?.??" }; | ||||||
| char embedded_sl_version_ext[2][32]; | char embedded_sl_version_ext[2][32]; | ||||||
| char ClusterSizeLabel[MAX_CLUSTER_SIZES][64]; | char ClusterSizeLabel[MAX_CLUSTER_SIZES][64]; | ||||||
|  | @ -3326,45 +3326,63 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 
 | 
 | ||||||
| 	// Retrieve various app & system directories.
 | 	// Retrieve various app & system directories.
 | ||||||
| 	if (GetCurrentDirectoryU(sizeof(app_dir), app_dir) == 0) { | 	if (GetCurrentDirectoryU(sizeof(app_dir), app_dir) == 0) { | ||||||
| 		uprintf("Could not get current directory: %s", WindowsErrorString()); | 		uprintf("Could not get application directory: %s", WindowsErrorString()); | ||||||
| 		app_dir[0] = 0; | 		static_strcpy(app_dir, ".\\"); | ||||||
| 	} | 	} else { | ||||||
| 		// Microsoft has a bad habit of making some of its APIs (_chdir/_wchdir) break
 | 		// Microsoft has a bad habit of making some of its APIs (_chdir/_wchdir) break
 | ||||||
| 		// when app_dir is a drive letter that doesn't have a trailing backslash. For
 | 		// when app_dir is a drive letter that doesn't have a trailing backslash. For
 | ||||||
| 		// instance _chdir("F:") does not change the directory, whereas _chdir("F:\\")
 | 		// instance _chdir("F:") does not change the directory, whereas _chdir("F:\\")
 | ||||||
| 	// does. So make sure we add a trailing backslash if the app_dir is a drive.
 | 		// does. So make sure we always have a trailing backslash.
 | ||||||
| 	if ((app_dir[1] == ':') && (app_dir[2] == 0)) { | 		static_strcat(app_dir, "\\"); | ||||||
| 		app_dir[2] = '\\'; |  | ||||||
| 		app_dir[3] = 0; |  | ||||||
| 	} | 	} | ||||||
| 	if (GetSystemDirectoryU(system_dir, sizeof(system_dir)) == 0) { | 
 | ||||||
| 		uprintf("Could not get system directory: %s", WindowsErrorString()); | 	// In the wonderful world of Microsoft Windows, GetCurrentDirectory() returns the
 | ||||||
| 		static_strcpy(system_dir, "C:\\Windows\\System32"); | 	// directory where the application resides, instead of the real current directory
 | ||||||
|  | 	// so we need another method to resolve the *ACTUAL* current directory.
 | ||||||
|  | 	static_strcpy(cur_dir, ".\\"); | ||||||
|  | 	hFile = CreateFileU(cur_dir, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, | ||||||
|  | 		FILE_FLAG_BACKUP_SEMANTICS, NULL); | ||||||
|  | 	if ((hFile == INVALID_HANDLE_VALUE) || | ||||||
|  | 		(GetFinalPathNameByHandleU(hFile, cur_dir, sizeof(cur_dir), FILE_NAME_OPENED) == 0) || | ||||||
|  | 		((strstr(cur_dir, "\\\\?\\") != cur_dir) && (strstr(cur_dir, "\\\\.\\") != cur_dir))) { | ||||||
|  | 		uprintf("Could not get current directory from '%s': %s", cur_dir, WindowsErrorString()); | ||||||
|  | 		static_strcpy(cur_dir, ".\\"); | ||||||
|  | 	} else { | ||||||
|  | 		// Need to remove the '\\?\' prefix and reappend the trailing '\'
 | ||||||
|  | 		strcpy(cur_dir, &cur_dir[4]); | ||||||
|  | 		static_strcat(cur_dir, "\\"); | ||||||
| 	} | 	} | ||||||
|  | 	safe_closehandle(hFile); | ||||||
|  | 
 | ||||||
| 	// Per documentation, the returned string ends with a backslash
 | 	// Per documentation, the returned string ends with a backslash
 | ||||||
| 	if (GetTempPathU(sizeof(temp_dir), temp_dir) == 0) { | 	if (GetTempPathU(sizeof(temp_dir), temp_dir) == 0) { | ||||||
| 		uprintf("Could not get temp directory: %s", WindowsErrorString()); | 		uprintf("Could not get temp directory: %s", WindowsErrorString()); | ||||||
| 		static_strcpy(temp_dir, ".\\"); | 		static_strcpy(temp_dir, cur_dir); | ||||||
| 	} else { | 	} else { | ||||||
| 		// Some folks have found nothing better than configure their Windows installation to use
 | 		// Some folks have found nothing better than configure their Windows installation to use
 | ||||||
| 		// a symlink for their temp dir, and it so happens that the Windows WIM mounting facility,
 | 		// a symlink for their temp dir, and it so happens that the Windows WIM mounting facility,
 | ||||||
| 		// which we need for applying the WUE options, can't handle symlinked directories. So we
 | 		// which we need for applying the WUE options, can't handle symlinked directories. So we
 | ||||||
| 		// *attempt* to resolve the actual symlinked temp dir for this super limited number of
 | 		// *attempt* to resolve the actual symlinked temp dir for this super limited number of
 | ||||||
| 		// users, with the hope that doing so is not going to break stuff elsewhere...
 | 		// users, with the hope that doing so is not going to break stuff elsewhere...
 | ||||||
| 		HANDLE handle = CreateFileU(temp_dir, GENERIC_READ, FILE_SHARE_READ, NULL, | 		hFile = CreateFileU(temp_dir, GENERIC_READ, FILE_SHARE_READ, NULL, | ||||||
| 			OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); | 			OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); | ||||||
| 		// GetFinalPathNameByHandle returns a UNC path, which should be prefixed by '\\?\' or '\\.\'
 | 		// GetFinalPathNameByHandle returns a UNC path, which should be prefixed by '\\?\' or '\\.\'
 | ||||||
| 		if ((GetFinalPathNameByHandleU(handle, temp_dir, sizeof(temp_dir), FILE_NAME_OPENED) == 0) || | 		if ((hFile == INVALID_HANDLE_VALUE) || | ||||||
|  | 			(GetFinalPathNameByHandleU(hFile, temp_dir, sizeof(temp_dir), FILE_NAME_OPENED) == 0) || | ||||||
| 			((strstr(temp_dir, "\\\\?\\") != temp_dir) && (strstr(temp_dir, "\\\\.\\") != temp_dir))) { | 			((strstr(temp_dir, "\\\\?\\") != temp_dir) && (strstr(temp_dir, "\\\\.\\") != temp_dir))) { | ||||||
| 			uprintf("Could not get actual temp directory: %s", WindowsErrorString()); | 			uprintf("Could not get actual temp directory from '%s': %s", temp_dir, WindowsErrorString()); | ||||||
| 			static_strcpy(temp_dir, ".\\"); | 			static_strcpy(temp_dir, cur_dir); | ||||||
| 		} else { | 		} else { | ||||||
| 			// Need to remove the '\\?\' prefix or else we'll get issues with the Fido icon
 | 			// Need to remove the '\\?\' prefix or else we'll get issues with the Fido icon
 | ||||||
| 			strcpy(temp_dir, &temp_dir[4]); | 			strcpy(temp_dir, &temp_dir[4]); | ||||||
| 			// And me must re-append the '\' that gets removed by GetFinalPathNameByHandle()
 | 			// And me must re-append the '\' that gets removed by GetFinalPathNameByHandle()
 | ||||||
| 			static_strcat(temp_dir, "\\"); | 			static_strcat(temp_dir, "\\"); | ||||||
| 		} | 		} | ||||||
| 		CloseHandle(handle); | 		safe_closehandle(hFile); | ||||||
|  | 	} | ||||||
|  | 	if (GetSystemDirectoryU(system_dir, sizeof(system_dir)) == 0) { | ||||||
|  | 		uprintf("Could not get system directory: %s", WindowsErrorString()); | ||||||
|  | 		static_strcpy(system_dir, "C:\\Windows\\System32"); | ||||||
| 	} | 	} | ||||||
| 	if (!SHGetSpecialFolderPathU(NULL, app_data_dir, CSIDL_LOCAL_APPDATA, FALSE)) { | 	if (!SHGetSpecialFolderPathU(NULL, app_data_dir, CSIDL_LOCAL_APPDATA, FALSE)) { | ||||||
| 		uprintf("Could not get app data directory: %s", WindowsErrorString()); | 		uprintf("Could not get app data directory: %s", WindowsErrorString()); | ||||||
|  | @ -3392,13 +3410,19 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  | 	uprintf("Cur dir: '%s'", cur_dir); | ||||||
|  | 	uprintf("App dir: '%s'", app_dir); | ||||||
|  | 	uprintf("Sys dir: '%s'", sysnative_dir); | ||||||
|  | 	uprintf("Usr dir: '%s'", user_dir); | ||||||
|  | 	uprintf("Dat dir: '%s'", app_data_dir); | ||||||
|  | 	uprintf("Tmp dir: '%s'", temp_dir); | ||||||
| 
 | 
 | ||||||
| 	// Look for a rufus.app file in the current app directory
 | 	// Look for a rufus.app file in the current app directory
 | ||||||
| 	// Since Microsoft makes it downright impossible to pass an arg in the app manifest
 | 	// Since Microsoft makes it downright impossible to pass an arg in the app manifest
 | ||||||
| 	// and the automated VS2019 package building process doesn't like renaming the .exe
 | 	// and the automated VS2019 package building process doesn't like renaming the .exe
 | ||||||
| 	// right under its nose (else we would use the same trick as for portable vs regular)
 | 	// right under its nose (else we would use the same trick as for portable vs regular)
 | ||||||
| 	// we use yet another workaround to detect if we are running the AppStore version...
 | 	// we use yet another workaround to detect if we are running the AppStore version...
 | ||||||
| 	static_sprintf(ini_path, "%s\\rufus.app", app_dir); | 	static_sprintf(ini_path, "%srufus.app", app_dir); | ||||||
| 	if (PathFileExistsU(ini_path)) { | 	if (PathFileExistsU(ini_path)) { | ||||||
| 		appstore_version = TRUE; | 		appstore_version = TRUE; | ||||||
| 		goto skip_args_processing; | 		goto skip_args_processing; | ||||||
|  | @ -3530,7 +3554,7 @@ skip_args_processing: | ||||||
| 		uprintf("AppStore version detected"); | 		uprintf("AppStore version detected"); | ||||||
| 
 | 
 | ||||||
| 	// Look for a .ini file in the current app directory
 | 	// Look for a .ini file in the current app directory
 | ||||||
| 	static_sprintf(ini_path, "%s\\rufus.ini", app_dir); | 	static_sprintf(ini_path, "%srufus.ini", app_dir); | ||||||
| 	fd = fopenU(ini_path, ini_flags);	// Will create the file if portable mode is requested
 | 	fd = fopenU(ini_path, ini_flags);	// Will create the file if portable mode is requested
 | ||||||
| 	// Using the string directly in safe_strcmp() would call GetSignatureName() twice
 | 	// Using the string directly in safe_strcmp() would call GetSignatureName() twice
 | ||||||
| 	tmp = GetSignatureName(NULL, NULL, FALSE); | 	tmp = GetSignatureName(NULL, NULL, FALSE); | ||||||
|  | @ -3590,7 +3614,7 @@ skip_args_processing: | ||||||
| 	init_localization(); | 	init_localization(); | ||||||
| 
 | 
 | ||||||
| 	// Seek for a loc file in the application directory
 | 	// Seek for a loc file in the application directory
 | ||||||
| 	static_sprintf(loc_file, "%s\\%s", app_dir, rufus_loc); | 	static_sprintf(loc_file, "%s%s", app_dir, rufus_loc); | ||||||
| 	if (GetFileAttributesU(loc_file) == INVALID_FILE_ATTRIBUTES) { | 	if (GetFileAttributesU(loc_file) == INVALID_FILE_ATTRIBUTES) { | ||||||
| 		uprintf("loc file not found in current directory - embedded one will be used"); | 		uprintf("loc file not found in current directory - embedded one will be used"); | ||||||
| 
 | 
 | ||||||
|  | @ -4154,8 +4178,10 @@ out: | ||||||
| 	// Kill the update check thread if running
 | 	// Kill the update check thread if running
 | ||||||
| 	if (update_check_thread != NULL) | 	if (update_check_thread != NULL) | ||||||
| 		TerminateThread(update_check_thread, 1); | 		TerminateThread(update_check_thread, 1); | ||||||
| 	if ((!external_loc_file) && (loc_file[0] != 0)) | 	if ((!external_loc_file) && (loc_file[0] != 0)) { | ||||||
| 		DeleteFileU(loc_file); | 		if (!DeleteFileU(loc_file)) | ||||||
|  | 			uprintf("Could not delete '%s': %s", loc_file, WindowsErrorString()); | ||||||
|  | 	} | ||||||
| 	DestroyAllTooltips(); | 	DestroyAllTooltips(); | ||||||
| 	ClrAlertPromptHook(); | 	ClrAlertPromptHook(); | ||||||
| 	exit_localization(); | 	exit_localization(); | ||||||
|  |  | ||||||
							
								
								
									
										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 4.3.2078" | CAPTION "Rufus 4.3.2079" | ||||||
| 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 | ||||||
|  | @ -392,8 +392,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 4,3,2078,0 |  FILEVERSION 4,3,2079,0 | ||||||
|  PRODUCTVERSION 4,3,2078,0 |  PRODUCTVERSION 4,3,2079,0 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -411,13 +411,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", "4.3.2078" |             VALUE "FileVersion", "4.3.2079" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2023 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-4.3.exe" |             VALUE "OriginalFilename", "rufus-4.3.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "4.3.2078" |             VALUE "ProductVersion", "4.3.2079" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue