rendered paste bodyFrom 6a920793f7f2feefc49905c05d361b6893f6a269 Mon Sep 17 00:00:00 2001
From: Peter Oberndorfer <kumbayo84@arcor.de>
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