mirror of
https://github.com/reactos/reactos.git
synced 2024-12-12 04:43:48 +08:00
[NTDLL_APITEST] Add initial NtQueryInformationThread() testcase (#2782)
This commit is contained in:
parent
aa6e11b549
commit
5ce40ea841
@ -26,6 +26,7 @@ list(APPEND SOURCE
|
||||
NtProtectVirtualMemory.c
|
||||
NtQueryInformationFile.c
|
||||
NtQueryInformationProcess.c
|
||||
NtQueryInformationThread.c
|
||||
NtQueryKey.c
|
||||
NtQuerySystemEnvironmentValue.c
|
||||
NtQuerySystemInformation.c
|
||||
|
106
modules/rostests/apitests/ntdll/NtQueryInformationThread.c
Normal file
106
modules/rostests/apitests/ntdll/NtQueryInformationThread.c
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* PROJECT: ReactOS API tests
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Tests for the NtQueryInformationThread API
|
||||
* COPYRIGHT: Copyright 2020 George Bișoc <george.bisoc@reactos.org>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
static
|
||||
void
|
||||
Test_ThreadBasicInformationClass(void)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
PTHREAD_BASIC_INFORMATION ThreadInfoBasic;
|
||||
ULONG ReturnedLength;
|
||||
|
||||
ThreadInfoBasic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THREAD_BASIC_INFORMATION));
|
||||
if (!ThreadInfoBasic)
|
||||
{
|
||||
skip("Failed to allocate memory for THREAD_BASIC_INFORMATION!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Everything is NULL */
|
||||
Status = NtQueryInformationThread(NULL,
|
||||
ThreadBasicInformation,
|
||||
NULL,
|
||||
0,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Don't give a valid thread handle */
|
||||
Status = NtQueryInformationThread(NULL,
|
||||
ThreadBasicInformation,
|
||||
ThreadInfoBasic,
|
||||
sizeof(THREAD_BASIC_INFORMATION),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INVALID_HANDLE);
|
||||
|
||||
/* The information length is incorrect */
|
||||
Status = NtQueryInformationThread(GetCurrentThread(),
|
||||
ThreadBasicInformation,
|
||||
ThreadInfoBasic,
|
||||
0,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* Don't query anything from the function */
|
||||
Status = NtQueryInformationThread(GetCurrentThread(),
|
||||
ThreadBasicInformation,
|
||||
NULL,
|
||||
sizeof(THREAD_BASIC_INFORMATION),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_ACCESS_VIOLATION);
|
||||
|
||||
/* The buffer is misaligned and length information is wrong */
|
||||
Status = NtQueryInformationThread(GetCurrentThread(),
|
||||
ThreadBasicInformation,
|
||||
(PVOID)1,
|
||||
0,
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
|
||||
|
||||
/* The buffer is misaligned */
|
||||
Status = NtQueryInformationThread(GetCurrentThread(),
|
||||
ThreadBasicInformation,
|
||||
(PVOID)1,
|
||||
sizeof(THREAD_BASIC_INFORMATION),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_DATATYPE_MISALIGNMENT);
|
||||
|
||||
/* The buffer is misaligned, try with an alignment size of 2 */
|
||||
Status = NtQueryInformationThread(GetCurrentThread(),
|
||||
ThreadBasicInformation,
|
||||
(PVOID)2,
|
||||
sizeof(THREAD_BASIC_INFORMATION),
|
||||
NULL);
|
||||
ok_hex(Status, STATUS_DATATYPE_MISALIGNMENT);
|
||||
|
||||
/* Query the basic information we need from the thread */
|
||||
Status = NtQueryInformationThread(GetCurrentThread(),
|
||||
ThreadBasicInformation,
|
||||
ThreadInfoBasic,
|
||||
sizeof(THREAD_BASIC_INFORMATION),
|
||||
&ReturnedLength);
|
||||
ok_hex(Status, STATUS_SUCCESS);
|
||||
ok(ReturnedLength != 0, "The size of the buffer pointed by ThreadInformation shouldn't be 0!\n");
|
||||
|
||||
/* Output the thread basic information details */
|
||||
trace("ReturnedLength = %lu\n", ReturnedLength);
|
||||
trace("ThreadInfoBasic->ExitStatus = 0x%08lx\n", ThreadInfoBasic->ExitStatus);
|
||||
trace("ThreadInfoBasic->TebBaseAddress = %p\n", ThreadInfoBasic->TebBaseAddress);
|
||||
trace("ThreadInfoBasic->ClientId.UniqueProcess = %p\n", ThreadInfoBasic->ClientId.UniqueProcess);
|
||||
trace("ThreadInfoBasic->ClientId.UniqueThread = %p\n", ThreadInfoBasic->ClientId.UniqueThread);
|
||||
trace("ThreadInfoBasic->AffinityMask = %lu\n", ThreadInfoBasic->AffinityMask);
|
||||
trace("ThreadInfoBasic->Priority = %li\n", ThreadInfoBasic->Priority);
|
||||
trace("ThreadInfoBasic->BasePriority = %li\n", ThreadInfoBasic->BasePriority);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, ThreadInfoBasic);
|
||||
}
|
||||
|
||||
START_TEST(NtQueryInformationThread)
|
||||
{
|
||||
Test_ThreadBasicInformationClass();
|
||||
}
|
@ -24,6 +24,7 @@ extern void func_NtOpenThreadToken(void);
|
||||
extern void func_NtProtectVirtualMemory(void);
|
||||
extern void func_NtQueryInformationFile(void);
|
||||
extern void func_NtQueryInformationProcess(void);
|
||||
extern void func_NtQueryInformationThread(void);
|
||||
extern void func_NtQueryKey(void);
|
||||
extern void func_NtQuerySystemEnvironmentValue(void);
|
||||
extern void func_NtQuerySystemInformation(void);
|
||||
@ -96,6 +97,7 @@ const struct test winetest_testlist[] =
|
||||
{ "NtProtectVirtualMemory", func_NtProtectVirtualMemory },
|
||||
{ "NtQueryInformationFile", func_NtQueryInformationFile },
|
||||
{ "NtQueryInformationProcess", func_NtQueryInformationProcess },
|
||||
{ "NtQueryInformationThread", func_NtQueryInformationThread },
|
||||
{ "NtQueryKey", func_NtQueryKey },
|
||||
{ "NtQuerySystemEnvironmentValue", func_NtQuerySystemEnvironmentValue },
|
||||
{ "NtQuerySystemInformation", func_NtQuerySystemInformation },
|
||||
|
Loading…
Reference in New Issue
Block a user