Alexandre Julliard : ntdll/tests: Add tests for Wow64 TEB and PEB information.

Alexandre Julliard julliard at winehq.org
Thu May 13 15:31:00 CDT 2021


Module: wine
Branch: master
Commit: c2be6ecf0b206d443f5ca2e40cfaaf7f1faca3ff
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c2be6ecf0b206d443f5ca2e40cfaaf7f1faca3ff

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 13 12:50:54 2021 +0200

ntdll/tests: Add tests for Wow64 TEB and PEB information.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/info.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 90 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index cc159f8cca2..ef565873c97 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -3125,6 +3125,95 @@ static void test_thread_info(void)
 
 static void test_wow64(void)
 {
+    PROCESS_BASIC_INFORMATION proc_info;
+    THREAD_BASIC_INFORMATION info;
+    PROCESS_INFORMATION pi;
+    STARTUPINFOA si = {0};
+    NTSTATUS status;
+    void *redir;
+    SIZE_T res;
+    TEB teb;
+
+    Wow64DisableWow64FsRedirection( &redir );
+
+    if (CreateProcessA( "C:\\windows\\syswow64\\notepad.exe", NULL, NULL, NULL,
+                        FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi ))
+    {
+        memset( &info, 0xcc, sizeof(info) );
+        status = pNtQueryInformationThread( pi.hThread, ThreadBasicInformation, &info, sizeof(info), NULL );
+        ok( !status, "ThreadBasicInformation failed %x\n", status );
+        if (!ReadProcessMemory( pi.hProcess, info.TebBaseAddress, &teb, sizeof(teb), &res )) res = 0;
+        ok( res == sizeof(teb), "wrong len %lx\n", res );
+        todo_wine_if( sizeof(void *) > sizeof(int) )
+        ok( teb.Tib.Self == info.TebBaseAddress, "wrong teb %p / %p\n", teb.Tib.Self, info.TebBaseAddress );
+        if (is_wow64)
+        {
+            ok( !!teb.GdiBatchCount, "GdiBatchCount not set\n" );
+            ok( (char *)info.TebBaseAddress + teb.WowTebOffset == ULongToPtr(teb.GdiBatchCount) ||
+                broken(!NtCurrentTeb()->WowTebOffset),  /* pre-win10 */
+                "wrong teb offset %d\n", teb.WowTebOffset );
+        }
+        else
+        {
+            ok( !teb.GdiBatchCount, "GdiBatchCount set\n" );
+            todo_wine
+            ok( teb.WowTebOffset == 0x2000 ||
+                broken( !teb.WowTebOffset || teb.WowTebOffset == 1 ),  /* pre-win10 */
+                "wrong teb offset %d\n", teb.WowTebOffset );
+            todo_wine
+            ok( (char *)teb.Tib.ExceptionList == (char *)info.TebBaseAddress + 0x2000,
+                "wrong Tib.ExceptionList %p / %p\n",
+                (char *)teb.Tib.ExceptionList, (char *)info.TebBaseAddress + 0x2000 );
+        }
+
+        status = pNtQueryInformationProcess( pi.hProcess, ProcessBasicInformation,
+                                             &proc_info, sizeof(proc_info), NULL );
+        ok( !status, "ProcessBasicInformation failed %x\n", status );
+        todo_wine_if( sizeof(void *) > sizeof(int) )
+        ok( proc_info.PebBaseAddress == teb.Peb, "wrong peb %p / %p\n", proc_info.PebBaseAddress, teb.Peb );
+
+        TerminateProcess( pi.hProcess, 0 );
+        CloseHandle( pi.hProcess );
+        CloseHandle( pi.hThread );
+    }
+
+    if (CreateProcessA( "C:\\windows\\system32\\notepad.exe", NULL, NULL, NULL,
+                        FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi ))
+    {
+        memset( &info, 0xcc, sizeof(info) );
+        status = pNtQueryInformationThread( pi.hThread, ThreadBasicInformation, &info, sizeof(info), NULL );
+        ok( !status, "ThreadBasicInformation failed %x\n", status );
+        if (!is_wow64)
+        {
+            if (!ReadProcessMemory( pi.hProcess, info.TebBaseAddress, &teb, sizeof(teb), &res )) res = 0;
+            ok( res == sizeof(teb), "wrong len %lx\n", res );
+            ok( teb.Tib.Self == info.TebBaseAddress, "wrong teb %p / %p\n",
+                teb.Tib.Self, info.TebBaseAddress );
+            ok( !teb.GdiBatchCount, "GdiBatchCount set\n" );
+            ok( !teb.WowTebOffset || broken( teb.WowTebOffset == 1 ),  /* vista */
+                "wrong teb offset %d\n", teb.WowTebOffset );
+        }
+        else todo_wine ok( !info.TebBaseAddress, "got teb %p\n", info.TebBaseAddress );
+
+        status = pNtQueryInformationProcess( pi.hProcess, ProcessBasicInformation,
+                                             &proc_info, sizeof(proc_info), NULL );
+        ok( !status, "ProcessBasicInformation failed %x\n", status );
+        if (is_wow64)
+            todo_wine
+            ok( !proc_info.PebBaseAddress ||
+                broken( (char *)proc_info.PebBaseAddress >= (char *)0x7f000000 ), /* vista */
+                "wrong peb %p\n", proc_info.PebBaseAddress );
+        else
+            ok( proc_info.PebBaseAddress == teb.Peb, "wrong peb %p / %p\n",
+                proc_info.PebBaseAddress, teb.Peb );
+
+        TerminateProcess( pi.hProcess, 0 );
+        CloseHandle( pi.hProcess );
+        CloseHandle( pi.hThread );
+    }
+
+    Wow64RevertWow64FsRedirection( redir );
+
 #ifdef _WIN64
     if (pRtlWow64GetCpuAreaInfo)
     {
@@ -3326,8 +3415,7 @@ START_TEST(info)
     char **argv;
     int argc;
 
-    if(!InitFunctionPtrs())
-        return;
+    InitFunctionPtrs();
 
     argc = winetest_get_mainargs(&argv);
     if (argc >= 3) return; /* Child */




More information about the wine-cvs mailing list