Jacek Caban : wow64: Directly use CPU area in Wow64KiUserCallbackDispatcher for I386_CONTEXT.

Alexandre Julliard julliard at winehq.org
Thu Aug 11 15:26:18 CDT 2022


Module: wine
Branch: master
Commit: de5f640abf800cbb4674ab0c55f30fc9acb9085a
URL:    https://gitlab.winehq.org/wine/wine/-/commit/de5f640abf800cbb4674ab0c55f30fc9acb9085a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Aug 11 14:19:24 2022 +0200

wow64: Directly use CPU area in Wow64KiUserCallbackDispatcher for I386_CONTEXT.

NtSetInformationThread for i386 causes WOW64_CPURESERVED_FLAG_RESET_STATE to be set, which makes subsequent syscall to restore the state instead of returning its result.

---

 dlls/wow64/syscall.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c
index bc6d46258ed..73fb84c6d2e 100644
--- a/dlls/wow64/syscall.c
+++ b/dlls/wow64/syscall.c
@@ -865,13 +865,14 @@ NTSTATUS WINAPI Wow64KiUserCallbackDispatcher( ULONG id, void *args, ULONG len,
     {
     case IMAGE_FILE_MACHINE_I386:
         {
-            I386_CONTEXT orig_ctx, ctx = { CONTEXT_I386_FULL };
+            I386_CONTEXT orig_ctx, *ctx;
             void *args_data;
             ULONG *stack;
 
-            NtQueryInformationThread( GetCurrentThread(), ThreadWow64Context, &ctx, sizeof(ctx), NULL );
+            RtlWow64GetCurrentCpuArea( NULL, (void **)&ctx, NULL );
+            orig_ctx = *ctx;
 
-            stack = args_data = ULongToPtr( (ctx.Esp - len) & ~15 );
+            stack = args_data = ULongToPtr( (ctx->Esp - len) & ~15 );
             memcpy( args_data, args, len );
             *(--stack) = 0;
             *(--stack) = len;
@@ -879,16 +880,13 @@ NTSTATUS WINAPI Wow64KiUserCallbackDispatcher( ULONG id, void *args, ULONG len,
             *(--stack) = id;
             *(--stack) = 0xdeadbabe;
 
-            orig_ctx = ctx;
-            ctx.Esp = PtrToUlong( stack );
-            ctx.Eip = pLdrSystemDllInitBlock->pKiUserCallbackDispatcher;
-            NtSetInformationThread( GetCurrentThread(), ThreadWow64Context, &ctx, sizeof(ctx) );
+            ctx->Esp = PtrToUlong( stack );
+            ctx->Eip = pLdrSystemDllInitBlock->pKiUserCallbackDispatcher;
 
             if (!__wine_setjmpex( &frame.jmpbuf, NULL ))
                 cpu_simulate();
             else
-                NtSetInformationThread( GetCurrentThread(), ThreadWow64Context,
-                                        &orig_ctx, sizeof(orig_ctx) );
+                *ctx = orig_ctx;
         }
         break;
 




More information about the wine-cvs mailing list