[PATCH v3 3/5] ntdll: Clarify NtAllocateVirtualMemory zero_bits parameter semantics
Huw Davies
huw at codeweavers.com
Tue May 28 04:06:12 CDT 2019
On Tue, May 28, 2019 at 09:39:49AM +0200, Rémi Bernon wrote:
> This parameter was misinterpreted as an alignment parameter for the
> lower bits of the allocated memory region, although it is a constraint
> on the higher bits.
>
> This patch adds a new exported __wine_allocate_virtual_memory function
> that has a separate alignment parameter which is now used instead of
> the zero_bits parameter.
>
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
> dlls/commdlg.dll16/filedlg.c | 8 ++++++--
> dlls/ntdll/directory.c | 4 ++--
> dlls/ntdll/heap.c | 7 ++++---
> dlls/ntdll/ntdll.spec | 1 +
> dlls/ntdll/ntdll_misc.h | 3 +++
> dlls/ntdll/server.c | 9 +++++----
> dlls/ntdll/signal_arm.c | 13 +++++++------
> dlls/ntdll/signal_arm64.c | 17 +++++++++--------
> dlls/ntdll/signal_i386.c | 17 +++++++++--------
> dlls/ntdll/signal_powerpc.c | 13 +++++++------
> dlls/ntdll/signal_x86_64.c | 17 +++++++++--------
> dlls/ntdll/thread.c | 4 ++--
> dlls/ntdll/virtual.c | 30 ++++++++++++++++++++++++------
> include/wine/server_protocol.h | 1 +
> 14 files changed, 89 insertions(+), 55 deletions(-)
>
> diff --git a/dlls/commdlg.dll16/filedlg.c b/dlls/commdlg.dll16/filedlg.c
> index 5b72bfab100..d86ecd7d41c 100644
> --- a/dlls/commdlg.dll16/filedlg.c
> +++ b/dlls/commdlg.dll16/filedlg.c
> @@ -504,13 +504,17 @@ struct hook_proc
>
> static LPOFNHOOKPROC alloc_hook( LPOFNHOOKPROC16 hook16 )
> {
> + extern NTSTATUS CDECL __wine_allocate_virtual_memory( HANDLE process, PVOID *ret, ULONG zero_bits,
> + SIZE_T *size_ptr, ULONG type, ULONG protect,
> + ULONG alignment );
> +
> static struct hook_proc *hooks;
> static unsigned int count;
> SIZE_T size = 0x1000;
> unsigned int i;
>
> - if (!hooks && NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&hooks, 12, &size,
> - MEM_COMMIT, PAGE_EXECUTE_READWRITE ))
> + if (!hooks && __wine_allocate_virtual_memory( GetCurrentProcess(), (void **)&hooks, 0, &size,
> + MEM_COMMIT, PAGE_EXECUTE_READWRITE, 12 ))
> return NULL;
>
> for (i = 0; i < count; i++)
We really don't want to start introducing Wine specific apis unless we
really have to. In this case we'll just live with the default
alignment and as Alexandre mentioned here:
https://www.winehq.org/pipermail/wine-devel/2019-March/142211.html
you may as well switch to VirtualAlloc().
> diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
> index bbdbbe9781f..68c268ea9a9 100644
> --- a/dlls/ntdll/directory.c
> +++ b/dlls/ntdll/directory.c
> @@ -1603,14 +1603,14 @@ static KERNEL_DIRENT *start_vfat_ioctl( int fd )
> SIZE_T size = 2 * sizeof(*de) + page_size;
> void *addr = NULL;
>
> - if (NtAllocateVirtualMemory( GetCurrentProcess(), &addr, 1, &size, MEM_RESERVE, PAGE_READWRITE ))
> + if (__wine_allocate_virtual_memory( GetCurrentProcess(), &addr, 0, &size, MEM_RESERVE, PAGE_READWRITE, 1 ))
> return NULL;
> /* commit only the size needed for the dir entries */
> /* this leaves an extra unaccessible page, which should make the kernel */
> /* fail with -EFAULT before it stomps all over our memory */
> de = addr;
> size = 2 * sizeof(*de);
> - NtAllocateVirtualMemory( GetCurrentProcess(), &addr, 1, &size, MEM_COMMIT, PAGE_READWRITE );
> + __wine_allocate_virtual_memory( GetCurrentProcess(), &addr, 0, &size, MEM_COMMIT, PAGE_READWRITE, 1 );
> }
>
It may make sense to introduce an internal ntdll helper which allocs
with smaller alignments than 64k, but it won't need to do this
cross-process.
Huw.
More information about the wine-devel
mailing list