Zebediah Figura : dbghelp: Correctly determine the wine loader base address.
Alexandre Julliard
julliard at winehq.org
Thu May 31 15:56:57 CDT 2018
Module: wine
Branch: master
Commit: 185d9ee7ebf56e0663f715e532f2ee2c27289f12
URL: https://source.winehq.org/git/wine.git/?a=commit;h=185d9ee7ebf56e0663f715e532f2ee2c27289f12
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Thu May 31 09:47:50 2018 -0500
dbghelp: Correctly determine the wine loader base address.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dbghelp/dbghelp_private.h | 21 +++++++++++++++++++++
dlls/dbghelp/elf_module.c | 23 +++++++++++++++++++++--
2 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 3c1b3dd..935e766 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -542,6 +542,27 @@ struct cpu
extern struct cpu* dbghelp_current_cpu DECLSPEC_HIDDEN;
+/* Abbreviated 32-bit PEB */
+typedef struct _PEB32
+{
+ BOOLEAN InheritedAddressSpace;
+ BOOLEAN ReadImageFileExecOptions;
+ BOOLEAN BeingDebugged;
+ BOOLEAN SpareBool;
+ DWORD Mutant;
+ DWORD ImageBaseAddress;
+ DWORD LdrData;
+ DWORD ProcessParameters;
+ DWORD SubSystemData;
+ DWORD ProcessHeap;
+ DWORD FastPebLock;
+ DWORD FastPebLockRoutine;
+ DWORD FastPebUnlockRoutine;
+ ULONG EnvironmentUpdateCount;
+ DWORD KernelCallbackTable;
+ ULONG Reserved[2];
+} PEB32;
+
/* dbghelp.c */
extern struct process* process_find_by_handle(HANDLE hProcess) DECLSPEC_HIDDEN;
extern BOOL validate_addr64(DWORD64 addr) DECLSPEC_HIDDEN;
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index 4d877b4..e047a7f 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1574,8 +1574,27 @@ static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
ULONG_PTR base = 0;
BOOL ret;
- if (!NtQueryInformationProcess( pcs->handle, ProcessBasicInformation, &pbi, sizeof(pbi), NULL ))
- ReadProcessMemory( pcs->handle, &pbi.PebBaseAddress->Reserved[0], &base, sizeof(base), NULL );
+ if (NtQueryInformationProcess( pcs->handle, ProcessBasicInformation,
+ &pbi, sizeof(pbi), NULL ))
+ return FALSE;
+
+ if (!pcs->is_64bit)
+ {
+ PEB32 *peb32 = (PEB32 *)pbi.PebBaseAddress;
+ DWORD base32;
+
+ if (!ReadProcessMemory( pcs->handle, &peb32->Reserved[0], &base32,
+ sizeof(base32), NULL ))
+ return FALSE;
+
+ base = base32;
+ }
+ else
+ {
+ if (!ReadProcessMemory( pcs->handle, &pbi.PebBaseAddress->Reserved[0],
+ &base, sizeof(base), NULL ))
+ return FALSE;
+ }
ret = elf_search_and_load_file(pcs, loader, base, 0, elf_info);
heap_free(loader);
More information about the wine-cvs
mailing list