https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e0db46fa2eab7e6d5987a8e24fa2c003f71da7f2

commit e0db46fa2eab7e6d5987a8e24fa2c003f71da7f2
Author:     winesync <[email protected]>
AuthorDate: Fri Sep 11 18:29:52 2020 +0200
Commit:     Jérôme Gardou <[email protected]>
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 <[email protected]>
    Signed-off-by: Alexandre Julliard <[email protected]>
    
    wine commit id e3354e44f17d74f0ac4547d8a4494c83ea3d6d37 by Jacek Caban 
<[email protected]>
---
 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

Reply via email to