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