mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 05:15:41 +00:00
Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers into modules, and delete rossubsys.
This commit is contained in:
parent
b94e2d8ca0
commit
c2c66aff7d
24198 changed files with 0 additions and 37285 deletions
197
modules/rostests/apitests/ntdll/NtQueryInformationProcess.c
Normal file
197
modules/rostests/apitests/ntdll/NtQueryInformationProcess.c
Normal file
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* PROJECT: ReactOS API tests
|
||||
* LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
|
||||
* PURPOSE: Tests for the NtQueryInformationProcess API
|
||||
* PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
|
||||
*/
|
||||
|
||||
#include <apitest.h>
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#include <ndk/rtlfuncs.h>
|
||||
#include <ndk/kefuncs.h>
|
||||
#include <ndk/psfuncs.h>
|
||||
|
||||
static LARGE_INTEGER TestStartTime;
|
||||
|
||||
static
|
||||
void
|
||||
Test_ProcessTimes(void)
|
||||
{
|
||||
#define SPIN_TIME 1000000
|
||||
NTSTATUS Status;
|
||||
KERNEL_USER_TIMES Times1;
|
||||
KERNEL_USER_TIMES Times2;
|
||||
ULONG Length;
|
||||
LARGE_INTEGER Time1, Time2;
|
||||
|
||||
/* Everything is NULL */
|
||||
Status = NtQueryInformationProcess(NULL,
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
0,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Right size, invalid process */
|
||||
Status = NtQueryInformationProcess(NULL,
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INVALID_HANDLE);
|
||||
|
||||
/* Valid process, no buffer */
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
0,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Unaligned buffer, wrong size */
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
(PVOID)2,
|
||||
0,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Unaligned buffer, correct size */
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
(PVOID)2,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_DATATYPE_MISALIGNMENT);
|
||||
|
||||
/* Buffer too small */
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
sizeof(KERNEL_USER_TIMES) - 1,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Right buffer size but NULL pointer */
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_ACCESS_VIOLATION);
|
||||
|
||||
/* Buffer too large */
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
sizeof(KERNEL_USER_TIMES) + 1,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Buffer too small, ask for length */
|
||||
Length = 0x55555555;
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
NULL,
|
||||
sizeof(KERNEL_USER_TIMES) - 1,
|
||||
&Length);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
ok_dec(Length, 0x55555555);
|
||||
|
||||
Status = NtQuerySystemTime(&Time1);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
|
||||
/* Do some busy waiting to increase UserTime */
|
||||
do
|
||||
{
|
||||
Status = NtQuerySystemTime(&Time2);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ok(0, "NtQuerySystemTime failed with %lx\n", Status);
|
||||
break;
|
||||
}
|
||||
} while (Time2.QuadPart - Time1.QuadPart < SPIN_TIME);
|
||||
|
||||
/* Valid parameters, no return length */
|
||||
Status = NtQuerySystemTime(&Time1);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
|
||||
RtlFillMemory(&Times1, sizeof(Times1), 0x55);
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
&Times1,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
ok(Times1.CreateTime.QuadPart < TestStartTime.QuadPart,
|
||||
"CreateTime is %I64u, expected < %I64u\n", Times1.CreateTime.QuadPart, TestStartTime.QuadPart);
|
||||
ok(Times1.CreateTime.QuadPart > TestStartTime.QuadPart - 100000000LL,
|
||||
"CreateTime is %I64u, expected > %I64u\n", Times1.CreateTime.QuadPart, TestStartTime.QuadPart - 100000000LL);
|
||||
ok(Times1.ExitTime.QuadPart == 0,
|
||||
"ExitTime is %I64u, expected 0\n", Times1.ExitTime.QuadPart);
|
||||
ok(Times1.KernelTime.QuadPart != 0, "KernelTime is 0\n");
|
||||
ok(Times1.UserTime.QuadPart != 0, "UserTime is 0\n");
|
||||
|
||||
/* Do some busy waiting to increase UserTime */
|
||||
do
|
||||
{
|
||||
Status = NtQuerySystemTime(&Time2);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ok(0, "NtQuerySystemTime failed with %lx\n", Status);
|
||||
break;
|
||||
}
|
||||
} while (Time2.QuadPart - Time1.QuadPart < SPIN_TIME);
|
||||
|
||||
/* Again, this time with a return length */
|
||||
Length = 0x55555555;
|
||||
RtlFillMemory(&Times2, sizeof(Times2), 0x55);
|
||||
Status = NtQueryInformationProcess(NtCurrentProcess(),
|
||||
ProcessTimes,
|
||||
&Times2,
|
||||
sizeof(KERNEL_USER_TIMES),
|
||||
&Length);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
ok_dec(Length, sizeof(KERNEL_USER_TIMES));
|
||||
ok(Times1.CreateTime.QuadPart == Times2.CreateTime.QuadPart,
|
||||
"CreateTimes not equal: %I64u != %I64u\n", Times1.CreateTime.QuadPart, Times2.CreateTime.QuadPart);
|
||||
ok(Times2.ExitTime.QuadPart == 0,
|
||||
"ExitTime is %I64u, expected 0\n", Times2.ExitTime.QuadPart);
|
||||
ok(Times2.KernelTime.QuadPart != 0, "KernelTime is 0\n");
|
||||
ok(Times2.UserTime.QuadPart != 0, "UserTime is 0\n");
|
||||
|
||||
/* Compare the two sets of KernelTime/UserTime values */
|
||||
Status = NtQuerySystemTime(&Time2);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
/* Time values must have increased */
|
||||
ok(Times2.KernelTime.QuadPart > Times1.KernelTime.QuadPart,
|
||||
"KernelTime values inconsistent. Expected %I64u > %I64u\n", Times2.KernelTime.QuadPart, Times1.KernelTime.QuadPart);
|
||||
ok(Times2.UserTime.QuadPart > Times1.UserTime.QuadPart,
|
||||
"UserTime values inconsistent. Expected %I64u > %I64u\n", Times2.UserTime.QuadPart, Times1.UserTime.QuadPart);
|
||||
/* They can't have increased by more than wall clock time difference (we only have one thread) */
|
||||
ok(Times2.KernelTime.QuadPart - Times1.KernelTime.QuadPart < Time2.QuadPart - Time1.QuadPart,
|
||||
"KernelTime values inconsistent. Expected %I64u - %I64u < %I64u\n",
|
||||
Times2.KernelTime.QuadPart, Times1.KernelTime.QuadPart, Time2.QuadPart - Time1.QuadPart);
|
||||
ok(Times2.UserTime.QuadPart - Times1.UserTime.QuadPart < Time2.QuadPart - Time1.QuadPart,
|
||||
"UserTime values inconsistent. Expected %I64u - %I64u < %I64u\n",
|
||||
Times2.UserTime.QuadPart, Times1.UserTime.QuadPart, Time2.QuadPart - Time1.QuadPart);
|
||||
|
||||
trace("KernelTime1 = %I64u\n", Times1.KernelTime.QuadPart);
|
||||
trace("KernelTime2 = %I64u\n", Times2.KernelTime.QuadPart);
|
||||
trace("UserTime1 = %I64u\n", Times1.UserTime.QuadPart);
|
||||
trace("UserTime2 = %I64u\n", Times2.UserTime.QuadPart);
|
||||
|
||||
/* TODO: Test ExitTime on a terminated process */
|
||||
#undef SPIN_TIME
|
||||
}
|
||||
|
||||
START_TEST(NtQueryInformationProcess)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = NtQuerySystemTime(&TestStartTime);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
|
||||
Test_ProcessTimes();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue