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