[PATCH 1/1] wow64: Respect the large address aware flag.
Brendan Shanks
wine at gitlab.winehq.org
Mon Jun 27 16:53:46 CDT 2022
From: Brendan Shanks <bshanks at codeweavers.com>
---
dlls/wow64/process.c | 2 +-
dlls/wow64/syscall.c | 14 +++++++++++++-
dlls/wow64/wow64_private.h | 3 ++-
3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c
index 0c6726b9c6e..849312cc691 100644
--- a/dlls/wow64/process.c
+++ b/dlls/wow64/process.c
@@ -1118,7 +1118,7 @@ NTSTATUS WINAPI wow64_NtSetInformationProcess( UINT *args )
PROCESS_STACK_ALLOCATION_INFORMATION info;
info.ReserveSize = stack->ReserveSize;
- info.ZeroBits = stack->ZeroBits ? stack->ZeroBits : 0x7fffffff;
+ info.ZeroBits = stack->ZeroBits ? stack->ZeroBits : (ULONG_PTR)user_space_limit;
if (!(status = NtSetInformationProcess( handle, class, &info, sizeof(info) )))
stack->StackBase = PtrToUlong( info.StackBase );
return status;
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c
index 7cab0894738..835c8b88105 100644
--- a/dlls/wow64/syscall.c
+++ b/dlls/wow64/syscall.c
@@ -36,6 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wow);
USHORT native_machine = 0;
USHORT current_machine = 0;
ULONG_PTR args_alignment = 0;
+void *user_space_limit = (void *)0x7fffffff;
typedef NTSTATUS (WINAPI *syscall_thunk)( UINT *args );
@@ -98,7 +99,18 @@ void *dummy = RtlUnwind;
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved )
{
- if (reason == DLL_PROCESS_ATTACH) LdrDisableThreadCalloutsForDll( inst );
+ if (reason == DLL_PROCESS_ATTACH)
+ {
+ NTSTATUS status;
+ SYSTEM_BASIC_INFORMATION info;
+
+ LdrDisableThreadCalloutsForDll( inst );
+
+ if (!(status = NtQuerySystemInformation( SystemEmulationBasicInformation, &info, sizeof(info), NULL )))
+ user_space_limit = info.HighestUserAddress;
+ else
+ ERR( "could not retrieve address space limit: %lx\n", status );
+ }
return TRUE;
}
diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h
index b26148023db..c6e38964413 100644
--- a/dlls/wow64/wow64_private.h
+++ b/dlls/wow64/wow64_private.h
@@ -39,6 +39,7 @@ extern BOOL get_file_redirect( OBJECT_ATTRIBUTES *attr ) DECLSPEC_HIDDEN;
extern USHORT native_machine DECLSPEC_HIDDEN;
extern USHORT current_machine DECLSPEC_HIDDEN;
extern ULONG_PTR args_alignment DECLSPEC_HIDDEN;
+extern void *user_space_limit DECLSPEC_HIDDEN;
extern SYSTEM_DLL_INIT_BLOCK *pLdrSystemDllInitBlock DECLSPEC_HIDDEN;
struct object_attr64
@@ -83,7 +84,7 @@ static inline ULONG64 get_ulong64( UINT **args )
static inline ULONG_PTR get_zero_bits( ULONG_PTR zero_bits )
{
- return zero_bits ? zero_bits : 0x7fffffff;
+ return zero_bits ? zero_bits : (ULONG_PTR)user_space_limit;
}
static inline void **addr_32to64( void **addr, ULONG *addr32 )
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/328
More information about the wine-devel
mailing list