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