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