From 0985b03872e18f76769f48ee5d63462feba31b04 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Fri, 22 Apr 2022 08:37:56 +0100 Subject: [PATCH] winealsa: Limit Wow64 buffer allocations to 32-bit addresses. Signed-off-by: Huw Davies Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/winealsa.drv/alsa.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index 0e86185e441..272040f8047 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -766,6 +766,15 @@ static void silence_buffer(struct alsa_stream *stream, BYTE *buffer, UINT32 fram memset(buffer, 0, frames * stream->fmt->nBlockAlign); } +static ULONG_PTR zero_bits(void) +{ +#ifdef _WIN64 + return !NtCurrentTeb()->WowTebOffset ? 0 : 0x7fffffff; +#else + return 0; +#endif +} + static NTSTATUS create_stream(void *args) { struct create_stream_params *params = args; @@ -948,7 +957,7 @@ static NTSTATUS create_stream(void *args) stream->fmt = &fmtex->Format; size = stream->bufsize_frames * params->fmt->nBlockAlign; - if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size, + if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, zero_bits(), &size, MEM_COMMIT, PAGE_READWRITE)){ params->result = E_OUTOFMEMORY; goto exit; @@ -1661,7 +1670,7 @@ static NTSTATUS get_render_buffer(void *args) stream->tmp_buffer = NULL; } size = frames * stream->fmt->nBlockAlign; - if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0, &size, + if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, zero_bits(), &size, MEM_COMMIT, PAGE_READWRITE)){ stream->tmp_buffer_frames = 0; return alsa_unlock_result(stream, ¶ms->result, E_OUTOFMEMORY); @@ -1764,7 +1773,7 @@ static NTSTATUS get_capture_buffer(void *args) stream->tmp_buffer = NULL; } size = *frames * stream->fmt->nBlockAlign; - if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0, &size, + if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, zero_bits(), &size, MEM_COMMIT, PAGE_READWRITE)){ stream->tmp_buffer_frames = 0; return alsa_unlock_result(stream, ¶ms->result, E_OUTOFMEMORY);