[PATCH 0/1] MR3535: ntdll: Take LARGE_ADDRESS_AWARE into account for userspace allocation limits.
From: Billy Laws <blaws05(a)gmail.com> --- dlls/ntdll/unix/thread.c | 2 +- dlls/ntdll/unix/unix_private.h | 7 ++++++- dlls/ntdll/unix/virtual.c | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index d312ed6a066..16db66d97d4 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -1201,7 +1201,7 @@ NTSTATUS init_thread_stack( TEB *teb, ULONG_PTR limit, SIZE_T reserve_size, SIZE teb->DeallocationStack = stack.DeallocationStack; /* 32-bit stack */ - if (!limit || limit >= limit_2g) limit = limit_2g - 1; + if (!limit || limit > get_wow_limit_mask()) limit = get_wow_limit_mask(); if ((status = virtual_alloc_thread_stack( &stack, 0, limit, reserve_size, commit_size, TRUE ))) return status; wow_teb->Tib.StackBase = PtrToUlong( stack.StackBase ); diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 6862d74b863..e943e362033 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -469,6 +469,11 @@ static inline ULONG_PTR get_zero_bits_limit( ULONG_PTR zero_bits ) return (~(UINT64)0) >> shift; } +static inline ULONG_PTR get_wow_limit_mask(void) +{ + if (main_image_info.ImageCharacteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) return limit_4g - 1; + return limit_2g - 1; +} enum loadorder { @@ -516,7 +521,7 @@ static inline NTSTATUS map_section( HANDLE mapping, void **ptr, SIZE_T *size, UL { *ptr = NULL; *size = 0; - return NtMapViewOfSection( mapping, NtCurrentProcess(), ptr, is_win64 && wow_peb ? limit_2g - 1 : 0, + return NtMapViewOfSection( mapping, NtCurrentProcess(), ptr, is_win64 && is_wow64() ? get_wow_limit_mask() : 0, 0, NULL, size, ViewShare, 0, protect ); } diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 62fc1c9dd1f..c4dd4feb144 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -3423,7 +3423,7 @@ NTSTATUS virtual_alloc_teb( TEB **ret_teb ) SIZE_T total = 32 * block_size; if ((status = NtAllocateVirtualMemory( NtCurrentProcess(), &ptr, - is_win64 && is_wow64() ? limit_2g - 1 : 0, + is_win64 && is_wow64() ? get_wow_limit_mask() : 0, &total, MEM_RESERVE, PAGE_READWRITE ))) { server_leave_uninterrupted_section( &virtual_mutex, &sigset ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3535
Superseded by 3ac808e46e4795e14c5b999aa39fd9cd15f95279. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/3535#note_44746
This merge request was closed by Alexandre Julliard. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/3535
participants (3)
-
Alexandre Julliard (@julliard) -
Billy Laws -
Billy Laws (@bylaws)