From 6a920793f7f2feefc49905c05d361b6893f6a269 Mon Sep 17 00:00:00 2001 From: Peter Oberndorfer Date: Fri, 13 Oct 2006 19:31:34 +0200 Subject: [PATCH] Add test for NtQueryInformationThread ThreadDescriptorTableEntry --- dlls/ntdll/tests/info.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 67 insertions(+), 0 deletions(-) diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 30e1500..b36cfa7 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -22,6 +22,7 @@ #include "ntdll_test.h" static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG); static NTSTATUS (WINAPI * pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); +static NTSTATUS (WINAPI * pNtQueryInformationThread)(HANDLE,THREADINFOCLASS,PVOID,ULONG,PULONG); static NTSTATUS (WINAPI * pNtReadVirtualMemory)(HANDLE, const void*, void*, SIZE_T, SIZE_T*); static HMODULE hntdll = 0; @@ -50,6 +51,7 @@ static BOOL InitFunctionPtrs(void) { NTDLL_GET_PROC(NtQuerySystemInformation) NTDLL_GET_PROC(NtQueryInformationProcess) + NTDLL_GET_PROC(NtQueryInformationThread) NTDLL_GET_PROC(NtReadVirtualMemory) } return TRUE; @@ -757,6 +759,65 @@ static void test_query_process_handlecou } } +typedef struct _THREAD_DESCRIPTOR_INFORMATION_PRIVATE +{ + DWORD Selector; + LDT_ENTRY Entry; +} THREAD_DESCRIPTOR_INFORMATION_PRIVATE, *PTHREAD_DESCRIPTOR_INFORMATION_PRIVATE; + +static void test_query_thread_descriptor_table(void) +{ + DWORD status; + ULONG ReturnLength; + THREAD_DESCRIPTOR_INFORMATION_PRIVATE tdi; + LDT_ENTRY nullentry; + CONTEXT ctx; + + tdi.Selector = 0x0; /* GDT NULL selector??? */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a GDT selector 0x0 got 0x%08lx\n", status); + memset(&nullentry, 0, sizeof(nullentry)); + ok(memcmp(&tdi.Entry, &nullentry, sizeof(nullentry)) == 0, "null selector expected to be empty\n"); + + todo_wine{ + tdi.Selector = 0x4; /* invalid LDT */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_NO_LDT, "expected STATUS_NO_LDT for a invalid LDT selector 0x4 got 0x%08lx\n", status); + + tdi.Selector = 0x50; /* invalid GDT */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION for a invalid GDT selector 0x50 got 0x%08lx\n", status); + } + + ctx.ContextFlags = CONTEXT_SEGMENTS | CONTEXT_CONTROL; + ok(GetThreadContext(GetCurrentThread(), &ctx)!= 0, "GetThreadContext on own thread failed\n"); + + todo_wine{ + tdi.Selector = ctx.SegFs; /* fs: */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a FS: selector got 0x%08lx\n", status); + + tdi.Selector = ctx.SegGs; /* gs: */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a GS: selector got 0x%08lx\n", status); + } + + tdi.Selector = ctx.SegDs; /* ds: */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a DS: selector got 0x%08lx\n", status); + + tdi.Selector = ctx.SegEs; /* es: */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a ES: selector got 0x%08lx\n", status); + + tdi.Selector = ctx.SegCs; /* cs: */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a CS: selector got 0x%08lx\n", status); + + tdi.Selector = ctx.SegSs; /* ss: */ + status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for a SS: selector got 0x%08lx\n", status); +} static void test_readvirtualmemory(void) { @@ -889,6 +950,12 @@ START_TEST(info) trace("Starting test_query_process_handlecount()\n"); test_query_process_handlecount(); + /* NtQueryInformationThread */ + + /* 0x6 ThreadDescriptorTableEntry */ + trace("Starting test_query_thread_descriptor_table()\n"); + test_query_thread_descriptor_table(); + /* belongs into it's own file */ trace("Starting test_readvirtualmemory()\n"); test_readvirtualmemory(); -- 1.4.2