From: Brendan Shanks bshanks@codeweavers.com
--- dlls/win32u/dc.c | 2 +- dlls/win32u/dib.c | 2 +- dlls/win32u/gdiobj.c | 2 +- dlls/win32u/syscall.c | 11 +++++++++++ dlls/win32u/win32u_private.h | 11 ++--------- 5 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/dlls/win32u/dc.c b/dlls/win32u/dc.c index 0b7d2cd023d..0ff624068cb 100644 --- a/dlls/win32u/dc.c +++ b/dlls/win32u/dc.c @@ -112,7 +112,7 @@ static DC_ATTR *alloc_dc_attr(void) { SIZE_T size = system_info.AllocationGranularity; bucket->entries = NULL; - if (!NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&bucket->entries, zero_bits(), + if (!NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&bucket->entries, zero_bits, &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE )) { bucket->next_free = NULL; diff --git a/dlls/win32u/dib.c b/dlls/win32u/dib.c index acd3f442e49..23dbfbcbfaf 100644 --- a/dlls/win32u/dib.c +++ b/dlls/win32u/dib.c @@ -1549,7 +1549,7 @@ HBITMAP WINAPI NtGdiCreateDIBSection( HDC hdc, HANDLE section, DWORD offset, con { SIZE_T size = bmp->dib.dsBmih.biSizeImage; offset = 0; - if (NtAllocateVirtualMemory( GetCurrentProcess(), &bmp->dib.dsBm.bmBits, zero_bits(), + if (NtAllocateVirtualMemory( GetCurrentProcess(), &bmp->dib.dsBm.bmBits, zero_bits, &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE )) goto error; } diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 2201ac4b01e..057988e99e9 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -566,7 +566,7 @@ static void init_gdi_shared(void) { SIZE_T size = sizeof(*gdi_shared);
- if (NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&gdi_shared, zero_bits(), + if (NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&gdi_shared, zero_bits, &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE )) return; next_unused = gdi_shared->Handles + FIRST_GDI_HANDLE; diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index 4004df3f3d6..99fd7859250 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -33,6 +33,7 @@ #include "ntuser.h" #include "wine/unixlib.h"
+ULONG_PTR zero_bits = 0;
static void * const syscalls[] = { @@ -450,6 +451,16 @@ static SYSTEM_SERVICE_TABLE syscall_table =
static NTSTATUS init( void *dispatcher ) { +#ifdef _WIN64 + if (NtCurrentTeb()->WowTebOffset) + { + SYSTEM_BASIC_INFORMATION info; + + NtQuerySystemInformation(SystemEmulationBasicInformation, &info, sizeof(info), NULL); + zero_bits = (ULONG_PTR)info.HighestUserAddress | 0x7fffffff; + } +#endif + return ntdll_init_syscalls( 1, &syscall_table, dispatcher ); }
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 922fd22fe46..005ab53cc01 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -271,6 +271,8 @@ extern HKEY hkcu_key DECLSPEC_HIDDEN;
extern const struct user_driver_funcs *user_driver DECLSPEC_HIDDEN;
+extern ULONG_PTR zero_bits DECLSPEC_HIDDEN; + static inline BOOL set_ntstatus( NTSTATUS status ) { if (status) RtlSetLastWin32Error( RtlNtStatusToDosError( status )); @@ -330,15 +332,6 @@ static inline BOOL is_win9x(void) return NtCurrentTeb()->Peb->OSPlatformId == VER_PLATFORM_WIN32s; }
-static inline ULONG_PTR zero_bits(void) -{ -#ifdef _WIN64 - return !NtCurrentTeb()->WowTebOffset ? 0 : 0x7fffffff; -#else - return 0; -#endif -} - static inline const char *debugstr_us( const UNICODE_STRING *us ) { if (!us) return "<null>";