From: Billy Laws blaws05@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 );
Superseded by 3ac808e46e4795e14c5b999aa39fd9cd15f95279.
This merge request was closed by Alexandre Julliard.