Commit f27b6220 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

kernel32: Implement GetProcessInformation(ProcessMachineTypeInfo).

parent 157d5402
...@@ -798,6 +798,7 @@ ...@@ -798,6 +798,7 @@
@ stdcall -import GetProcessHeaps(long ptr) RtlGetProcessHeaps @ stdcall -import GetProcessHeaps(long ptr) RtlGetProcessHeaps
@ stdcall -import GetProcessId(long) @ stdcall -import GetProcessId(long)
@ stdcall -import GetProcessIdOfThread(long) @ stdcall -import GetProcessIdOfThread(long)
@ stdcall GetProcessInformation(long long ptr long)
@ stdcall GetProcessIoCounters(long ptr) @ stdcall GetProcessIoCounters(long ptr)
@ stdcall -import GetProcessMitigationPolicy(long long ptr long) @ stdcall -import GetProcessMitigationPolicy(long long ptr long)
@ stdcall -import GetProcessPreferredUILanguages(long ptr ptr ptr) @ stdcall -import GetProcessPreferredUILanguages(long ptr ptr ptr)
......
...@@ -96,6 +96,7 @@ static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE ...@@ -96,6 +96,7 @@ static BOOL (WINAPI *pUpdateProcThreadAttribute)(struct _PROC_THREAD_ATTRIBUTE
static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*); static void (WINAPI *pDeleteProcThreadAttributeList)(struct _PROC_THREAD_ATTRIBUTE_LIST*);
static DWORD (WINAPI *pGetActiveProcessorCount)(WORD); static DWORD (WINAPI *pGetActiveProcessorCount)(WORD);
static DWORD (WINAPI *pGetMaximumProcessorCount)(WORD); static DWORD (WINAPI *pGetMaximumProcessorCount)(WORD);
static BOOL (WINAPI *pGetProcessInformation)(HANDLE,PROCESS_INFORMATION_CLASS,void*,DWORD);
/* ############################### */ /* ############################### */
static char base[MAX_PATH]; static char base[MAX_PATH];
...@@ -282,6 +283,7 @@ static BOOL init(void) ...@@ -282,6 +283,7 @@ static BOOL init(void)
pDeleteProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "DeleteProcThreadAttributeList"); pDeleteProcThreadAttributeList = (void *)GetProcAddress(hkernel32, "DeleteProcThreadAttributeList");
pGetActiveProcessorCount = (void *)GetProcAddress(hkernel32, "GetActiveProcessorCount"); pGetActiveProcessorCount = (void *)GetProcAddress(hkernel32, "GetActiveProcessorCount");
pGetMaximumProcessorCount = (void *)GetProcAddress(hkernel32, "GetMaximumProcessorCount"); pGetMaximumProcessorCount = (void *)GetProcAddress(hkernel32, "GetMaximumProcessorCount");
pGetProcessInformation = (void *)GetProcAddress(hkernel32, "GetProcessInformation");
return TRUE; return TRUE;
} }
...@@ -5279,6 +5281,60 @@ static void test_startupinfo( void ) ...@@ -5279,6 +5281,60 @@ static void test_startupinfo( void )
params->dwFlags ^= STARTF_USESTDHANDLES; 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) START_TEST(process)
{ {
HANDLE job, hproc, h, h2; HANDLE job, hproc, h, h2;
...@@ -5408,6 +5464,7 @@ START_TEST(process) ...@@ -5408,6 +5464,7 @@ START_TEST(process)
test_dead_process(); test_dead_process();
test_services_exe(); test_services_exe();
test_startupinfo(); test_startupinfo();
test_GetProcessInformation();
/* things that can be tested: /* things that can be tested:
* lookup: check the way program to be executed is searched * lookup: check the way program to be executed is searched
......
...@@ -660,7 +660,7 @@ ...@@ -660,7 +660,7 @@
@ stdcall GetProcessIdOfThread(long) @ stdcall GetProcessIdOfThread(long)
@ stdcall GetProcessImageFileNameA(long ptr long) @ stdcall GetProcessImageFileNameA(long ptr long)
@ stdcall GetProcessImageFileNameW(long ptr long) @ stdcall GetProcessImageFileNameW(long ptr long)
# @ stub GetProcessInformation @ stdcall GetProcessInformation(long long ptr long)
@ stdcall GetProcessMemoryInfo(long ptr long) @ stdcall GetProcessMemoryInfo(long ptr long)
@ stdcall GetProcessMitigationPolicy(long long ptr long) @ stdcall GetProcessMitigationPolicy(long long ptr long)
@ stdcall GetProcessPreferredUILanguages(long ptr ptr ptr) @ stdcall GetProcessPreferredUILanguages(long ptr ptr ptr)
......
...@@ -1038,6 +1038,57 @@ BOOL WINAPI DECLSPEC_HOTPATCH IsWow64Process( HANDLE process, PBOOL wow64 ) ...@@ -1038,6 +1038,57 @@ BOOL WINAPI DECLSPEC_HOTPATCH IsWow64Process( HANDLE process, PBOOL wow64 )
return set_ntstatus( status ); 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.@) * OpenProcess (kernelbase.@)
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#define CompareString __carbon_CompareString #define CompareString __carbon_CompareString
#define GetCurrentThread __carbon_GetCurrentThread #define GetCurrentThread __carbon_GetCurrentThread
#define GetCurrentProcess __carbon_GetCurrentProcess #define GetCurrentProcess __carbon_GetCurrentProcess
#define GetProcessInformation __carbon_GetProcessInformation
#define AnimatePalette __carbon_AnimatePalette #define AnimatePalette __carbon_AnimatePalette
#define DeleteMenu __carbon_DeleteMenu #define DeleteMenu __carbon_DeleteMenu
#define DrawMenu __carbon_DrawMenu #define DrawMenu __carbon_DrawMenu
...@@ -72,6 +73,7 @@ ...@@ -72,6 +73,7 @@
#undef GetCurrentThread #undef GetCurrentThread
#undef _CDECL #undef _CDECL
#undef GetCurrentProcess #undef GetCurrentProcess
#undef GetProcessInformation
#undef AnimatePalette #undef AnimatePalette
#undef CheckMenuItem #undef CheckMenuItem
#undef DeleteMenu #undef DeleteMenu
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#define GetCurrentProcess MacGetCurrentProcess #define GetCurrentProcess MacGetCurrentProcess
#define GetCurrentThread MacGetCurrentThread #define GetCurrentThread MacGetCurrentThread
#define GetProcessInformation MacGetProcessInformation
#define LoadResource MacLoadResource #define LoadResource MacLoadResource
#define AnimatePalette MacAnimatePalette #define AnimatePalette MacAnimatePalette
#define EqualRgn MacEqualRgn #define EqualRgn MacEqualRgn
...@@ -59,6 +60,7 @@ ...@@ -59,6 +60,7 @@
#undef GetCurrentProcess #undef GetCurrentProcess
#undef GetCurrentThread #undef GetCurrentThread
#undef GetProcessInformation
#undef LoadResource #undef LoadResource
#undef AnimatePalette #undef AnimatePalette
#undef EqualRgn #undef EqualRgn
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#ifdef __APPLE__ #ifdef __APPLE__
#define GetCurrentProcess GetCurrentProcess_Mac #define GetCurrentProcess GetCurrentProcess_Mac
#define GetCurrentThread GetCurrentThread_Mac #define GetCurrentThread GetCurrentThread_Mac
#define GetProcessInformation GetProcessInformation_Mac
#define LoadResource LoadResource_Mac #define LoadResource LoadResource_Mac
#define AnimatePalette AnimatePalette_Mac #define AnimatePalette AnimatePalette_Mac
#define EqualRgn EqualRgn_Mac #define EqualRgn EqualRgn_Mac
...@@ -71,6 +72,7 @@ ...@@ -71,6 +72,7 @@
#include <ApplicationServices/ApplicationServices.h> #include <ApplicationServices/ApplicationServices.h>
#undef GetCurrentProcess #undef GetCurrentProcess
#undef GetCurrentThread #undef GetCurrentThread
#undef GetProcessInformation
#undef LoadResource #undef LoadResource
#undef AnimatePalette #undef AnimatePalette
#undef EqualRgn #undef EqualRgn
......
...@@ -1771,6 +1771,20 @@ typedef struct _WIN32_MEMORY_RANGE_ENTRY ...@@ -1771,6 +1771,20 @@ typedef struct _WIN32_MEMORY_RANGE_ENTRY
SIZE_T NumberOfBytes; SIZE_T NumberOfBytes;
} WIN32_MEMORY_RANGE_ENTRY, *PWIN32_MEMORY_RANGE_ENTRY; } 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 typedef enum _PROCESS_INFORMATION_CLASS
{ {
ProcessMemoryPriority, ProcessMemoryPriority,
...@@ -2274,6 +2288,7 @@ WINBASEAPI BOOL WINAPI GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR ...@@ -2274,6 +2288,7 @@ WINBASEAPI BOOL WINAPI GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR
WINBASEAPI DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE); WINBASEAPI DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE);
WINBASEAPI DWORD WINAPI GetProcessId(HANDLE); WINBASEAPI DWORD WINAPI GetProcessId(HANDLE);
WINBASEAPI DWORD WINAPI GetProcessIdOfThread(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 GetProcessIoCounters(HANDLE,PIO_COUNTERS);
WINBASEAPI BOOL WINAPI GetProcessPriorityBoost(HANDLE,PBOOL); WINBASEAPI BOOL WINAPI GetProcessPriorityBoost(HANDLE,PBOOL);
WINBASEAPI BOOL WINAPI GetProcessShutdownParameters(LPDWORD,LPDWORD); WINBASEAPI BOOL WINAPI GetProcessShutdownParameters(LPDWORD,LPDWORD);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment