Alexandre Julliard : ntdll: Add platform-specific helpers for getting/setting the Wow64 context.

Alexandre Julliard julliard at winehq.org
Tue May 18 15:42:37 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue May 18 11:58:40 2021 +0200

ntdll: Add platform-specific helpers for getting/setting the Wow64 context.

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

---

 dlls/ntdll/unix/signal_arm.c    | 18 ++++++++++++++++++
 dlls/ntdll/unix/signal_arm64.c  | 36 ++++++++++++++++++++++++++++++++++++
 dlls/ntdll/unix/signal_i386.c   | 18 ++++++++++++++++++
 dlls/ntdll/unix/signal_x86_64.c | 25 +++++++++++++++++++++++++
 dlls/ntdll/unix/thread.c        | 26 ++------------------------
 dlls/ntdll/unix/unix_private.h  |  2 ++
 6 files changed, 101 insertions(+), 24 deletions(-)

diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index f8c118c116d..c0cf53d503f 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -411,6 +411,24 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
 }
 
 
+/***********************************************************************
+ *              set_thread_wow64_context
+ */
+NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
+{
+    return STATUS_INVALID_INFO_CLASS;
+}
+
+
+/***********************************************************************
+ *              get_thread_wow64_context
+ */
+NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size )
+{
+    return STATUS_INVALID_INFO_CLASS;
+}
+
+
 /***********************************************************************
  *           setup_exception
  *
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index 28d7c1df8b3..a685b072431 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -481,6 +481,42 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
 }
 
 
+/***********************************************************************
+ *              set_thread_wow64_context
+ */
+NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
+{
+    BOOL self;
+    USHORT machine;
+
+    switch (size)
+    {
+    case sizeof(I386_CONTEXT): machine = IMAGE_FILE_MACHINE_I386; break;
+    case sizeof(ARM_CONTEXT): machine = IMAGE_FILE_MACHINE_ARMNT; break;
+    default: return STATUS_INFO_LENGTH_MISMATCH;
+    }
+    return set_thread_context( handle, ctx, &self, machine );
+}
+
+
+/***********************************************************************
+ *              get_thread_wow64_context
+ */
+NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size )
+{
+    BOOL self;
+    USHORT machine;
+
+    switch (size)
+    {
+    case sizeof(I386_CONTEXT): machine = IMAGE_FILE_MACHINE_I386; break;
+    case sizeof(ARM_CONTEXT): machine = IMAGE_FILE_MACHINE_ARMNT; break;
+    default: return STATUS_INFO_LENGTH_MISMATCH;
+    }
+    return get_thread_context( handle, ctx, &self, machine );
+}
+
+
 /* Note, unwind_builtin_dll above has hardcoded assumptions on how this
  * function stores things on the stack; if modified, modify that one in
  * sync as well. */
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index 3c7b07e0707..da635c0f516 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -1255,6 +1255,24 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
 }
 
 
+/***********************************************************************
+ *              set_thread_wow64_context
+ */
+NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
+{
+    return STATUS_INVALID_INFO_CLASS;
+}
+
+
+/***********************************************************************
+ *              get_thread_wow64_context
+ */
+NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size )
+{
+    return STATUS_INVALID_INFO_CLASS;
+}
+
+
 /***********************************************************************
  *           is_privileged_instr
  *
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index d79ddf7d250..b2cda5eef13 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1849,6 +1849,31 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
     return STATUS_SUCCESS;
 }
 
+
+/***********************************************************************
+ *              set_thread_wow64_context
+ */
+NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
+{
+    BOOL self;
+
+    if (size != sizeof(I386_CONTEXT)) return STATUS_INFO_LENGTH_MISMATCH;
+    return set_thread_context( handle, ctx, &self, IMAGE_FILE_MACHINE_I386 );
+}
+
+
+/***********************************************************************
+ *              get_thread_wow64_context
+ */
+NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size )
+{
+    BOOL self;
+
+    if (size != sizeof(I386_CONTEXT)) return STATUS_INFO_LENGTH_MISMATCH;
+    return get_thread_context( handle, ctx, &self, IMAGE_FILE_MACHINE_I386 );
+}
+
+
 extern void CDECL raise_func_trampoline( void *dispatcher );
 
 __ASM_GLOBAL_FUNC( raise_func_trampoline,
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index d8fd0767da8..624dff0e5f1 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -1665,19 +1665,7 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
     }
 
     case ThreadWow64Context:
-    {
-#ifdef _WIN64
-        BOOL self;
-        WOW64_CONTEXT *context = data;
-
-        if (length != sizeof(*context)) return STATUS_INFO_LENGTH_MISMATCH;
-        if ((status = get_thread_context( handle, context, &self, IMAGE_FILE_MACHINE_I386 ))) return status;
-        if (ret_len && !status) *ret_len = sizeof(*context);
-        return status;
-#else
-        return STATUS_INVALID_INFO_CLASS;
-#endif
-    }
+        return get_thread_wow64_context( handle, data, length );
 
     case ThreadHideFromDebugger:
         if (length != sizeof(BOOLEAN)) return STATUS_INFO_LENGTH_MISMATCH;
@@ -1860,17 +1848,7 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class,
     }
 
     case ThreadWow64Context:
-    {
-#ifdef _WIN64
-        BOOL self;
-        const WOW64_CONTEXT *context = data;
-
-        if (length != sizeof(*context)) return STATUS_INFO_LENGTH_MISMATCH;
-        return set_thread_context( handle, context, &self, IMAGE_FILE_MACHINE_I386 );
-#else
-        return STATUS_INVALID_INFO_CLASS;
-#endif
-    }
+        return set_thread_wow64_context( handle, data, length );
 
     case ThreadEnableAlignmentFaultFixup:
         if (length != sizeof(BOOLEAN)) return STATUS_INFO_LENGTH_MISMATCH;
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 41df2d431a3..bd00d4e9d42 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -236,6 +236,8 @@ extern void DECLSPEC_NORETURN signal_start_thread( PRTL_THREAD_START_ROUTINE ent
 extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int) ) DECLSPEC_HIDDEN;
 extern void __wine_syscall_dispatcher(void) DECLSPEC_HIDDEN;
 extern void signal_restore_full_cpu_context(void) DECLSPEC_HIDDEN;
+extern NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size ) DECLSPEC_HIDDEN;
+extern NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size ) DECLSPEC_HIDDEN;
 extern void fill_vm_counters( VM_COUNTERS_EX *pvmi, int unix_pid ) DECLSPEC_HIDDEN;
 extern NTSTATUS open_hkcu_key( const char *path, HANDLE *key ) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list