mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[cmd] add -g option to disable the commandline hogger (rufus.com)
* This can be useful when launching Rufus from the commandline or a batch file with 'start /wait' * Also fix a crash when specifying an unknown commandline option * Also fix the commandline usage help
This commit is contained in:
		
							parent
							
								
									fe55f30277
								
							
						
					
					
						commit
						821a9df1c8
					
				
					 3 changed files with 88 additions and 49 deletions
				
			
		|  | @ -72,6 +72,7 @@ static htab_table htab_loc = HTAB_EMPTY; | |||
| int    loc_line_nr; | ||||
| struct list_head locale_list = {NULL, NULL}; | ||||
| char   *loc_filename = NULL, *embedded_loc_filename = "embedded.loc"; | ||||
| static BOOL localization_initialized = FALSE; | ||||
| 
 | ||||
| /* Message table */ | ||||
| char* default_msg_table[MSG_MAX-MSG_000] = {"%s", 0}; | ||||
|  | @ -188,9 +189,12 @@ void _init_localization(BOOL reinit) { | |||
| 	if (!reinit) | ||||
| 		list_init(&locale_list); | ||||
| 	htab_create(LOC_HTAB_SIZE, &htab_loc); | ||||
| 	localization_initialized = TRUE; | ||||
| } | ||||
| 
 | ||||
| void _exit_localization(BOOL reinit) { | ||||
| 	if (!localization_initialized) | ||||
| 		return; | ||||
| 	if (!reinit) { | ||||
| 		free_locale_list(); | ||||
| 		if (loc_filename != embedded_loc_filename) | ||||
|  |  | |||
							
								
								
									
										117
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										117
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -90,6 +90,7 @@ PF_DECL(ImageList_ReplaceIcon); | |||
| PF_TYPE_DECL(WINAPI, BOOL, SHChangeNotifyDeregister, (ULONG)); | ||||
| PF_TYPE_DECL(WINAPI, ULONG, SHChangeNotifyRegister, (HWND, int, LONG, UINT, int, const MY_SHChangeNotifyEntry*)); | ||||
| 
 | ||||
| const char* cmdline_hogger = "rufus.com"; | ||||
| const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "UDF", "exFAT", "ReFS" }; | ||||
| // Number of steps for each FS for FCC_STRUCTURE_PROGRESS
 | ||||
| const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10 }; | ||||
|  | @ -2407,16 +2408,65 @@ static void PrintUsage(char* appname) | |||
| 	char fname[_MAX_FNAME]; | ||||
| 
 | ||||
| 	_splitpath(appname, NULL, NULL, fname, NULL); | ||||
| 	printf("\nUsage: %s [-h] [-i PATH] [-w TIMEOUT]\n", fname); | ||||
| 	printf("\nUsage: %s [-f] [-g] [-h] [-i PATH] [-l LOCALE] [-w TIMEOUT]\n", fname); | ||||
| 	printf("  -f, --fixed\n"); | ||||
| 	printf("     Enable the listing of fixed/HDD USB drives\n"); | ||||
| 	printf("  -g, --gui\n"); | ||||
| 	printf("     Start in GUI mode (disable the 'rufus.com' commandline hogger)\n"); | ||||
| 	printf("  -i PATH, --iso=PATH\n"); | ||||
| 	printf("     Select the ISO image pointed by PATH to be used on startup\n"); | ||||
| 	printf("  -l LOCALE, --locale=LOCALE\n"); | ||||
| 	printf("     Select the locale to be used on startup\n"); | ||||
| 	printf("  -w TIMEOUT, --wait=TIMEOUT\n"); | ||||
| 	printf("     Wait TIMEOUT tens of a second for the global application mutex to be released.\n"); | ||||
| 	printf("     Wait TIMEOUT tens of seconds for the global application mutex to be released.\n"); | ||||
| 	printf("     Used when launching a newer version of " APPLICATION_NAME " from a running application.\n"); | ||||
| 	printf("  -h, --help\n"); | ||||
| 	printf("     This usage guide.\n"); | ||||
| } | ||||
| 
 | ||||
| static HANDLE SetHogger(BOOL attached_console, BOOL disable_hogger) | ||||
| { | ||||
| 	INPUT* input; | ||||
| 	BYTE* hog_data; | ||||
| 	DWORD hog_size, Size; | ||||
| 	HANDLE hogmutex = NULL, hFile = NULL; | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (!attached_console) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	hog_data = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_XT_HOGGER), | ||||
| 		_RT_RCDATA, cmdline_hogger, &hog_size, FALSE); | ||||
| 	if ((hog_data != NULL) && (!disable_hogger)) { | ||||
| 		// Create our synchronisation mutex
 | ||||
| 		hogmutex = CreateMutexA(NULL, TRUE, "Global/Rufus_CmdLine"); | ||||
| 
 | ||||
| 		// Extract the hogger resource
 | ||||
| 		hFile = CreateFileA(cmdline_hogger, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, | ||||
| 			NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 		if (hFile != INVALID_HANDLE_VALUE) { | ||||
| 			// coverity[check_return]
 | ||||
| 			WriteFile(hFile, hog_data, hog_size, &Size, NULL); | ||||
| 		} | ||||
| 		safe_closehandle(hFile); | ||||
| 
 | ||||
| 		// Now launch the file from the commandline, by simulating keypresses
 | ||||
| 		input = (INPUT*)calloc(strlen(cmdline_hogger)+1, sizeof(INPUT)); | ||||
| 		for (i=0; i<(int)strlen(cmdline_hogger); i++) { | ||||
| 			input[i].type = INPUT_KEYBOARD; | ||||
| 			input[i].ki.dwFlags = KEYEVENTF_UNICODE; | ||||
| 			input[i].ki.wScan = (wchar_t)cmdline_hogger[i]; | ||||
| 		} | ||||
| 		input[i].type = INPUT_KEYBOARD; | ||||
| 		input[i].ki.wVk = VK_RETURN; | ||||
| 		SendInput(i+1, input, sizeof(INPUT)); | ||||
| 		safe_free(input); | ||||
| 	} | ||||
| 	if (hogmutex != NULL) | ||||
| 		Sleep(200);	// Need to add a delay, otherwise we may get some printout before the hogger
 | ||||
| 	return hogmutex; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Application Entrypoint | ||||
|  */ | ||||
|  | @ -2426,14 +2476,12 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ | |||
| int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) | ||||
| #endif | ||||
| { | ||||
| 	const char* old_wait_option = "/W"; | ||||
| 	const char* rufus_loc = "rufus.loc"; | ||||
| 	const char* cmdline_hogger = "rufus.com"; | ||||
| 	int i, opt, option_index = 0, argc = 0, si = 0, lcid = GetUserDefaultUILanguage(); | ||||
| 	FILE* fd; | ||||
| 	BOOL attached_console = FALSE, external_loc_file = FALSE, lgp_set = FALSE, automount; | ||||
| 	BYTE *loc_data, *hog_data; | ||||
| 	DWORD loc_size, hog_size, Size; | ||||
| 	BOOL attached_console = FALSE, external_loc_file = FALSE, lgp_set = FALSE, automount, disable_hogger = FALSE; | ||||
| 	BYTE *loc_data; | ||||
| 	DWORD loc_size, Size; | ||||
| 	char tmp_path[MAX_PATH] = "", loc_file[MAX_PATH] = "", ini_path[MAX_PATH], ini_flags[] = "rb"; | ||||
| 	char *tmp, *locale_name = NULL, **argv = NULL; | ||||
| 	wchar_t **wenv, **wargv; | ||||
|  | @ -2443,8 +2491,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | |||
| 	MSG msg; | ||||
| 	int wait_for_mutex = 0; | ||||
| 	struct option long_options[] = { | ||||
| 		{"fixed",   no_argument,       NULL, 'f'}, | ||||
| 		{"gui",     no_argument,       NULL, 'g'}, | ||||
| 		{"help",    no_argument,       NULL, 'h'}, | ||||
| 		{"iso",     required_argument, NULL, 'i'}, | ||||
| 		{"locale",  required_argument, NULL, 'l'}, | ||||
| 		{"wait",    required_argument, NULL, 'w'}, | ||||
| 		{0, 0, NULL, 0} | ||||
| 	}; | ||||
|  | @ -2453,41 +2504,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | |||
| 
 | ||||
| 	// Reattach the console, if we were started from commandline
 | ||||
| 	if (AttachConsole(ATTACH_PARENT_PROCESS) != 0) { | ||||
| 		INPUT* input; | ||||
| 		attached_console = TRUE; | ||||
| 
 | ||||
| 		IGNORE_RETVAL(freopen("CONIN$", "r", stdin)); | ||||
| 		IGNORE_RETVAL(freopen("CONOUT$", "w", stdout)); | ||||
| 		IGNORE_RETVAL(freopen("CONOUT$", "w", stderr)); | ||||
| 		_flushall(); | ||||
| 
 | ||||
| 		hog_data = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_XT_HOGGER), | ||||
| 			_RT_RCDATA, cmdline_hogger, &hog_size, FALSE); | ||||
| 		if (hog_data != NULL) { | ||||
| 			// Create our synchronisation mutex
 | ||||
| 			hogmutex = CreateMutexA(NULL, TRUE, "Global/Rufus_CmdLine"); | ||||
| 
 | ||||
| 			// Extract the hogger resource
 | ||||
| 			hFile = CreateFileA(cmdline_hogger, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, | ||||
| 				NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | ||||
| 			if (hFile != INVALID_HANDLE_VALUE) { | ||||
| 				// coverity[check_return]
 | ||||
| 				WriteFile(hFile, hog_data, hog_size, &Size, NULL); | ||||
| 			} | ||||
| 			safe_closehandle(hFile); | ||||
| 
 | ||||
| 			// Now launch the file from the commandline, by simulating keypresses
 | ||||
| 			input = (INPUT*)calloc(strlen(cmdline_hogger)+1, sizeof(INPUT)); | ||||
| 			for (i=0; i<(int)strlen(cmdline_hogger); i++) { | ||||
| 				input[i].type = INPUT_KEYBOARD; | ||||
| 				input[i].ki.dwFlags = KEYEVENTF_UNICODE; | ||||
| 				input[i].ki.wScan = (wchar_t)cmdline_hogger[i]; | ||||
| 			} | ||||
| 			input[i].type = INPUT_KEYBOARD; | ||||
| 			input[i].ki.wVk = VK_RETURN; | ||||
| 			SendInput(i+1, input, sizeof(INPUT)); | ||||
| 			safe_free(input); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// We have to process the arguments before we acquire the lock and process the locale
 | ||||
|  | @ -2495,25 +2516,39 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | |||
| 	if (pf__wgetmainargs != NULL) { | ||||
| 		pf__wgetmainargs(&argc, &wargv, &wenv, 1, &si); | ||||
| 		argv = (char**)calloc(argc, sizeof(char*)); | ||||
| 
 | ||||
| 		// Non getopt parameter check
 | ||||
| 		for (i=0; i<argc; i++) { | ||||
| 			argv[i] = wchar_to_utf8(wargv[i]); | ||||
| 			// Check for "/W" (wait for mutex release for pre 1.3.3 versions)
 | ||||
| 			if (safe_strcmp(argv[i], old_wait_option) == 0) | ||||
| 			// Check for " /W" (wait for mutex release for pre 1.3.3 versions)
 | ||||
| 			if (strcmp(argv[i], "/W") == 0) | ||||
| 				wait_for_mutex = 150;	// Try to acquire the mutex for 15 seconds
 | ||||
| 			// We need to find if we need to disable the hogger BEFORE we start
 | ||||
| 			// processing arguments with getopt, as we may want to print messages
 | ||||
| 			// on the commandline then, which the hogger makes more intuitive.
 | ||||
| 			if ((strcmp(argv[i], "-g") == 0) || (strcmp(argv[i], "--gui") == 0)) | ||||
| 				disable_hogger = TRUE; | ||||
| 		} | ||||
| 
 | ||||
| 		// If our application name contains a 'p' (for "portable") create a 'rufus.ini'
 | ||||
| 		// NB: argv[0] is populated in the previous loop
 | ||||
| 		tmp = &argv[0][strlen(argv[0]) -1]; | ||||
| 		while ((((uintptr_t)tmp)>((uintptr_t)argv[0])) && (*tmp != '\\')) | ||||
| 			tmp--; | ||||
| 		if (strchr(tmp, 'p') != NULL) | ||||
| 			ini_flags[0] = 'a'; | ||||
| 
 | ||||
| 		while ((opt = getopt_long(argc, argv, "?fhi:w:l:", long_options, &option_index)) != EOF) | ||||
| 		// Now enable the hogger before processing the rest of the arguments
 | ||||
| 		hogmutex = SetHogger(attached_console, disable_hogger); | ||||
| 
 | ||||
| 		while ((opt = getopt_long(argc, argv, "?fghi:w:l:", long_options, &option_index)) != EOF) | ||||
| 			switch (opt) { | ||||
| 			case 'f': | ||||
| 				enable_HDDs = TRUE; | ||||
| 				break; | ||||
| 			case 'g': | ||||
| 				// No need to reprocess that option
 | ||||
| 				break; | ||||
| 			case 'i': | ||||
| 				if (_access(optarg, 0) != -1) { | ||||
| 					image_path = safe_strdup(optarg); | ||||
|  | @ -2821,7 +2856,7 @@ relaunch: | |||
| 
 | ||||
| out: | ||||
| 	// Destroy the hogger mutex first, so that the cmdline app can exit and we can delete it
 | ||||
| 	if (attached_console) { | ||||
| 	if (attached_console && !disable_hogger) { | ||||
| 		ReleaseMutex(hogmutex); | ||||
| 		safe_closehandle(hogmutex); | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										16
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								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.0.629" | ||||
| CAPTION "Rufus 2.0.630" | ||||
| FONT 8, "Segoe UI", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,127,339,50,14 | ||||
|  | @ -157,7 +157,7 @@ END | |||
| 
 | ||||
| IDD_DIALOG_XP DIALOGEX 12, 12, 242, 376 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| CAPTION "Rufus 2.0.629" | ||||
| CAPTION "Rufus 2.0.630" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,127,339,50,14 | ||||
|  | @ -283,7 +283,7 @@ END | |||
| IDD_DIALOG_RTL DIALOGEX 12, 12, 242, 376 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL | ||||
| CAPTION "Rufus 2.0.629" | ||||
| CAPTION "Rufus 2.0.630" | ||||
| FONT 8, "Segoe UI", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,127,339,50,14 | ||||
|  | @ -415,7 +415,7 @@ END | |||
| IDD_DIALOG_RTL_XP DIALOGEX 12, 12, 242, 376 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL | ||||
| CAPTION "Rufus 2.0.629" | ||||
| CAPTION "Rufus 2.0.630" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,127,339,50,14 | ||||
|  | @ -671,8 +671,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 2,0,629,0 | ||||
|  PRODUCTVERSION 2,0,629,0 | ||||
|  FILEVERSION 2,0,630,0 | ||||
|  PRODUCTVERSION 2,0,630,0 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -689,13 +689,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "2.0.629" | ||||
|             VALUE "FileVersion", "2.0.630" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011-2015 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "2.0.629" | ||||
|             VALUE "ProductVersion", "2.0.630" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue