From: Andrew Wesie awesie@gmail.com
Querying for ProcessCookie must be called in the current process for it to return a valid value.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/kernel32/tests/process.c | 246 ++++++++++++++++++++++++++++-------------- 1 file changed, 166 insertions(+), 80 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 0eb113b..696ef7b 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -3461,86 +3461,88 @@ static void test_session_info(void) trace("active_session = %x\n", active_session); }
-static void test_process_info(void) -{ - char buf[4096]; - static const ULONG info_size[] = - { - sizeof(PROCESS_BASIC_INFORMATION) /* ProcessBasicInformation */, - sizeof(QUOTA_LIMITS) /* ProcessQuotaLimits */, - sizeof(IO_COUNTERS) /* ProcessIoCounters */, - sizeof(VM_COUNTERS) /* ProcessVmCounters */, - sizeof(KERNEL_USER_TIMES) /* ProcessTimes */, - sizeof(ULONG) /* ProcessBasePriority */, - sizeof(ULONG) /* ProcessRaisePriority */, - sizeof(HANDLE) /* ProcessDebugPort */, - sizeof(HANDLE) /* ProcessExceptionPort */, - 0 /* FIXME: sizeof(PROCESS_ACCESS_TOKEN) ProcessAccessToken */, - 0 /* FIXME: sizeof(PROCESS_LDT_INFORMATION) ProcessLdtInformation */, - 0 /* FIXME: sizeof(PROCESS_LDT_SIZE) ProcessLdtSize */, - sizeof(ULONG) /* ProcessDefaultHardErrorMode */, - 0 /* ProcessIoPortHandlers: kernel-mode only */, - 0 /* FIXME: sizeof(POOLED_USAGE_AND_LIMITS) ProcessPooledUsageAndLimits */, - 0 /* FIXME: sizeof(PROCESS_WS_WATCH_INFORMATION) ProcessWorkingSetWatch */, - sizeof(ULONG) /* ProcessUserModeIOPL */, - sizeof(BOOLEAN) /* ProcessEnableAlignmentFaultFixup */, - sizeof(PROCESS_PRIORITY_CLASS) /* ProcessPriorityClass */, - sizeof(ULONG) /* ProcessWx86Information */, - sizeof(ULONG) /* ProcessHandleCount */, - sizeof(ULONG_PTR) /* ProcessAffinityMask */, - sizeof(ULONG) /* ProcessPriorityBoost */, - 0 /* sizeof(PROCESS_DEVICEMAP_INFORMATION) ProcessDeviceMap */, - 0 /* sizeof(PROCESS_SESSION_INFORMATION) ProcessSessionInformation */, - 0 /* sizeof(PROCESS_FOREGROUND_BACKGROUND) ProcessForegroundInformation */, - sizeof(ULONG_PTR) /* ProcessWow64Information */, - sizeof(buf) /* ProcessImageFileName */, - sizeof(ULONG) /* ProcessLUIDDeviceMapsEnabled */, - sizeof(ULONG) /* ProcessBreakOnTermination */, - sizeof(HANDLE) /* ProcessDebugObjectHandle */, - sizeof(ULONG) /* ProcessDebugFlags */, - sizeof(buf) /* ProcessHandleTracing */, - sizeof(ULONG) /* ProcessIoPriority */, - sizeof(ULONG) /* ProcessExecuteFlags */, - 0 /* FIXME: sizeof(?) ProcessTlsInformation */, - 0 /* FIXME: sizeof(?) ProcessCookie */, - sizeof(SECTION_IMAGE_INFORMATION) /* ProcessImageInformation */, - 0 /* FIXME: sizeof(PROCESS_CYCLE_TIME_INFORMATION) ProcessCycleTime */, - sizeof(ULONG) /* ProcessPagePriority */, - 40 /* ProcessInstrumentationCallback */, - 0 /* FIXME: sizeof(PROCESS_STACK_ALLOCATION_INFORMATION) ProcessThreadStackAllocation */, - 0 /* FIXME: sizeof(PROCESS_WS_WATCH_INFORMATION_EX[]) ProcessWorkingSetWatchEx */, - sizeof(buf) /* ProcessImageFileNameWin32 */, +#define BUFFER_SIZE 4096 +static const ULONG info_size[] = +{ + sizeof(PROCESS_BASIC_INFORMATION) /* ProcessBasicInformation */, + sizeof(QUOTA_LIMITS) /* ProcessQuotaLimits */, + sizeof(IO_COUNTERS) /* ProcessIoCounters */, + sizeof(VM_COUNTERS) /* ProcessVmCounters */, + sizeof(KERNEL_USER_TIMES) /* ProcessTimes */, + sizeof(ULONG) /* ProcessBasePriority */, + sizeof(ULONG) /* ProcessRaisePriority */, + sizeof(HANDLE) /* ProcessDebugPort */, + sizeof(HANDLE) /* ProcessExceptionPort */, + 0 /* FIXME: sizeof(PROCESS_ACCESS_TOKEN) ProcessAccessToken */, + 0 /* FIXME: sizeof(PROCESS_LDT_INFORMATION) ProcessLdtInformation */, + 0 /* FIXME: sizeof(PROCESS_LDT_SIZE) ProcessLdtSize */, + sizeof(ULONG) /* ProcessDefaultHardErrorMode */, + 0 /* ProcessIoPortHandlers: kernel-mode only */, + 0 /* FIXME: sizeof(POOLED_USAGE_AND_LIMITS) ProcessPooledUsageAndLimits */, + 0 /* FIXME: sizeof(PROCESS_WS_WATCH_INFORMATION) ProcessWorkingSetWatch */, + sizeof(ULONG) /* ProcessUserModeIOPL */, + sizeof(BOOLEAN) /* ProcessEnableAlignmentFaultFixup */, + sizeof(PROCESS_PRIORITY_CLASS) /* ProcessPriorityClass */, + sizeof(ULONG) /* ProcessWx86Information */, + sizeof(ULONG) /* ProcessHandleCount */, + sizeof(ULONG_PTR) /* ProcessAffinityMask */, + sizeof(ULONG) /* ProcessPriorityBoost */, + 0 /* sizeof(PROCESS_DEVICEMAP_INFORMATION) ProcessDeviceMap */, + 0 /* sizeof(PROCESS_SESSION_INFORMATION) ProcessSessionInformation */, + 0 /* sizeof(PROCESS_FOREGROUND_BACKGROUND) ProcessForegroundInformation */, + sizeof(ULONG_PTR) /* ProcessWow64Information */, + BUFFER_SIZE /* ProcessImageFileName */, + sizeof(ULONG) /* ProcessLUIDDeviceMapsEnabled */, + sizeof(ULONG) /* ProcessBreakOnTermination */, + sizeof(HANDLE) /* ProcessDebugObjectHandle */, + sizeof(ULONG) /* ProcessDebugFlags */, + BUFFER_SIZE /* ProcessHandleTracing */, + sizeof(ULONG) /* ProcessIoPriority */, + sizeof(ULONG) /* ProcessExecuteFlags */, + 0 /* FIXME: sizeof(?) ProcessTlsInformation */, + sizeof(ULONG) /* ProcessCookie */, + sizeof(SECTION_IMAGE_INFORMATION) /* ProcessImageInformation */, + 0 /* FIXME: sizeof(PROCESS_CYCLE_TIME_INFORMATION) ProcessCycleTime */, + sizeof(ULONG) /* ProcessPagePriority */, + 40 /* ProcessInstrumentationCallback */, + 0 /* FIXME: sizeof(PROCESS_STACK_ALLOCATION_INFORMATION) ProcessThreadStackAllocation */, + 0 /* FIXME: sizeof(PROCESS_WS_WATCH_INFORMATION_EX[]) ProcessWorkingSetWatchEx */, + BUFFER_SIZE /* ProcessImageFileNameWin32 */, #if 0 /* FIXME: Add remaining classes */ - sizeof(HANDLE) /* ProcessImageFileMapping */, - sizeof(PROCESS_AFFINITY_UPDATE_MODE) /* ProcessAffinityUpdateMode */, - sizeof(PROCESS_MEMORY_ALLOCATION_MODE) /* ProcessMemoryAllocationMode */, - sizeof(USHORT[]) /* ProcessGroupInformation */, - sizeof(ULONG) /* ProcessTokenVirtualizationEnabled */, - sizeof(ULONG_PTR) /* ProcessConsoleHostProcess */, - sizeof(PROCESS_WINDOW_INFORMATION) /* ProcessWindowInformation */, - sizeof(PROCESS_HANDLE_SNAPSHOT_INFORMATION) /* ProcessHandleInformation */, - sizeof(PROCESS_MITIGATION_POLICY_INFORMATION) /* ProcessMitigationPolicy */, - sizeof(ProcessDynamicFunctionTableInformation) /* ProcessDynamicFunctionTableInformation */, - sizeof(?) /* ProcessHandleCheckingMode */, - sizeof(PROCESS_KEEPALIVE_COUNT_INFORMATION) /* ProcessKeepAliveCount */, - sizeof(PROCESS_REVOKE_FILE_HANDLES_INFORMATION) /* ProcessRevokeFileHandles */, - sizeof(PROCESS_WORKING_SET_CONTROL) /* ProcessWorkingSetControl */, - sizeof(?) /* ProcessHandleTable */, - sizeof(?) /* ProcessCheckStackExtentsMode */, - sizeof(buf) /* ProcessCommandLineInformation */, - sizeof(PS_PROTECTION) /* ProcessProtectionInformation */, - sizeof(PROCESS_MEMORY_EXHAUSTION_INFO) /* ProcessMemoryExhaustion */, - sizeof(PROCESS_FAULT_INFORMATION) /* ProcessFaultInformation */, - sizeof(PROCESS_TELEMETRY_ID_INFORMATION) /* ProcessTelemetryIdInformation */, - sizeof(PROCESS_COMMIT_RELEASE_INFORMATION) /* ProcessCommitReleaseInformation */, - sizeof(?) /* ProcessDefaultCpuSetsInformation */, - sizeof(?) /* ProcessAllowedCpuSetsInformation */, - 0 /* ProcessReserved1Information */, - 0 /* ProcessReserved2Information */, - sizeof(?) /* ProcessSubsystemProcess */, - sizeof(PROCESS_JOB_MEMORY_INFO) /* ProcessJobMemoryInformation */, + sizeof(HANDLE) /* ProcessImageFileMapping */, + sizeof(PROCESS_AFFINITY_UPDATE_MODE) /* ProcessAffinityUpdateMode */, + sizeof(PROCESS_MEMORY_ALLOCATION_MODE) /* ProcessMemoryAllocationMode */, + sizeof(USHORT[]) /* ProcessGroupInformation */, + sizeof(ULONG) /* ProcessTokenVirtualizationEnabled */, + sizeof(ULONG_PTR) /* ProcessConsoleHostProcess */, + sizeof(PROCESS_WINDOW_INFORMATION) /* ProcessWindowInformation */, + sizeof(PROCESS_HANDLE_SNAPSHOT_INFORMATION) /* ProcessHandleInformation */, + sizeof(PROCESS_MITIGATION_POLICY_INFORMATION) /* ProcessMitigationPolicy */, + sizeof(ProcessDynamicFunctionTableInformation) /* ProcessDynamicFunctionTableInformation */, + sizeof(?) /* ProcessHandleCheckingMode */, + sizeof(PROCESS_KEEPALIVE_COUNT_INFORMATION) /* ProcessKeepAliveCount */, + sizeof(PROCESS_REVOKE_FILE_HANDLES_INFORMATION) /* ProcessRevokeFileHandles */, + sizeof(PROCESS_WORKING_SET_CONTROL) /* ProcessWorkingSetControl */, + sizeof(?) /* ProcessHandleTable */, + sizeof(?) /* ProcessCheckStackExtentsMode */, + sizeof(buf) /* ProcessCommandLineInformation */, + sizeof(PS_PROTECTION) /* ProcessProtectionInformation */, + sizeof(PROCESS_MEMORY_EXHAUSTION_INFO) /* ProcessMemoryExhaustion */, + sizeof(PROCESS_FAULT_INFORMATION) /* ProcessFaultInformation */, + sizeof(PROCESS_TELEMETRY_ID_INFORMATION) /* ProcessTelemetryIdInformation */, + sizeof(PROCESS_COMMIT_RELEASE_INFORMATION) /* ProcessCommitReleaseInformation */, + sizeof(?) /* ProcessDefaultCpuSetsInformation */, + sizeof(?) /* ProcessAllowedCpuSetsInformation */, + 0 /* ProcessReserved1Information */, + 0 /* ProcessReserved2Information */, + sizeof(?) /* ProcessSubsystemProcess */, + sizeof(PROCESS_JOB_MEMORY_INFO) /* ProcessJobMemoryInformation */, #endif - }; +}; + +static void test_process_info(void) +{ + char buf[BUFFER_SIZE]; HANDLE hproc; ULONG i, status, ret_len, size;
@@ -3598,11 +3600,13 @@ static void test_process_info(void) ok(status == STATUS_ACCESS_DENIED || status == STATUS_PORT_NOT_SET, "for info %u expected STATUS_ACCESS_DENIED, got %08x (ret_len %u)\n", i, status, ret_len); break; - + case ProcessCookie: + ok(status == STATUS_INVALID_PARAMETER /* before win8 */ || status == STATUS_ACCESS_DENIED, + "for info %u got %08x (ret_len %u)\n", i, status, ret_len); + break; 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; @@ -3616,6 +3620,87 @@ todo_wine CloseHandle(hproc); }
+static void test_process_info_current(void) +{ + char buf[BUFFER_SIZE]; + HANDLE hproc; + ULONG i, status, ret_len, size; + + if (!pNtQueryInformationProcess) + { + win_skip("NtQueryInformationProcess is not available on this platform\n"); + return; + } + + hproc = GetCurrentProcess(); + if (!hproc) + { + win_skip("PROCESS_QUERY_LIMITED_INFORMATION is not supported on this platform\n"); + return; + } + + for (i = 0; i < MaxProcessInfoClass; i++) + { + size = info_size[i]; + if (!size) size = sizeof(buf); + ret_len = 0; + status = pNtQueryInformationProcess(hproc, i, buf, info_size[i], &ret_len); + if (status == STATUS_NOT_IMPLEMENTED) continue; + if (status == STATUS_INVALID_INFO_CLASS) continue; + if (status == STATUS_INFO_LENGTH_MISMATCH) continue; + + switch (i) + { + case ProcessBasicInformation: + case ProcessQuotaLimits: + case ProcessTimes: + case ProcessPriorityClass: + case ProcessPriorityBoost: + case ProcessLUIDDeviceMapsEnabled: + case 33 /* ProcessIoPriority */: + case ProcessIoCounters: + case ProcessVmCounters: + case ProcessWow64Information: + 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; + + case ProcessAffinityMask: + case ProcessBreakOnTermination: + ok(status == STATUS_ACCESS_DENIED /* before win8 */ || status == STATUS_SUCCESS /* win8 is less strict */, + "for info %u expected STATUS_SUCCESS, got %08x (ret_len %u)\n", i, status, ret_len); + break; + + case ProcessDebugObjectHandle: + ok(status == STATUS_ACCESS_DENIED || status == STATUS_PORT_NOT_SET, + "for info %u expected STATUS_ACCESS_DENIED, got %08x (ret_len %u)\n", i, status, ret_len); + break; + case ProcessCookie: + ok(status == STATUS_SUCCESS || status == STATUS_INVALID_PARAMETER /* before win8 */, + "for info %u got %08x (ret_len %u)\n", i, status, ret_len); + break; + case ProcessExecuteFlags: + case ProcessDebugPort: + case ProcessDebugFlags: + ok(status == STATUS_SUCCESS || status == STATUS_INVALID_PARAMETER, + "for info %u, got %08x (ret_len %u)\n", i, status, ret_len); + break; + + default: + ok(status == STATUS_SUCCESS || status == STATUS_UNSUCCESSFUL || status == STATUS_INVALID_PARAMETER, + "for info %u, got %08x (ret_len %u)\n", i, status, ret_len); + break; + } + } + + CloseHandle(hproc); +} + static void test_GetLogicalProcessorInformationEx(void) { SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *info; @@ -3825,6 +3910,7 @@ START_TEST(process) }
test_process_info(); + test_process_info_current(); test_TerminateProcess(); test_Startup(); test_CommandLine();
You can easily keep existing loop, two test functions for the same thing is not ideal.