Alexandre Julliard : ntdll: Initialize the RealClientId field in the TEB.

Alexandre Julliard julliard at winehq.org
Fri Jun 25 16:29:07 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jun 25 15:21:27 2021 +0200

ntdll: Initialize the RealClientId field in the TEB.

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

---

 dlls/kernel32/tests/process.c | 33 +++++++++++++++++++++++++++++++++
 dlls/ntdll/unix/thread.c      |  2 ++
 2 files changed, 35 insertions(+)

diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index 10786c52e9e..1ef4a20daea 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -80,6 +80,7 @@ static BOOL   (WINAPI *pSetInformationJobObject)(HANDLE job, JOBOBJECTINFOCLASS
 static HANDLE (WINAPI *pCreateIoCompletionPort)(HANDLE file, HANDLE existing_port, ULONG_PTR key, DWORD threads);
 static BOOL   (WINAPI *pGetNumaProcessorNode)(UCHAR, PUCHAR);
 static NTSTATUS (WINAPI *pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
+static NTSTATUS (WINAPI *pNtQueryInformationThread)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
 static NTSTATUS (WINAPI *pNtQuerySystemInformationEx)(SYSTEM_INFORMATION_CLASS, void*, ULONG, void*, ULONG, ULONG*);
 static DWORD  (WINAPI *pWTSGetActiveConsoleSessionId)(void);
 static HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD, DWORD);
@@ -248,6 +249,7 @@ static BOOL init(void)
     hntdll    = GetModuleHandleA("ntdll.dll");
 
     pNtQueryInformationProcess = (void *)GetProcAddress(hntdll, "NtQueryInformationProcess");
+    pNtQueryInformationThread = (void *)GetProcAddress(hntdll, "NtQueryInformationThread");
     pNtQuerySystemInformationEx = (void *)GetProcAddress(hntdll, "NtQuerySystemInformationEx");
 
     pGetNativeSystemInfo = (void *) GetProcAddress(hkernel32, "GetNativeSystemInfo");
@@ -3517,6 +3519,37 @@ static void test_SuspendProcessState(void)
     ok( child_peb.OSPlatformId == VER_PLATFORM_WIN32_NT, "OSPlatformId not set %u\n", child_peb.OSPlatformId );
     ok( child_peb.SessionId == 1, "SessionId not set %u\n", child_peb.SessionId );
 
+    if (pNtQueryInformationThread)
+    {
+        TEB child_teb;
+        THREAD_BASIC_INFORMATION info;
+        NTSTATUS status = pNtQueryInformationThread( pi.hThread, ThreadBasicInformation,
+                                                     &info, sizeof(info), NULL );
+        ok( !status, "NtQueryInformationProcess failed %x\n", status );
+        ret = ReadProcessMemory( pi.hProcess, info.TebBaseAddress, &child_teb, sizeof(child_teb), NULL );
+        ok( ret, "Failed to read TEB (%u)\n", GetLastError() );
+
+        ok( child_teb.Peb == peb_ptr, "wrong Peb %p / %p\n", child_teb.Peb, peb_ptr );
+        ok( PtrToUlong(child_teb.ClientId.UniqueProcess) == pi.dwProcessId, "wrong pid %x / %x\n",
+            PtrToUlong(child_teb.ClientId.UniqueProcess), pi.dwProcessId );
+        ok( PtrToUlong(child_teb.ClientId.UniqueThread) == pi.dwThreadId, "wrong tid %x / %x\n",
+            PtrToUlong(child_teb.ClientId.UniqueThread), pi.dwThreadId );
+        ok( PtrToUlong(child_teb.RealClientId.UniqueProcess) == pi.dwProcessId, "wrong real pid %x / %x\n",
+            PtrToUlong(child_teb.RealClientId.UniqueProcess), pi.dwProcessId );
+        ok( PtrToUlong(child_teb.RealClientId.UniqueThread) == pi.dwThreadId, "wrong real tid %x / %x\n",
+            PtrToUlong(child_teb.RealClientId.UniqueThread), pi.dwThreadId );
+        ok( child_teb.StaticUnicodeString.MaximumLength == sizeof(child_teb.StaticUnicodeBuffer),
+            "StaticUnicodeString.MaximumLength wrong %x\n", child_teb.StaticUnicodeString.MaximumLength );
+        ok( (char *)child_teb.StaticUnicodeString.Buffer == (char *)info.TebBaseAddress + offsetof(TEB, StaticUnicodeBuffer),
+            "StaticUnicodeString.Buffer wrong %p\n", child_teb.StaticUnicodeString.Buffer );
+
+        ok( !child_teb.CurrentLocale, "CurrentLocale set %x\n", child_teb.CurrentLocale );
+        ok( !child_teb.TlsLinks.Flink, "TlsLinks.Flink set %p\n", child_teb.TlsLinks.Flink );
+        ok( !child_teb.TlsLinks.Blink, "TlsLinks.Blink set %p\n", child_teb.TlsLinks.Blink );
+        ok( !child_teb.TlsExpansionSlots, "TlsExpansionSlots set %p\n", child_teb.TlsExpansionSlots );
+        ok( !child_teb.FlsSlots, "FlsSlots set %p\n", child_teb.FlsSlots );
+    }
+
     ret = SetThreadContext(pi.hThread, &ctx);
     ok(ret, "Failed to set remote thread context (%d)\n", GetLastError());
 
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index 628cc19418f..0b3880c96ca 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -761,10 +761,12 @@ void set_thread_id( TEB *teb, DWORD pid, DWORD tid )
 
     teb->ClientId.UniqueProcess = ULongToHandle( pid );
     teb->ClientId.UniqueThread  = ULongToHandle( tid );
+    teb->RealClientId = teb->ClientId;
     if (wow_teb)
     {
         wow_teb->ClientId.UniqueProcess = pid;
         wow_teb->ClientId.UniqueThread  = tid;
+        wow_teb->RealClientId = wow_teb->ClientId;
     }
 }
 




More information about the wine-cvs mailing list