ntdll/tests: Add tests for Wow64 TEB and PEB information.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d1e90e1537
commit
c2be6ecf0b
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue