From d91d05b80a4f7ccd7447c4514e5f8298bfcb177b Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 10 Aug 2021 17:56:14 +0200 Subject: [PATCH] ntdll: Add a Wine-specific NtQueryVirtualMemory() query to retrieve the Unix call table. Signed-off-by: Alexandre Julliard --- dlls/ntdll/unix/virtual.c | 41 ++++++++++++++++++++++++++++++++++++++- include/winternl.h | 4 +++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index ee1f331d778..3532f5c8746 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -657,6 +657,29 @@ void *get_builtin_so_handle( void *module ) } +/*********************************************************************** + * get_builtin_unix_funcs + */ +NTSTATUS get_builtin_unix_funcs( void *module, BOOL wow, void **funcs ) +{ + const char *ptr_name = wow ? "__wine_unix_call_wow64_funcs" : "__wine_unix_call_funcs"; + sigset_t sigset; + NTSTATUS status = STATUS_DLL_NOT_FOUND; + struct builtin_module *builtin; + + server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) + { + if (builtin->module != module) continue; + *funcs = dlsym( builtin->unix_handle, ptr_name ); + status = STATUS_SUCCESS; + break; + } + server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + return status; +} + + /*********************************************************************** * get_builtin_unix_info */ @@ -4289,6 +4312,8 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr, MEMORY_INFORMATION_CLASS info_class, PVOID buffer, SIZE_T len, SIZE_T *res_len ) { + NTSTATUS status; + TRACE("(%p, %p, info_class=%d, %p, %ld, %p)\n", process, addr, info_class, buffer, len, res_len); @@ -4311,13 +4336,27 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr, if (handle) { - NTSTATUS status = get_builtin_init_funcs( handle, buffer, len, res_len ); + status = get_builtin_init_funcs( handle, buffer, len, res_len ); release_builtin_module( module ); return status; } } return STATUS_INVALID_HANDLE; + case MemoryWineUnixFuncs: + case MemoryWineUnixWow64Funcs: + if (len != sizeof(UINT64)) return STATUS_INFO_LENGTH_MISMATCH; + if (process == GetCurrentProcess()) + { + void *module = (void *)addr; + void *funcs = NULL; + + status = get_builtin_unix_funcs( module, info_class == MemoryWineUnixWow64Funcs, &funcs ); + if (!status) *(UINT64 *)buffer = (UINT_PTR)funcs; + return status; + } + return STATUS_INVALID_HANDLE; + default: FIXME("(%p,%p,info_class=%d,%p,%ld,%p) Unknown information class\n", process, addr, info_class, buffer, len, res_len); diff --git a/include/winternl.h b/include/winternl.h index 075b1863f72..41bc56d186d 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -1919,7 +1919,9 @@ typedef enum _MEMORY_INFORMATION_CLASS { MemoryBasicInformationCapped, MemoryPhysicalContiguityInformation, #ifdef __WINESRC__ - MemoryWineImageInitFuncs = 1000 + MemoryWineImageInitFuncs = 1000, + MemoryWineUnixFuncs, + MemoryWineUnixWow64Funcs, #endif } MEMORY_INFORMATION_CLASS;