https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e0db46fa2eab7e6d5987a…
commit e0db46fa2eab7e6d5987a8e24fa2c003f71da7f2
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Fri Sep 11 18:29:52 2020 +0200
Commit: Jérôme Gardou <jerome.gardou(a)reactos.org>
CommitDate: Wed Sep 16 10:35:50 2020 +0200
[WINESYNC] dbghelp: Move reading debug base address from PEB to check_live_target.
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id e3354e44f17d74f0ac4547d8a4494c83ea3d6d37 by Jacek Caban
<jacek(a)codeweavers.com>
---
dll/win32/dbghelp/dbghelp.c | 26 ++++++++++++---
dll/win32/dbghelp/dbghelp_private.h | 4 +--
dll/win32/dbghelp/elf_module.c | 55 ++++++-------------------------
dll/win32/dbghelp/macho_module.c | 66 +++++++++----------------------------
sdk/tools/winesync/dbghelp.cfg | 2 +-
5 files changed, 50 insertions(+), 103 deletions(-)
diff --git a/dll/win32/dbghelp/dbghelp.c b/dll/win32/dbghelp/dbghelp.c
index 6e03cc3d385..a5acc786606 100644
--- a/dll/win32/dbghelp/dbghelp.c
+++ b/dll/win32/dbghelp/dbghelp.c
@@ -284,20 +284,36 @@ static BOOL WINAPI process_invade_cb(PCWSTR name, ULONG64 base,
ULONG size, PVOI
return TRUE;
}
+#ifndef DBGHELP_STATIC_LIB
/******************************************************************
* check_live_target
*
*/
static BOOL check_live_target(struct process* pcs)
{
+ PROCESS_BASIC_INFORMATION pbi;
+ ULONG_PTR base = 0;
+
if (!GetProcessId(pcs->handle)) return FALSE;
if (GetEnvironmentVariableA("DBGHELP_NOLIVE", NULL, 0)) return FALSE;
-#ifndef DBGHELP_STATIC_LIB
- if (!elf_read_wine_loader_dbg_info(pcs))
- macho_read_wine_loader_dbg_info(pcs);
-#endif
- return TRUE;
+
+ if (NtQueryInformationProcess( pcs->handle, ProcessBasicInformation,
+ &pbi, sizeof(pbi), NULL ))
+ return FALSE;
+
+ if (!pcs->is_64bit)
+ {
+ PEB32 *peb32 = (PEB32 *)pbi.PebBaseAddress;
+ DWORD base32 = 0;
+ ReadProcessMemory(pcs->handle, &peb32->Reserved[0], &base32,
sizeof(base32), NULL);
+ base = base32;
+ }
+ else ReadProcessMemory(pcs->handle, &pbi.PebBaseAddress->Reserved[0],
&base, sizeof(base), NULL);
+
+ TRACE("got debug info address %#lx from PEB %p\n", base,
pbi.PebBaseAddress);
+ return elf_read_wine_loader_dbg_info(pcs, base) ||
macho_read_wine_loader_dbg_info(pcs, base);
}
+#endif
/******************************************************************
* SymInitializeW (DBGHELP.@)
diff --git a/dll/win32/dbghelp/dbghelp_private.h b/dll/win32/dbghelp/dbghelp_private.h
index d2f4b27bf90..49cf51fff24 100644
--- a/dll/win32/dbghelp/dbghelp_private.h
+++ b/dll/win32/dbghelp/dbghelp_private.h
@@ -635,12 +635,12 @@ extern struct cpu* cpu_find(DWORD) DECLSPEC_HIDDEN;
extern DWORD calc_crc32(HANDLE handle) DECLSPEC_HIDDEN;
/* elf_module.c */
-extern BOOL elf_read_wine_loader_dbg_info(struct process* pcs) DECLSPEC_HIDDEN;
+extern BOOL elf_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr)
DECLSPEC_HIDDEN;
struct elf_thunk_area;
extern int elf_is_in_thunk_area(unsigned long addr, const struct elf_thunk_area*
thunks) DECLSPEC_HIDDEN;
/* macho_module.c */
-extern BOOL macho_read_wine_loader_dbg_info(struct process* pcs)
DECLSPEC_HIDDEN;
+extern BOOL macho_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr)
DECLSPEC_HIDDEN;
/* minidump.c */
void minidump_add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size, ULONG
rva) DECLSPEC_HIDDEN;
diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c
index 20c68dc1ab3..50ad89f53f7 100644
--- a/dll/win32/dbghelp/elf_module.c
+++ b/dll/win32/dbghelp/elf_module.c
@@ -1661,48 +1661,6 @@ static BOOL elf_synchronize_module_list(struct process* pcs)
return TRUE;
}
-/******************************************************************
- * elf_search_loader
- *
- * Lookup in a running ELF process the loader, and sets its ELF link
- * address (for accessing the list of loaded .so libs) in pcs.
- * If flags is ELF_INFO_MODULE, the module for the loader is also
- * added as a module into pcs.
- */
-static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
-{
- WCHAR *loader = get_wine_loader_name(pcs);
- PROCESS_BASIC_INFORMATION pbi;
- ULONG_PTR base = 0;
- BOOL ret;
-
- 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);
- return ret;
-}
-
static const struct loader_ops elf_loader_ops =
{
elf_synchronize_module_list,
@@ -1717,12 +1675,19 @@ static const struct loader_ops elf_loader_ops =
*
* Try to find a decent wine executable which could have loaded the debuggee
*/
-BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
+BOOL elf_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr)
{
struct elf_info elf_info;
+ WCHAR *loader;
+ BOOL ret;
elf_info.flags = ELF_INFO_DEBUG_HEADER | ELF_INFO_MODULE;
- if (!elf_search_loader(pcs, &elf_info) || !elf_info.dbg_hdr_addr) return FALSE;
+ loader = get_wine_loader_name(pcs);
+ ret = elf_search_and_load_file(pcs, loader, addr, 0, &elf_info);
+ heap_free(loader);
+ if (!ret || !elf_info.dbg_hdr_addr) return FALSE;
+
+ TRACE("Found ELF debug header %#lx\n", elf_info.dbg_hdr_addr);
elf_info.module->format_info[DFI_ELF]->u.elf_info->elf_loader = 1;
module_set_module(elf_info.module, S_WineLoaderW);
pcs->dbg_hdr_addr = elf_info.dbg_hdr_addr;
@@ -1737,7 +1702,7 @@ BOOL elf_map_handle(HANDLE handle, struct image_file_map* fmap)
return FALSE;
}
-BOOL elf_read_wine_loader_dbg_info(struct process* pcs)
+BOOL elf_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr)
{
return FALSE;
}
diff --git a/dll/win32/dbghelp/macho_module.c b/dll/win32/dbghelp/macho_module.c
index 8e2fa796e03..43a98c9c726 100644
--- a/dll/win32/dbghelp/macho_module.c
+++ b/dll/win32/dbghelp/macho_module.c
@@ -129,14 +129,12 @@ struct section_info
unsigned int section_index;
};
-#define MACHO_INFO_DEBUG_HEADER 0x0001
-#define MACHO_INFO_MODULE 0x0002
-#define MACHO_INFO_NAME 0x0004
+#define MACHO_INFO_MODULE 0x0001
+#define MACHO_INFO_NAME 0x0002
struct macho_info
{
unsigned flags; /* IN one (or several) of the MACHO_INFO
constants */
- unsigned long dbg_hdr_addr; /* OUT address of debug header (if
MACHO_INFO_DEBUG_HEADER is set) */
struct module* module; /* OUT loaded module (if
MACHO_INFO_MODULE is set) */
const WCHAR* module_name; /* OUT found module name (if
MACHO_INFO_NAME is set) */
};
@@ -1373,32 +1371,7 @@ static void macho_module_remove(struct process* pcs, struct
module_format* modfm
*/
static ULONG_PTR get_dyld_image_info_address(struct process* pcs)
{
- NTSTATUS status;
- PROCESS_BASIC_INFORMATION pbi;
ULONG_PTR dyld_image_info_address = 0;
- BOOL ret;
-
- /* Get address of PEB */
- status = NtQueryInformationProcess(pcs->handle, ProcessBasicInformation, &pbi,
sizeof(pbi), NULL);
- if (status == STATUS_SUCCESS)
- {
- /* Read dyld image info address from PEB */
- if (pcs->is_64bit)
- ret = ReadProcessMemory(pcs->handle,
&pbi.PebBaseAddress->Reserved[0],
- &dyld_image_info_address, sizeof(dyld_image_info_address), NULL);
- else
- {
- PEB32 *peb32 = (PEB32 *)pbi.PebBaseAddress;
- ULONG addr32;
- ret = ReadProcessMemory(pcs->handle, &peb32->Reserved[0],
&addr32,
- sizeof(addr32), NULL);
- dyld_image_info_address = addr32;
- }
-
- if (ret)
- TRACE("got dyld_image_info_address %#lx from PEB %p\n",
- dyld_image_info_address, pbi.PebBaseAddress);
- }
#ifndef __LP64__ /* No reading the symtab with nlist(3) in LP64 */
if (!dyld_image_info_address)
@@ -1451,14 +1424,6 @@ static BOOL macho_load_file(struct process* pcs, const WCHAR*
filename,
split_segs = image_uses_split_segs(pcs, load_addr);
if (!macho_map_file(pcs, filename, split_segs, &fmap)) return FALSE;
- /* Find the dynamic loader's table of images loaded into the process.
- */
- if (macho_info->flags & MACHO_INFO_DEBUG_HEADER)
- {
- macho_info->dbg_hdr_addr = (unsigned long)get_dyld_image_info_address(pcs);
- ret = TRUE;
- }
-
if (macho_info->flags & MACHO_INFO_MODULE)
{
struct macho_module_info *macho_module_info;
@@ -1736,7 +1701,7 @@ static BOOL macho_enum_modules(struct process* process,
enum_modules_cb cb, void
BOOL ret;
TRACE("(%p, %p, %p)\n", process->handle, cb, user);
- macho_info.flags = MACHO_INFO_DEBUG_HEADER | MACHO_INFO_NAME;
+ macho_info.flags = MACHO_INFO_NAME;
ret = macho_enum_modules_internal(process, macho_info.module_name, cb, user);
HeapFree(GetProcessHeap(), 0, (char*)macho_info.module_name);
return ret;
@@ -1823,9 +1788,7 @@ static struct module* macho_load_module(struct process* pcs, const
WCHAR* name,
*/
static BOOL macho_search_loader(struct process* pcs, struct macho_info* macho_info)
{
- WCHAR *loader = get_wine_loader_name(pcs);
BOOL ret = FALSE;
- ULONG_PTR dyld_image_info_address;
union wine_all_image_infos image_infos;
union wine_image_info image_info;
uint32_t len;
@@ -1836,9 +1799,8 @@ static BOOL macho_search_loader(struct process* pcs, struct
macho_info* macho_in
len = sizeof(image_infos.infos64);
else
len = sizeof(image_infos.infos32);
- dyld_image_info_address = get_dyld_image_info_address(pcs);
- if (dyld_image_info_address &&
- ReadProcessMemory(pcs->handle, (void*)dyld_image_info_address,
&image_infos, len, NULL))
+ if (pcs->dbg_hdr_addr &&
+ ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr, &image_infos,
len, NULL))
{
if (pcs->is_64bit)
len = sizeof(image_info.info64);
@@ -1898,8 +1860,11 @@ static BOOL macho_search_loader(struct process* pcs, struct
macho_info* macho_in
}
if (!ret)
- ret = macho_search_and_load_file(pcs, loader, 0, macho_info);
- heap_free(loader);
+ {
+ WCHAR *loader = get_wine_loader_name(pcs);
+ ret = loader && macho_search_and_load_file(pcs, loader, 0, macho_info);
+ heap_free(loader);
+ }
return ret;
}
@@ -1917,23 +1882,24 @@ static const struct loader_ops macho_loader_ops =
*
* Try to find a decent wine executable which could have loaded the debuggee
*/
-BOOL macho_read_wine_loader_dbg_info(struct process* pcs)
+BOOL macho_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr)
{
struct macho_info macho_info;
TRACE("(%p/%p)\n", pcs, pcs->handle);
- macho_info.flags = MACHO_INFO_DEBUG_HEADER | MACHO_INFO_MODULE;
- if (!macho_search_loader(pcs, &macho_info) || !macho_info.dbg_hdr_addr) return
FALSE;
+ pcs->dbg_hdr_addr = addr ? addr : get_dyld_image_info_address(pcs);
+ macho_info.flags = MACHO_INFO_MODULE;
+ if (!macho_search_loader(pcs, &macho_info)) return FALSE;
macho_info.module->format_info[DFI_MACHO]->u.macho_info->is_loader = 1;
module_set_module(macho_info.module, S_WineLoaderW);
- pcs->dbg_hdr_addr = macho_info.dbg_hdr_addr;
pcs->loader = &macho_loader_ops;
+ TRACE("Found macho debug header %#lx\n", pcs->dbg_hdr_addr);
return TRUE;
}
#else /* HAVE_MACH_O_LOADER_H */
-BOOL macho_read_wine_loader_dbg_info(struct process* pcs)
+BOOL macho_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr)
{
return FALSE;
}
diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg
index b547254b48b..323dc44f9fa 100644
--- a/sdk/tools/winesync/dbghelp.cfg
+++ b/sdk/tools/winesync/dbghelp.cfg
@@ -4,4 +4,4 @@ files:
include/dbghelp.h: sdk/include/psdk/dbghelp.h
include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h
tags:
- wine: 635506921a28c65bfc9b339d59c63d96092d97d8
+ wine: e3354e44f17d74f0ac4547d8a4494c83ea3d6d37