Alexandre Julliard : ntdll: Always use the TEB that was passed to signal_start_thread().

Alexandre Julliard julliard at winehq.org
Mon Jun 14 16:00:36 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 14 12:59:05 2021 +0200

ntdll: Always use the TEB that was passed to signal_start_thread().

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

---

 dlls/ntdll/unix/signal_i386.c   | 24 +++++++++++++-----------
 dlls/ntdll/unix/signal_x86_64.c | 22 +++++++++++-----------
 2 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index 4ce1b519da3..89f4fb4151c 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -2342,7 +2342,7 @@ void signal_init_process(void)
 /***********************************************************************
  *           init_thread_context
  */
-static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg )
+static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg, TEB *teb )
 {
     context->SegCs  = get_cs();
     context->SegDs  = get_ds();
@@ -2353,7 +2353,7 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry,
     context->EFlags = 0x202;
     context->Eax    = (DWORD)entry;
     context->Ebx    = (DWORD)arg;
-    context->Esp    = (DWORD)NtCurrentTeb()->Tib.StackBase - 16;
+    context->Esp    = (DWORD)teb->Tib.StackBase - 16;
     context->Eip    = (DWORD)pRtlUserThreadStart;
     context->FloatSave.ControlWord = 0x27f;
     ((XSAVE_FORMAT *)context->ExtendedRegisters)->ControlWord = 0x27f;
@@ -2369,7 +2369,7 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry,
 /***********************************************************************
  *           get_initial_context
  */
-PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend )
+PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB *teb )
 {
     CONTEXT *ctx;
 
@@ -2377,15 +2377,15 @@ PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void
     {
         CONTEXT context = { CONTEXT_ALL };
 
-        init_thread_context( &context, entry, arg );
+        init_thread_context( &context, entry, arg, teb );
         wait_suspend( &context );
         ctx = (CONTEXT *)((ULONG_PTR)context.Esp & ~15) - 1;
         *ctx = context;
     }
     else
     {
-        ctx = (CONTEXT *)((char *)NtCurrentTeb()->Tib.StackBase - 16) - 1;
-        init_thread_context( ctx, entry, arg );
+        ctx = (CONTEXT *)((char *)teb->Tib.StackBase - 16) - 1;
+        init_thread_context( ctx, entry, arg, teb );
     }
     pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL );
     ctx->ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS;
@@ -2409,17 +2409,19 @@ __ASM_GLOBAL_FUNC( signal_start_thread,
                    "pushl %edi\n\t"
                    __ASM_CFI(".cfi_rel_offset %edi,-12\n\t")
                    /* store exit frame */
-                   "movl %ebp,%fs:0x1f4\n\t"    /* x86_thread_data()->exit_frame */
+                   "movl 24(%ebp),%ecx\n\t"     /* teb */
+                   "movl %ebp,0x1f4(%ecx)\n\t"  /* x86_thread_data()->exit_frame */
                    /* set syscall frame */
-                   "cmpl $0,%fs:0x1f8\n\t"      /* x86_thread_data()->syscall_frame */
+                   "cmpl $0,0x1f8(%ecx)\n\t"    /* x86_thread_data()->syscall_frame */
                    "jnz 1f\n\t"
                    "leal -0x380(%esp),%eax\n\t" /* sizeof(struct syscall_frame) */
                    "andl $~63,%eax\n\t"
-                   "movl %eax,%fs:0x1f8\n"      /* x86_thread_data()->syscall_frame */
+                   "movl %eax,0x1f8(%ecx)\n"    /* x86_thread_data()->syscall_frame */
                    /* switch to thread stack */
-                   "1:\tmovl %fs:4,%eax\n\t"    /* NtCurrentTeb()->StackBase */
-                   "leal -0x1004(%eax),%esp\n\t"
+                   "1:\tmovl 4(%ecx),%eax\n\t"  /* teb->StackBase */
+                   "leal -0x1000(%eax),%esp\n\t"
                    /* attach dlls */
+                   "pushl %ecx\n\t"             /* teb */
                    "pushl 16(%ebp)\n\t"         /* suspend */
                    "pushl 12(%ebp)\n\t"         /* arg */
                    "pushl 8(%ebp)\n\t"          /* entry */
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 04442a012a2..10aa2a516b0 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -2603,13 +2603,13 @@ void signal_init_process(void)
 /***********************************************************************
  *           init_thread_context
  */
-static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg )
+static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry, void *arg, TEB *teb )
 {
     __asm__( "movw %%cs,%0" : "=m" (context->SegCs) );
     __asm__( "movw %%ss,%0" : "=m" (context->SegSs) );
     context->Rcx    = (ULONG_PTR)entry;
     context->Rdx    = (ULONG_PTR)arg;
-    context->Rsp    = (ULONG_PTR)NtCurrentTeb()->Tib.StackBase - 0x28;
+    context->Rsp    = (ULONG_PTR)teb->Tib.StackBase - 0x28;
     context->Rip    = (ULONG_PTR)pRtlUserThreadStart;
     context->EFlags = 0x200;
     context->u.FltSave.ControlWord = 0x27f;
@@ -2620,7 +2620,7 @@ static void init_thread_context( CONTEXT *context, LPTHREAD_START_ROUTINE entry,
 /***********************************************************************
  *           get_initial_context
  */
-PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend )
+PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB *teb )
 {
     CONTEXT *ctx;
 
@@ -2629,15 +2629,15 @@ PCONTEXT DECLSPEC_HIDDEN get_initial_context( LPTHREAD_START_ROUTINE entry, void
         CONTEXT context = { 0 };
 
         context.ContextFlags = CONTEXT_ALL;
-        init_thread_context( &context, entry, arg );
+        init_thread_context( &context, entry, arg, teb );
         wait_suspend( &context );
         ctx = (CONTEXT *)((ULONG_PTR)context.Rsp & ~15) - 1;
         *ctx = context;
     }
     else
     {
-        ctx = (CONTEXT *)((char *)NtCurrentTeb()->Tib.StackBase - 0x30) - 1;
-        init_thread_context( ctx, entry, arg );
+        ctx = (CONTEXT *)((char *)teb->Tib.StackBase - 0x30) - 1;
+        init_thread_context( ctx, entry, arg, teb );
     }
     pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL );
     ctx->ContextFlags = CONTEXT_FULL;
@@ -2666,17 +2666,17 @@ __ASM_GLOBAL_FUNC( signal_start_thread,
                    "movq %r15,8(%rsp)\n\t"
                    __ASM_CFI(".cfi_rel_offset %r15,8\n\t")
                    /* store exit frame */
-                   "movq %gs:0x30,%rax\n\t"
-                   "movq %rsp,0x320(%rax)\n\t"      /* amd64_thread_data()->exit_frame */
+                   "movq %rsp,0x320(%r8)\n\t"       /* amd64_thread_data()->exit_frame */
                    /* set syscall frame */
-                   "cmpq $0,0x328(%rax)\n\t"        /* amd64_thread_data()->syscall_frame */
+                   "cmpq $0,0x328(%r8)\n\t"         /* amd64_thread_data()->syscall_frame */
                    "jnz 1f\n\t"
                    "leaq -0x400(%rsp),%r10\n\t"     /* sizeof(struct syscall_frame) */
                    "andq $~63,%r10\n\t"
-                   "movq %r10,0x328(%rax)\n"        /* amd64_thread_data()->syscall_frame */
+                   "movq %r10,0x328(%r8)\n"         /* amd64_thread_data()->syscall_frame */
                    /* switch to thread stack */
-                   "1:\tmovq 8(%rax),%rax\n\t"      /* NtCurrentTeb()->Tib.StackBase */
+                   "1:\tmovq 8(%r8),%rax\n\t"       /* teb->Tib.StackBase */
                    "movq %rcx,%rbx\n\t"             /* thunk */
+                   "movq %r8,%rcx\n\t"              /* teb */
                    "leaq -0x1000(%rax),%rsp\n\t"
                    /* attach dlls */
                    "call " __ASM_NAME("get_initial_context") "\n\t"




More information about the wine-cvs mailing list