[PATCH v2 0/2] MR10558: kernelbase: Implement GetMachineTypeAttributes()
Needed for Steam to correctly use its x86_64 version on ARM64. -- v2: kernelbase/tests: Add tests for GetMachineTypeAttributes(). https://gitlab.winehq.org/wine/wine/-/merge_requests/10558
From: Brendan Shanks <bshanks@codeweavers.com> --- dlls/kernel32/kernel32.spec | 1 + dlls/kernelbase/kernelbase.spec | 1 + dlls/kernelbase/process.c | 32 ++++++++++++++++++++++++++++++++ include/processthreadsapi.h | 8 ++++++++ include/winbase.h | 7 ------- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 517a485ef41..87eb83a225d 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -732,6 +732,7 @@ # @ stub GetLongPathNameTransactedA # @ stub GetLongPathNameTransactedW @ stdcall -import GetLongPathNameW(wstr ptr long) +@ stdcall -import GetMachineTypeAttributes(long ptr) @ stdcall GetMailslotInfo(long ptr ptr ptr ptr) @ stdcall GetMaximumProcessorCount(long) @ stdcall GetMaximumProcessorGroupCount() diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 28c5376e4cd..2c5906a29c2 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -587,6 +587,7 @@ @ stdcall GetLogicalProcessorInformationEx(long ptr ptr) @ stdcall GetLongPathNameA(str ptr long) @ stdcall GetLongPathNameW(wstr ptr long) +@ stdcall GetMachineTypeAttributes(long ptr) @ stdcall GetMappedFileNameA(long ptr ptr long) @ stdcall GetMappedFileNameW(long ptr ptr long) # @ stub GetMemoryErrorHandlingCapabilities diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index ee1f2e7d010..a775b81f878 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -826,6 +826,38 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetHandleInformation( HANDLE handle, DWORD *flags } +/*********************************************************************** + * GetMachineTypeAttributes (kernelbase.@) + */ +HRESULT WINAPI GetMachineTypeAttributes( USHORT machine, MACHINE_ATTRIBUTES *attr ) +{ + SYSTEM_SUPPORTED_PROCESSOR_ARCHITECTURES_INFORMATION machines[8]; + HANDLE process = NULL; + NTSTATUS status; + + status = NtQuerySystemInformationEx( SystemSupportedProcessorArchitectures2, &process, sizeof(process), + machines, sizeof(machines), NULL ); + if (status) return HRESULT_FROM_NT(status); + + *attr = 0; + + for (unsigned int i = 0; machines[i].Machine; i++) + { + if (machines[i].Machine == machine) + { + if (machines[i].KernelMode) + *attr |= KernelEnabled; + if (machines[i].UserMode) + *attr |= UserEnabled; + if (machines[i].WoW64Container) + *attr |= Wow64Container; + } + } + + return S_OK; +} + + /*********************************************************************** * GetPriorityClass (kernelbase.@) */ diff --git a/include/processthreadsapi.h b/include/processthreadsapi.h index 16e0c452384..c389b616f7b 100644 --- a/include/processthreadsapi.h +++ b/include/processthreadsapi.h @@ -36,6 +36,13 @@ typedef enum _THREAD_INFORMATION_CLASS ThreadInformationClassMax } THREAD_INFORMATION_CLASS; +typedef enum _MACHINE_ATTRIBUTES +{ + UserEnabled = 0x00000001, + KernelEnabled = 0x00000002, + Wow64Container = 0x00000004, +} MACHINE_ATTRIBUTES; + typedef struct _MEMORY_PRIORITY_INFORMATION { ULONG MemoryPriority; @@ -49,6 +56,7 @@ typedef struct _THREAD_POWER_THROTTLING_STATE } THREAD_POWER_THROTTLING_STATE; WINBASEAPI VOID WINAPI GetCurrentThreadStackLimits(ULONG_PTR *, ULONG_PTR *); +WINBASEAPI HRESULT WINAPI GetMachineTypeAttributes(USHORT,MACHINE_ATTRIBUTES *); WINBASEAPI HRESULT WINAPI GetThreadDescription(HANDLE,PWSTR *); WINBASEAPI HRESULT WINAPI SetThreadDescription(HANDLE,PCWSTR); WINBASEAPI BOOL WINAPI SetThreadInformation(HANDLE,THREAD_INFORMATION_CLASS,LPVOID,DWORD); diff --git a/include/winbase.h b/include/winbase.h index b4d7a0ef6a2..ed0e2bbb8f7 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1416,13 +1416,6 @@ 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; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10558
From: Brendan Shanks <bshanks@codeweavers.com> --- dlls/kernelbase/tests/process.c | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/dlls/kernelbase/tests/process.c b/dlls/kernelbase/tests/process.c index 9217d07bc0c..e662fc1ac62 100644 --- a/dlls/kernelbase/tests/process.c +++ b/dlls/kernelbase/tests/process.c @@ -43,6 +43,8 @@ static HANDLE (WINAPI *pOpenFileMappingFromApp)( ULONG, BOOL, LPCWSTR); static HANDLE (WINAPI *pCreateFileMappingFromApp)(HANDLE, PSECURITY_ATTRIBUTES, ULONG, ULONG64, PCWSTR); static LPVOID (WINAPI *pMapViewOfFileFromApp)(HANDLE, ULONG, ULONG64, SIZE_T); static BOOL (WINAPI *pUnmapViewOfFile2)(HANDLE, void *, ULONG); +static HRESULT (WINAPI *pGetMachineTypeAttributes)(USHORT, MACHINE_ATTRIBUTES *); +static BOOL (WINAPI *pIsWow64Process2)(HANDLE, USHORT *, USHORT *); static void test_CompareObjectHandles(void) { @@ -627,6 +629,46 @@ static void test_QueryProcessCycleTime(void) ok( cycles2 > cycles1, "CPU cycles used by process should be increasing.\n" ); } +static void test_GetMachineTypeAttributes(void) +{ + HRESULT hr; + MACHINE_ATTRIBUTES attributes, expected; + USHORT process_machine, native_machine; + static const WORD machines[] = { 0, IMAGE_FILE_MACHINE_I386, + IMAGE_FILE_MACHINE_AMD64, + IMAGE_FILE_MACHINE_ARM64 }; + + if (!pGetMachineTypeAttributes) + { + win_skip("GetMachineTypeAttributes() is not supported.\n"); + return; + } + + pIsWow64Process2(GetCurrentProcess(), &process_machine, &native_machine); + + if (0) /* crashes on Windows */ + hr = pGetMachineTypeAttributes(0, NULL); + + for (unsigned int i = 0; i < ARRAY_SIZE(machines); i++) + { + winetest_push_context("%04x", machines[i]); + hr = pGetMachineTypeAttributes(machines[i], &attributes); + ok(hr == S_OK, "GetMachineTypeAttributes error 0x%08lx\n", hr); + + expected = 0; + if (machines[i] == native_machine) + expected |= UserEnabled | KernelEnabled; + else if (machines[i] == IMAGE_FILE_MACHINE_I386) + expected |= UserEnabled | Wow64Container; + else if (machines[i] == IMAGE_FILE_MACHINE_AMD64 && + native_machine == IMAGE_FILE_MACHINE_ARM64) + expected |= UserEnabled; + + ok(attributes == expected, "Got attributes 0x%08x, expected 0x%08x\n", attributes, expected); + winetest_pop_context(); + } +} + static void init_funcs(void) { HMODULE hmod = GetModuleHandleA("kernelbase.dll"); @@ -634,6 +676,8 @@ static void init_funcs(void) #define X(f) { p##f = (void*)GetProcAddress(hmod, #f); } X(CompareObjectHandles); X(CreateFileMappingFromApp); + X(GetMachineTypeAttributes); + X(IsWow64Process2); X(MapViewOfFile3); X(MapViewOfFileFromApp); X(OpenFileMappingFromApp); @@ -663,4 +707,5 @@ START_TEST(process) test_CreateFileMappingFromApp(); test_MapViewOfFileFromApp(); test_QueryProcessCycleTime(); + test_GetMachineTypeAttributes(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10558
participants (2)
-
Brendan Shanks -
Brendan Shanks (@bshanks)