mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[process] fix retrieval of full process commandline for MinGW32
* NtWow64QueryInformationProcess64() fails because sizeof(PVOID64) happens to be 4 instead of 8 in MinGW32 (WTF?!?) and therefore sizeof(pbi) is set to 44 instead of 48, resulting in NTSTATUS code 0xC0000004: STATUS_INFO_LENGTH_MISMATCH... => Use an ULONGLONG instead and don't rely on MinGW32's improper definitions. * Also fix an issue whereas, when we find multiple conflicting processes, the first one's path is duplicated to all others...
This commit is contained in:
		
							parent
							
								
									2a1c57c750
								
							
						
					
					
						commit
						dd9f9ce1e9
					
				
					 3 changed files with 17 additions and 15 deletions
				
			
		|  | @ -43,7 +43,7 @@ PF_TYPE_DECL(NTAPI, NTSTATUS, NtQuerySystemInformation, (SYSTEM_INFORMATION_CLAS | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryInformationFile, (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryInformationFile, (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS)); | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryInformationProcess, (HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryInformationProcess, (HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG)); | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtWow64QueryInformationProcess64, (HANDLE, ULONG, PVOID, ULONG, PULONG)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtWow64QueryInformationProcess64, (HANDLE, ULONG, PVOID, ULONG, PULONG)); | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtWow64ReadVirtualMemory64, (HANDLE, PVOID64, PVOID, ULONG64, PULONG64)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtWow64ReadVirtualMemory64, (HANDLE, ULONGLONG, PVOID, ULONG64, PULONG64)); | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryObject, (HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryObject, (HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG)); | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtDuplicateObject, (HANDLE, HANDLE, HANDLE, PHANDLE, ACCESS_MASK, ULONG, ULONG)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtDuplicateObject, (HANDLE, HANDLE, HANDLE, PHANDLE, ACCESS_MASK, ULONG, ULONG)); | ||||||
| PF_TYPE_DECL(NTAPI, NTSTATUS, NtOpenProcess, (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, CLIENT_ID*)); | PF_TYPE_DECL(NTAPI, NTSTATUS, NtOpenProcess, (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, CLIENT_ID*)); | ||||||
|  | @ -354,7 +354,7 @@ static PWSTR GetProcessCommandLine(HANDLE hProcess) | ||||||
| 	if (wow) { | 	if (wow) { | ||||||
| 		// 32-bit process running on a 64-bit OS
 | 		// 32-bit process running on a 64-bit OS
 | ||||||
| 		PROCESS_BASIC_INFORMATION_WOW64 pbi = { 0 }; | 		PROCESS_BASIC_INFORMATION_WOW64 pbi = { 0 }; | ||||||
| 		PVOID64 params; | 		ULONGLONG params; | ||||||
| 		UNICODE_STRING_WOW64* ucmdline; | 		UNICODE_STRING_WOW64* ucmdline; | ||||||
| 
 | 
 | ||||||
| 		PF_INIT_OR_OUT(NtWow64QueryInformationProcess64, NtDll); | 		PF_INIT_OR_OUT(NtWow64QueryInformationProcess64, NtDll); | ||||||
|  | @ -369,7 +369,7 @@ static PWSTR GetProcessCommandLine(HANDLE hProcess) | ||||||
| 			goto out; | 			goto out; | ||||||
| 
 | 
 | ||||||
| 		// Read Process Parameters from the 64-bit address space
 | 		// Read Process Parameters from the 64-bit address space
 | ||||||
| 		params = (PVOID64) *((PVOID64*)(peb + pp_offset)); | 		params = (ULONGLONG) *((ULONGLONG*)(peb + pp_offset)); | ||||||
| 		status = pfNtWow64ReadVirtualMemory64(hProcess, params, pp, cmd_offset + 16, NULL); | 		status = pfNtWow64ReadVirtualMemory64(hProcess, params, pp, cmd_offset + 16, NULL); | ||||||
| 		if (!NT_SUCCESS (status)) | 		if (!NT_SUCCESS (status)) | ||||||
| 			goto out; | 			goto out; | ||||||
|  | @ -435,7 +435,7 @@ static DWORD WINAPI SearchProcessThread(LPVOID param) | ||||||
| 	WCHAR *wHandleName = NULL; | 	WCHAR *wHandleName = NULL; | ||||||
| 	HANDLE dupHandle = NULL; | 	HANDLE dupHandle = NULL; | ||||||
| 	HANDLE processHandle = NULL; | 	HANDLE processHandle = NULL; | ||||||
| 	BOOLEAN bFound = FALSE, bGotCmdLine = FALSE, verbose = !_bQuiet; | 	BOOLEAN bFound = FALSE, bGotCmdLine, verbose = !_bQuiet; | ||||||
| 	ULONG access_rights = 0; | 	ULONG access_rights = 0; | ||||||
| 	DWORD size; | 	DWORD size; | ||||||
| 	char cmdline[MAX_PATH] = { 0 }; | 	char cmdline[MAX_PATH] = { 0 }; | ||||||
|  | @ -598,6 +598,7 @@ static DWORD WINAPI SearchProcessThread(LPVOID param) | ||||||
| 			vuprintf("WARNING: The following process(es) or service(s) are accessing %s:", _HandleName); | 			vuprintf("WARNING: The following process(es) or service(s) are accessing %s:", _HandleName); | ||||||
| 
 | 
 | ||||||
| 		// Where possible, try to get the full command line
 | 		// Where possible, try to get the full command line
 | ||||||
|  | 		bGotCmdLine = FALSE; | ||||||
| 		wcmdline = GetProcessCommandLine(processHandle); | 		wcmdline = GetProcessCommandLine(processHandle); | ||||||
| 		if (wcmdline != NULL) { | 		if (wcmdline != NULL) { | ||||||
| 			bGotCmdLine = TRUE; | 			bGotCmdLine = TRUE; | ||||||
|  |  | ||||||
|  | @ -121,7 +121,8 @@ typedef struct _OBJECT_TYPES_INFORMATION | ||||||
| typedef struct _PROCESS_BASIC_INFORMATION_WOW64 | typedef struct _PROCESS_BASIC_INFORMATION_WOW64 | ||||||
| { | { | ||||||
| 	PVOID Reserved1[2]; | 	PVOID Reserved1[2]; | ||||||
| 	PVOID64 PebBaseAddress; | 	// MinGW32 screws us with a sizeof(PVOID64) of 4 instead of 8 => Use an ULONGLONG instead
 | ||||||
|  | 	ULONGLONG PebBaseAddress; | ||||||
| 	PVOID Reserved2[4]; | 	PVOID Reserved2[4]; | ||||||
| 	ULONG_PTR UniqueProcessId[2]; | 	ULONG_PTR UniqueProcessId[2]; | ||||||
| 	PVOID Reserved3[2]; | 	PVOID Reserved3[2]; | ||||||
|  | @ -131,7 +132,7 @@ typedef struct _UNICODE_STRING_WOW64 | ||||||
| { | { | ||||||
| 	USHORT Length; | 	USHORT Length; | ||||||
| 	USHORT MaximumLength; | 	USHORT MaximumLength; | ||||||
| 	PVOID64 Buffer; | 	ULONGLONG Buffer; | ||||||
| } UNICODE_STRING_WOW64; | } UNICODE_STRING_WOW64; | ||||||
| 
 | 
 | ||||||
| typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION | typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION | ||||||
|  |  | ||||||
							
								
								
									
										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.6.1505" | CAPTION "Rufus 3.6.1506" | ||||||
| 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 | ||||||
|  | @ -394,8 +394,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 3,6,1505,0 |  FILEVERSION 3,6,1506,0 | ||||||
|  PRODUCTVERSION 3,6,1505,0 |  PRODUCTVERSION 3,6,1506,0 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -413,13 +413,13 @@ BEGIN | ||||||
|             VALUE "Comments", "https://akeo.ie" |             VALUE "Comments", "https://akeo.ie" | ||||||
|             VALUE "CompanyName", "Akeo Consulting" |             VALUE "CompanyName", "Akeo Consulting" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "3.6.1505" |             VALUE "FileVersion", "3.6.1506" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2019 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2019 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "https://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "https://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus-3.6.exe" |             VALUE "OriginalFilename", "rufus-3.6.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "3.6.1505" |             VALUE "ProductVersion", "3.6.1506" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue