From e3b9aa1487778c3987d022175122c3d006805a46 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 4 May 2022 07:54:25 +0100 Subject: [PATCH] wineoss: Limit Wow64 buffer allocations to 32-bit addresses. Signed-off-by: Huw Davies Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/wineoss.drv/oss.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 986ed274445..40b8879ef47 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -535,6 +535,15 @@ static HRESULT setup_oss_device(AUDCLNT_SHAREMODE share, int fd, return ret; } +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; @@ -597,8 +606,8 @@ static NTSTATUS create_stream(void *args) if(params->share == AUDCLNT_SHAREMODE_EXCLUSIVE) stream->bufsize_frames -= stream->bufsize_frames % stream->period_frames; size = stream->bufsize_frames * params->fmt->nBlockAlign; - if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size, - MEM_COMMIT, PAGE_READWRITE)){ + if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, zero_bits(), + &size, MEM_COMMIT, PAGE_READWRITE)){ params->result = E_OUTOFMEMORY; goto exit; } @@ -931,8 +940,8 @@ 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, - MEM_COMMIT, PAGE_READWRITE)){ + if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, zero_bits(), + &size, MEM_COMMIT, PAGE_READWRITE)){ stream->tmp_buffer_frames = 0; return oss_unlock_result(stream, ¶ms->result, E_OUTOFMEMORY); } @@ -1041,8 +1050,8 @@ 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, - MEM_COMMIT, PAGE_READWRITE)){ + if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, zero_bits(), + &size, MEM_COMMIT, PAGE_READWRITE)){ stream->tmp_buffer_frames = 0; return oss_unlock_result(stream, ¶ms->result, E_OUTOFMEMORY); }