All pastes #201207 Raw Edit

kumbayo

public text v1 · immutable
#201207 ·published 2006-10-13 17:58 UTC
rendered paste body
From 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