Module: wine Branch: master Commit: e8a1341f5c1cc1c0116f1aaef3b49baeb33a83f7 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e8a1341f5c1cc1c0116f1aaef...
Author: Alexandre Julliard julliard@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@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;