ntdll: Add test for NtQueryInformationThread
ThreadDescriptorTableEntry
Peter Oberndorfer
kumbayo84 at arcor.de
Sun Oct 15 12:27:21 CDT 2006
tested on XP,2K,NT4
Changelog:
Add test for NtQueryInformationThread ThreadDescriptorTableEntry
-------------- next part --------------
From a07c7dff8b547bf605c64aeeabb2203618215430 Mon Sep 17 00:00:00 2001
From: Peter Oberndorfer <kumbayo84 at arcor.de>
Date: Sun, 15 Oct 2006 19:24:20 +0200
Subject: [PATCH] ntdll: 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 8d288d7..77b4c21 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%08x\n", status);
+ memset(&nullentry, 0, sizeof(nullentry));
+ ok(memcmp(&tdi.Entry, &nullentry, sizeof(nullentry)) == 0, "expected null selector 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 invalid LDT selector 0x4, got 0x%08x\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 invalid GDT selector 0x50, got 0x%08x\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 fs selector, got 0x%08x\n", status);
+
+ tdi.Selector = ctx.SegGs; /* gs: */
+ status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for gs selector, got 0x%08x\n", status);
+ }
+
+ tdi.Selector = ctx.SegDs; /* ds: */
+ status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for ds selector, got 0x%08x\n", status);
+
+ tdi.Selector = ctx.SegEs; /* es: */
+ status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for es selector, got 0x%08x\n", status);
+
+ tdi.Selector = ctx.SegCs; /* cs: */
+ status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for cs selector, got 0x%08x\n", status);
+
+ tdi.Selector = ctx.SegSs; /* ss: */
+ status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescriptorTableEntry, &tdi, sizeof(tdi), &ReturnLength);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS for ss selector, got 0x%08x\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
More information about the wine-patches
mailing list