From: Michael Müller michael@fds-team.de
This patch allows Process Hacker to show the filename, icon and description of an executable.
Since ProcessImageFileName incorrectly returns a Win32 path, we can simply reuse the existing implementation.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- v2: update comment v3: fix kernel32:process tests
dlls/kernel32/tests/process.c | 16 ++++++++++------ dlls/ntdll/process.c | 4 ++-- include/winternl.h | 9 +++++++++ 3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index cbca00e..b1a4539 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -3501,16 +3501,16 @@ static void test_process_info(void) sizeof(buf) /* ProcessHandleTracing */, sizeof(ULONG) /* ProcessIoPriority */, sizeof(ULONG) /* ProcessExecuteFlags */, -#if 0 /* FIXME: Add remaining classes */ - ProcessResourceManagement, - sizeof(ULONG) /* ProcessCookie */, + 0 /* FIXME: sizeof(?) ProcessTlsInformation */, + 0 /* FIXME: sizeof(?) ProcessCookie */, sizeof(SECTION_IMAGE_INFORMATION) /* ProcessImageInformation */, - sizeof(PROCESS_CYCLE_TIME_INFORMATION) /* ProcessCycleTime */, + 0 /* FIXME: sizeof(PROCESS_CYCLE_TIME_INFORMATION) ProcessCycleTime */, sizeof(ULONG) /* ProcessPagePriority */, 40 /* ProcessInstrumentationCallback */, - sizeof(PROCESS_STACK_ALLOCATION_INFORMATION) /* ProcessThreadStackAllocation */, - sizeof(PROCESS_WS_WATCH_INFORMATION_EX[]) /* ProcessWorkingSetWatchEx */, + 0 /* FIXME: sizeof(PROCESS_STACK_ALLOCATION_INFORMATION) ProcessThreadStackAllocation */, + 0 /* FIXME: sizeof(PROCESS_WS_WATCH_INFORMATION_EX[]) ProcessWorkingSetWatchEx */, sizeof(buf) /* ProcessImageFileNameWin32 */, +#if 0 /* FIXME: Add remaining classes */ sizeof(HANDLE) /* ProcessImageFileMapping */, sizeof(PROCESS_AFFINITY_UPDATE_MODE) /* ProcessAffinityUpdateMode */, sizeof(PROCESS_MEMORY_ALLOCATION_MODE) /* ProcessMemoryAllocationMode */, @@ -3582,6 +3582,9 @@ static void test_process_info(void) case ProcessDefaultHardErrorMode: case ProcessHandleCount: case ProcessImageFileName: + case ProcessImageInformation: + case ProcessPagePriority: + case ProcessImageFileNameWin32: ok(status == STATUS_SUCCESS, "for info %u expected STATUS_SUCCESS, got %08x (ret_len %u)\n", i, status, ret_len); break;
@@ -3599,6 +3602,7 @@ static void test_process_info(void) case ProcessExecuteFlags: case ProcessDebugPort: case ProcessDebugFlags: + case ProcessCookie: todo_wine ok(status == STATUS_ACCESS_DENIED, "for info %u expected STATUS_ACCESS_DENIED, got %08x (ret_len %u)\n", i, status, ret_len); break; diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c index 835d7e6..b299287 100644 --- a/dlls/ntdll/process.c +++ b/dlls/ntdll/process.c @@ -515,8 +515,8 @@ NTSTATUS WINAPI NtQueryInformationProcess( } break; case ProcessImageFileName: - /* FIXME: this will return a DOS path. Windows returns an NT path. Changing this would require also changing kernel32.QueryFullProcessImageName. - * The latter may be harder because of the lack of RtlNtPathNameToDosPathName. */ + /* FIXME: Should return a device path */ + case ProcessImageFileNameWin32: SERVER_START_REQ(get_dll_info) { UNICODE_STRING *image_file_name_str = ProcessInformation; diff --git a/include/winternl.h b/include/winternl.h index c3cca80..6733977 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -853,6 +853,15 @@ typedef enum _PROCESSINFOCLASS { ProcessDebugFlags = 31, ProcessHandleTracing = 32, ProcessExecuteFlags = 34, + ProcessTlsInformation = 35, + ProcessCookie = 36, + ProcessImageInformation = 37, + ProcessCycleTime = 38, + ProcessPagePriority = 39, + ProcessInstrumentationCallback = 40, + ProcessThreadStackAllocation = 41, + ProcessWorkingSetWatchEx = 42, + ProcessImageFileNameWin32 = 43, MaxProcessInfoClass } PROCESSINFOCLASS, PROCESS_INFORMATION_CLASS;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- v2: fix test failures
dlls/ntdll/tests/info.c | 21 ++++++++------------- dlls/ntdll/tests/ntdll_test.h | 1 + 2 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 54321e5..75afd76 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -1416,12 +1416,11 @@ static void test_query_process_handlecount(void)
static void test_query_process_image_file_name(void) { + static const WCHAR deviceW[] = {'\','D','e','v','i','c','e','\'}; NTSTATUS status; ULONG ReturnLength; UNICODE_STRING image_file_name; - void *buffer; - char *file_nameA; - INT len; + UNICODE_STRING *buffer = NULL;
status = pNtQueryInformationProcess(NULL, ProcessImageFileName, &image_file_name, sizeof(image_file_name), NULL); if (status == STATUS_INVALID_INFO_CLASS) @@ -1437,18 +1436,14 @@ static void test_query_process_image_file_name(void) status = pNtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileName, &image_file_name, sizeof(image_file_name), &ReturnLength); ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
- buffer = HeapAlloc(GetProcessHeap(), 0, ReturnLength); + buffer = heap_alloc(ReturnLength); status = pNtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileName, buffer, ReturnLength, &ReturnLength); ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); - memcpy(&image_file_name, buffer, sizeof(image_file_name)); - len = WideCharToMultiByte(CP_ACP, 0, image_file_name.Buffer, image_file_name.Length/sizeof(WCHAR), NULL, 0, NULL, NULL); - file_nameA = HeapAlloc(GetProcessHeap(), 0, len + 1); - WideCharToMultiByte(CP_ACP, 0, image_file_name.Buffer, image_file_name.Length/sizeof(WCHAR), file_nameA, len, NULL, NULL); - file_nameA[len] = '\0'; - HeapFree(GetProcessHeap(), 0, buffer); - trace("process image file name: %s\n", file_nameA); - todo_wine ok(strncmp(file_nameA, "\Device\", 8) == 0, "Process image name should be an NT path beginning with \Device\ (is %s)\n", file_nameA); - HeapFree(GetProcessHeap(), 0, file_nameA); +todo_wine + ok(!memcmp(buffer->Buffer, deviceW, sizeof(deviceW)), + "Expected image name to begin with \Device\, got %s\n", + wine_dbgstr_wn(buffer->Buffer, buffer->Length / sizeof(WCHAR))); + heap_free(buffer); }
static void test_query_process_debug_object_handle(int argc, char **argv) diff --git a/dlls/ntdll/tests/ntdll_test.h b/dlls/ntdll/tests/ntdll_test.h index 167e5ca..a8066c5 100644 --- a/dlls/ntdll/tests/ntdll_test.h +++ b/dlls/ntdll/tests/ntdll_test.h @@ -33,3 +33,4 @@ #include "winternl.h"
#include "wine/test.h" +#include "wine/heap.h"
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=36408
Your paranoid android.
=== w7u (32 bit threadpool) === threadpool.c:1645: Test failed: expected info.userdata = 0, got 65536 threadpool.c:1652: Test failed: expected info.userdata = 1, got 65536 threadpool.c:1654: Test failed: WaitForSingleObject returned 0
=== w864 (32 bit threadpool) === threadpool.c:1768: Test failed: WaitForSingleObject returned 258 threadpool.c:1769: Test failed: expected info.userdata = 2, got 1
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntdll/tests/info.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 75afd76..6c93c3c 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -1444,6 +1444,28 @@ todo_wine "Expected image name to begin with \Device\, got %s\n", wine_dbgstr_wn(buffer->Buffer, buffer->Length / sizeof(WCHAR))); heap_free(buffer); + + status = pNtQueryInformationProcess(NULL, ProcessImageFileNameWin32, &image_file_name, sizeof(image_file_name), NULL); + if (status == STATUS_INVALID_INFO_CLASS) + { + win_skip("ProcessImageFileNameWin32 is not supported\n"); + return; + } + ok( status == STATUS_INVALID_HANDLE, "Expected STATUS_INVALID_HANDLE, got %08x\n", status); + + status = pNtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileNameWin32, &image_file_name, 2, &ReturnLength); + ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); + + status = pNtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileNameWin32, &image_file_name, sizeof(image_file_name), &ReturnLength); + ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status); + + buffer = heap_alloc(ReturnLength); + status = pNtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileNameWin32, buffer, ReturnLength, &ReturnLength); + ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", status); + ok(memcmp(buffer->Buffer, deviceW, sizeof(deviceW)), + "Expected image name not to begin with \Device\, got %s\n", + wine_dbgstr_wn(buffer->Buffer, buffer->Length / sizeof(WCHAR))); + heap_free(buffer); }
static void test_query_process_debug_object_handle(int argc, char **argv)