Alexandre Julliard : wow64: Patch the Wow64Transition pointer in all loaded modules.
Alexandre Julliard
julliard at winehq.org
Tue Aug 31 15:40:22 CDT 2021
Module: wine
Branch: master
Commit: 40673153b4c8e6f6e5637c640a68764619237a28
URL: https://source.winehq.org/git/wine.git/?a=commit;h=40673153b4c8e6f6e5637c640a68764619237a28
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Aug 31 11:31:41 2021 +0200
wow64: Patch the Wow64Transition pointer in all loaded modules.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wow64/syscall.c | 23 ++++++++++++++++-------
dlls/wow64/virtual.c | 6 ++++++
dlls/wow64/wow64_private.h | 1 +
3 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c
index feda6bf348c..087bf1aa3ad 100644
--- a/dlls/wow64/syscall.c
+++ b/dlls/wow64/syscall.c
@@ -334,6 +334,17 @@ static DWORD get_syscall_num( const BYTE *syscall )
}
+/**********************************************************************
+ * init_image_mapping
+ */
+void init_image_mapping( HMODULE module )
+{
+ void **ptr = RtlFindExportedRoutineByName( module, "Wow64Transition" );
+
+ if (ptr) *ptr = pBTCpuGetBopCode();
+}
+
+
/**********************************************************************
* init_syscall_table
*/
@@ -440,7 +451,6 @@ static HMODULE load_cpu_dll(void)
*/
static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **context )
{
- void **pWow64Transition, **p__wine_syscall_dispatcher;
HMODULE module;
UNICODE_STRING str;
@@ -454,18 +464,17 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex
LdrGetDllHandle( NULL, 0, &str, &module );
GET_PTR( LdrSystemDllInitBlock );
- module = (HMODULE)(ULONG_PTR)pLdrSystemDllInitBlock->ntdll_handle;
- GET_PTR( Wow64Transition );
- GET_PTR( __wine_syscall_dispatcher );
- init_syscall_table( module, 0, &ntdll_syscall_table );
-
module = load_cpu_dll();
GET_PTR( BTCpuGetBopCode );
GET_PTR( BTCpuProcessInit );
GET_PTR( BTCpuSimulate );
pBTCpuProcessInit();
- *pWow64Transition = *p__wine_syscall_dispatcher = pBTCpuGetBopCode();
+
+ module = (HMODULE)(ULONG_PTR)pLdrSystemDllInitBlock->ntdll_handle;
+ init_image_mapping( module );
+ init_syscall_table( module, 0, &ntdll_syscall_table );
+ *(void **)RtlFindExportedRoutineByName( module, "__wine_syscall_dispatcher" ) = pBTCpuGetBopCode();
init_file_redirects();
return TRUE;
diff --git a/dlls/wow64/virtual.c b/dlls/wow64/virtual.c
index b4aabb13c7d..e5759609974 100644
--- a/dlls/wow64/virtual.c
+++ b/dlls/wow64/virtual.c
@@ -257,6 +257,12 @@ NTSTATUS WINAPI wow64_NtMapViewOfSection( UINT *args )
commit, offset, size_32to64( &size, size32 ), inherit, alloc, protect );
if (NT_SUCCESS(status))
{
+ SECTION_IMAGE_INFORMATION info;
+
+ if (!NtQuerySection( handle, SectionImageInformation, &info, sizeof(info), NULL ))
+ {
+ if (info.Machine == current_machine) init_image_mapping( addr );
+ }
put_addr( addr32, addr );
put_size( size32, size );
}
diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h
index 370ae76a0c4..1a9d05eaf43 100644
--- a/dlls/wow64/wow64_private.h
+++ b/dlls/wow64/wow64_private.h
@@ -32,6 +32,7 @@ void * WINAPI Wow64AllocateTemp( SIZE_T size );
void WINAPI Wow64ApcRoutine( ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3, CONTEXT *context );
void WINAPI Wow64PassExceptionToGuest( EXCEPTION_POINTERS *ptrs );
+extern void init_image_mapping( HMODULE module ) DECLSPEC_HIDDEN;
extern void init_file_redirects(void) DECLSPEC_HIDDEN;
extern BOOL get_file_redirect( OBJECT_ATTRIBUTES *attr ) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list