[PATCH v2 0/1] MR4620: kernel32: Implement GetProcessInformation(ProcessMachineTypeInfo).
Marking as a draft for now, until !4605 is merged first. -- v2: kernel32: Implement GetProcessInformation(ProcessMachineTypeInfo). https://gitlab.winehq.org/wine/wine/-/merge_requests/4620
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/kernel32/kernel32.spec | 1 + dlls/kernel32/tests/process.c | 57 +++++++++++++++++++++++++++++++++ dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/process.c | 51 +++++++++++++++++++++++++++++ include/winbase.h | 15 +++++++++ 5 files changed, 125 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 7e2a2ae8064..f92d6bf0738 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -798,6 +798,7 @@ @ stdcall -import GetProcessHeaps(long ptr) RtlGetProcessHeaps @ stdcall -import GetProcessId(long) @ stdcall -import GetProcessIdOfThread(long) +@ stdcall GetProcessInformation(long long ptr long) @ stdcall GetProcessIoCounters(long ptr) @ stdcall -import GetProcessMitigationPolicy(long long ptr long) @ stdcall -import GetProcessPreferredUILanguages(long ptr ptr ptr) diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index d59074b988c..5f5327245fc 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -96,6 +96,7 @@ static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*); static DWORD (WINAPI *pGetActiveProcessorCount)(WORD); static DWORD (WINAPI *pGetMaximumProcessorCount)(WORD); +static BOOL (WINAPI *pGetProcessInformation)(HANDLE,PROCESS_INFORMATION_CLASS,void*,DWORD); /* ############################### */ static char base[MAX_PATH]; @@ -282,6 +283,7 @@ static BOOL init(void) pDeleteProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "DeleteProcThreadAttributeList"); pGetActiveProcessorCount = (void *)GetProcAddress(hkernel32, "GetActiveProcessorCount"); pGetMaximumProcessorCount = (void *)GetProcAddress(hkernel32, "GetMaximumProcessorCount"); + pGetProcessInformation = (void *)GetProcAddress(hkernel32, "GetProcessInformation"); return TRUE; } @@ -5279,6 +5281,60 @@ static void test_startupinfo( void ) params->dwFlags ^= STARTF_USESTDHANDLES; } +static void test_GetProcessInformation(void) +{ + SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION machines[8]; + PROCESS_MACHINE_INFORMATION mi; + NTSTATUS status; + HANDLE process; + unsigned int i; + BOOL ret; + + if (!pGetProcessInformation) + { + win_skip("GetProcessInformation() is not available.\n"); + return; + } + + ret = pGetProcessInformation(GetCurrentProcess(), ProcessMachineTypeInfo, NULL, 0); + ok(!ret, "Unexpected return value %d.\n", ret); + ok(GetLastError() == ERROR_BAD_LENGTH, "Unexpected error %ld.\n", GetLastError()); + ret = pGetProcessInformation(GetCurrentProcess(), ProcessMachineTypeInfo, &mi, 0); + ok(!ret, "Unexpected return value %d.\n", ret); + ok(GetLastError() == ERROR_BAD_LENGTH, "Unexpected error %ld.\n", GetLastError()); + ret = pGetProcessInformation(GetCurrentProcess(), ProcessMachineTypeInfo, &mi, sizeof(mi) - 1); + ok(!ret, "Unexpected return value %d.\n", ret); + ok(GetLastError() == ERROR_BAD_LENGTH, "Unexpected error %ld.\n", GetLastError()); + ret = pGetProcessInformation(GetCurrentProcess(), ProcessMachineTypeInfo, &mi, sizeof(mi) + 1); + ok(!ret, "Unexpected return value %d.\n", ret); + ok(GetLastError() == ERROR_BAD_LENGTH, "Unexpected error %ld.\n", GetLastError()); + + ret = pGetProcessInformation(GetCurrentProcess(), ProcessMachineTypeInfo, &mi, sizeof(mi)); + ok(ret, "Unexpected return value %d.\n", ret); + + process = GetCurrentProcess(); + status = NtQuerySystemInformationEx( SystemSupportedProcessorArchitectures, &process, sizeof(process), + machines, sizeof(machines), NULL ); + ok(!status, "Failed to get architectures information.\n"); + for (i = 0; machines[i].Machine; i++) + { + if (machines[i].Process) + { + ok(mi.ProcessMachine == machines[i].Machine, "Unexpected process machine %#x.\n", mi.ProcessMachine); + ok(!mi.Res0, "Unexpected process machine %#x.\n", mi.ProcessMachine); + ok(!!(mi.MachineAttributes & UserEnabled) == machines[i].UserMode, "Unexpected attributes %#x.\n", + mi.MachineAttributes); + ok(!!(mi.MachineAttributes & KernelEnabled) == machines[i].KernelMode, "Unexpected attributes %#x.\n", + mi.MachineAttributes); + ok(!!(mi.MachineAttributes & Wow64Container) == machines[i].WoW64Container, "Unexpected attributes %#x.\n", + mi.MachineAttributes); + ok(!(mi.MachineAttributes & ~(UserEnabled | KernelEnabled | Wow64Container)), "Unexpected attributes %#x.\n", + mi.MachineAttributes); + break; + } + } +} + START_TEST(process) { HANDLE job, hproc, h, h2; @@ -5408,6 +5464,7 @@ START_TEST(process) test_dead_process(); test_services_exe(); test_startupinfo(); + test_GetProcessInformation(); /* things that can be tested: * lookup: check the way program to be executed is searched diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index e85f2b67d74..ffb153a46ee 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -660,7 +660,7 @@ @ stdcall GetProcessIdOfThread(long) @ stdcall GetProcessImageFileNameA(long ptr long) @ stdcall GetProcessImageFileNameW(long ptr long) -# @ stub GetProcessInformation +@ stdcall GetProcessInformation(long long ptr long) @ stdcall GetProcessMemoryInfo(long ptr long) @ stdcall GetProcessMitigationPolicy(long long ptr long) @ stdcall GetProcessPreferredUILanguages(long ptr ptr ptr) diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index 0c5104e7452..1aeb8f55257 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -1038,6 +1038,57 @@ BOOL WINAPI DECLSPEC_HOTPATCH IsWow64Process( HANDLE process, PBOOL wow64 ) return set_ntstatus( status ); } +/********************************************************************* + * GetProcessInformation (kernelbase.@) + */ +BOOL WINAPI GetProcessInformation( HANDLE process, PROCESS_INFORMATION_CLASS info_class, void *data, DWORD size ) +{ + switch (info_class) + { + case ProcessMachineTypeInfo: + { + PROCESS_MACHINE_INFORMATION *mi = data; + SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION machines[8]; + NTSTATUS status; + ULONG i; + + if (size != sizeof(*mi)) + { + SetLastError(ERROR_BAD_LENGTH); + return FALSE; + } + + status = NtQuerySystemInformationEx( SystemSupportedProcessorArchitectures, &process, sizeof(process), + machines, sizeof(machines), NULL ); + if (status) return set_ntstatus( status ); + + for (i = 0; machines[i].Machine; i++) + { + if (machines[i].Process) + { + mi->ProcessMachine = machines[i].Machine; + mi->Res0 = 0; + mi->MachineAttributes = 0; + if (machines[i].KernelMode) + mi->MachineAttributes |= KernelEnabled; + if (machines[i].UserMode) + mi->MachineAttributes |= UserEnabled; + if (machines[i].WoW64Container) + mi->MachineAttributes |= Wow64Container; + + return TRUE; + } + } + + break; + } + default: + FIXME("Unsupported information class %d.\n", info_class); + } + + return FALSE; +} + /********************************************************************* * OpenProcess (kernelbase.@) diff --git a/include/winbase.h b/include/winbase.h index 16e449f7c2d..fe143cc7a61 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1771,6 +1771,20 @@ typedef struct _WIN32_MEMORY_RANGE_ENTRY SIZE_T NumberOfBytes; } WIN32_MEMORY_RANGE_ENTRY, *PWIN32_MEMORY_RANGE_ENTRY; +typedef enum _MACHINE_ATTRIBUTES +{ + UserEnabled = 0x00000001, + KernelEnabled = 0x00000002, + Wow64Container = 0x00000004, +} MACHINE_ATTRIBUTES; + +typedef struct _PROCESS_MACHINE_INFORMATION +{ + USHORT ProcessMachine; + USHORT Res0; + MACHINE_ATTRIBUTES MachineAttributes; +} PROCESS_MACHINE_INFORMATION; + typedef enum _PROCESS_INFORMATION_CLASS { ProcessMemoryPriority, @@ -2274,6 +2288,7 @@ WINBASEAPI BOOL WINAPI GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR WINBASEAPI DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE); WINBASEAPI DWORD WINAPI GetProcessId(HANDLE); WINBASEAPI DWORD WINAPI GetProcessIdOfThread(HANDLE); +WINBASEAPI BOOL WINAPI GetProcessInformation(HANDLE,PROCESS_INFORMATION_CLASS,void*,DWORD); WINBASEAPI BOOL WINAPI GetProcessIoCounters(HANDLE,PIO_COUNTERS); WINBASEAPI BOOL WINAPI GetProcessPriorityBoost(HANDLE,PBOOL); WINBASEAPI BOOL WINAPI GetProcessShutdownParameters(LPDWORD,LPDWORD); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4620
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=140880 Your paranoid android. === build (build log) === ../wine/dlls/kernel32/tests/process.c:5286:5: error: unknown type name ���SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION���; did you mean ���SYSTEM_PROCESSOR_FEATURES_INFORMATION���? ../wine/dlls/kernel32/tests/process.c:5319:28: error: request for member ���Machine��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5321:24: error: request for member ���Process��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5323:48: error: request for member ���Machine��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5325:69: error: request for member ���UserMode��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5327:71: error: request for member ���KernelMode��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5329:72: error: request for member ���WoW64Container��� in something not a structure or union Task: The exe32 Wine build failed === debian11 (build log) === ../wine/dlls/kernel32/tests/process.c:5286:5: error: unknown type name ���SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION���; did you mean ���SYSTEM_PROCESSOR_FEATURES_INFORMATION���? ../wine/dlls/kernel32/tests/process.c:5319:28: error: request for member ���Machine��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5321:24: error: request for member ���Process��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5323:48: error: request for member ���Machine��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5325:69: error: request for member ���UserMode��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5327:71: error: request for member ���KernelMode��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5329:72: error: request for member ���WoW64Container��� in something not a structure or union Task: The win32 Wine build failed === debian11b (build log) === ../wine/dlls/kernel32/tests/process.c:5286:5: error: unknown type name ���SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION���; did you mean ���SYSTEM_PROCESSOR_FEATURES_INFORMATION���? ../wine/dlls/kernel32/tests/process.c:5319:28: error: request for member ���Machine��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5321:24: error: request for member ���Process��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5323:48: error: request for member ���Machine��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5325:69: error: request for member ���UserMode��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5327:71: error: request for member ���KernelMode��� in something not a structure or union ../wine/dlls/kernel32/tests/process.c:5329:72: error: request for member ���WoW64Container��� in something not a structure or union Task: The wow64 Wine build failed
participants (3)
-
Marvin -
Nikolay Sivov -
Nikolay Sivov (@nsivov)