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

commit 95f6a74d855565e92caf3c9de4c873ff945ee765
Author:     winesync <[email protected]>
AuthorDate: Fri Sep 11 16:56:27 2020 +0200
Commit:     Jérôme Gardou <[email protected]>
CommitDate: Wed Sep 16 10:35:44 2020 +0200

    [WINESYNC] dbghelp: Try loading builtin modules from unix installation.
    
    Signed-off-by: Jacek Caban <[email protected]>
    Signed-off-by: Alexandre Julliard <[email protected]>
    
    wine commit id e21b61392cbc3a4879f837316c869c44b8dcf685 by Jacek Caban 
<[email protected]>
---
 dll/win32/dbghelp/dbghelp_private.h |  1 +
 dll/win32/dbghelp/image_private.h   |  1 +
 dll/win32/dbghelp/module.c          |  1 +
 dll/win32/dbghelp/pe_module.c       | 94 +++++++++++++++++++++++++++++++++++++
 sdk/tools/winesync/dbghelp.cfg      |  2 +-
 5 files changed, 98 insertions(+), 1 deletion(-)

diff --git a/dll/win32/dbghelp/dbghelp_private.h 
b/dll/win32/dbghelp/dbghelp_private.h
index 27cb8f2f453..d9cddae5f02 100644
--- a/dll/win32/dbghelp/dbghelp_private.h
+++ b/dll/win32/dbghelp/dbghelp_private.h
@@ -384,6 +384,7 @@ struct module
     enum module_type           type : 16;
     unsigned short              is_virtual : 1;
     DWORD64                     reloc_delta;
+    WCHAR*                      real_path;
 
     /* specific information for debug types */
     struct module_format*       format_info[DFI_LAST];
diff --git a/dll/win32/dbghelp/image_private.h 
b/dll/win32/dbghelp/image_private.h
index 46275481f96..fd5a7c91d69 100644
--- a/dll/win32/dbghelp/image_private.h
+++ b/dll/win32/dbghelp/image_private.h
@@ -112,6 +112,7 @@ struct image_file_map
         {
             HANDLE                      hMap;
             IMAGE_NT_HEADERS            ntheader;
+            BOOL                        builtin;
             unsigned                    full_count;
             void*                       full_map;
             struct
diff --git a/dll/win32/dbghelp/module.c b/dll/win32/dbghelp/module.c
index 4dca1cf0a9b..5243b53a829 100644
--- a/dll/win32/dbghelp/module.c
+++ b/dll/win32/dbghelp/module.c
@@ -732,6 +732,7 @@ BOOL module_remove(struct process* pcs, struct module* 
module)
     hash_table_destroy(&module->ht_types);
     HeapFree(GetProcessHeap(), 0, module->sources);
     HeapFree(GetProcessHeap(), 0, module->addr_sorttab);
+    HeapFree(GetProcessHeap(), 0, module->real_path);
     pool_destroy(&module->pool);
     /* native dbghelp doesn't invoke registered 
callback(,CBA_SYMBOLS_UNLOADED,) here
      * so do we
diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c
index 54a830c5420..1217a8edd0c 100644
--- a/dll/win32/dbghelp/pe_module.c
+++ b/dll/win32/dbghelp/pe_module.c
@@ -34,6 +34,7 @@
 #ifndef DBGHELP_STATIC_LIB
 #include "winternl.h"
 #include "wine/debug.h"
+#include "wine/heap.h"
 #endif
 
 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
@@ -43,6 +44,8 @@ struct pe_module_info
     struct image_file_map       fmap;
 };
 
+static const char builtin_signature[] = "Wine builtin DLL";
+
 static void* pe_map_full(struct image_file_map* fmap, IMAGE_NT_HEADERS** nth)
 {
     if (!fmap->u.pe.full_map)
@@ -232,6 +235,8 @@ static BOOL pe_map_file(HANDLE file, struct image_file_map* 
fmap, enum module_ty
             case 0x20b: fmap->addr_size = 64; break;
             default: return FALSE;
             }
+
+            fmap->u.pe.builtin = !memcmp((const IMAGE_DOS_HEADER*)mapping + 1, 
builtin_signature, sizeof(builtin_signature));
             section = (IMAGE_SECTION_HEADER*)
                 ((char*)&nthdr->OptionalHeader + 
nthdr->FileHeader.SizeOfOptionalHeader);
             fmap->u.pe.sect = HeapAlloc(GetProcessHeap(), 0,
@@ -756,6 +761,72 @@ BOOL pe_load_debug_info(const struct process* pcs, struct 
module* module)
     return ret;
 }
 
+#ifndef __REACTOS__
+static WCHAR *find_builtin_pe(const WCHAR *path, HANDLE *file)
+{
+    const WCHAR *base_name;
+    size_t len, i;
+    WCHAR *buf;
+
+    static const WCHAR winebuilddirW[] = 
{'W','I','N','E','B','U','I','L','D','D','I','R',0};
+    static const WCHAR winedlldirW[] = 
{'W','I','N','E','D','L','L','D','I','R','%','u',0};
+
+    if ((base_name = strrchrW(path, '\\'))) base_name++;
+    else base_name = path;
+
+    if ((len = GetEnvironmentVariableW(winebuilddirW, NULL, 0)))
+    {
+        WCHAR *p, *end;
+        const WCHAR dllsW[] = { '\\','d','l','l','s','\\' };
+        const WCHAR programsW[] = { '\\','p','r','o','g','r','a','m','s','\\' 
};
+        const WCHAR dot_dllW[] = {'.','d','l','l',0};
+        const WCHAR dot_exeW[] = {'.','e','x','e',0};
+
+        if (!(buf = heap_alloc((len + 8 + 2 * lstrlenW(base_name)) * 
sizeof(WCHAR)))) return NULL;
+        end = buf + GetEnvironmentVariableW(winebuilddirW, buf, len);
+
+        memcpy(end, dllsW, sizeof(dllsW));
+        strcpyW(end + ARRAY_SIZE(dllsW), base_name);
+        if ((p = strchrW(end, '.')) && !lstrcmpW(p, dot_dllW)) *p = 0;
+        p = end + strlenW(end);
+        *p++ = '\\';
+        strcpyW(p, base_name);
+        *file = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+        if (*file != INVALID_HANDLE_VALUE) return buf;
+
+        memcpy(end, programsW, sizeof(programsW));
+        end += ARRAY_SIZE(programsW);
+        strcpyW(end, base_name);
+        if ((p = strchrW(end, '.')) && !lstrcmpW(p, dot_exeW)) *p = 0;
+        p = end + strlenW(end);
+        *p++ = '\\';
+        strcpyW(p, base_name);
+        *file = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+        if (*file != INVALID_HANDLE_VALUE) return buf;
+
+        heap_free(buf);
+    }
+
+    for (i = 0;; i++)
+    {
+        WCHAR name[64];
+        sprintfW(name, winedlldirW, i);
+        if (!(len = GetEnvironmentVariableW(name, NULL, 0))) break;
+        if (!(buf = heap_alloc((len + lstrlenW(base_name) + 2) * 
sizeof(WCHAR)))) return NULL;
+
+        GetEnvironmentVariableW(name, buf, len);
+        buf[len++] = '\\';
+        strcpyW(buf + len, base_name);
+        *file = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+        if (*file != INVALID_HANDLE_VALUE) return buf;
+
+        heap_free(buf);
+    }
+
+    return NULL;
+}
+#endif
+
 /******************************************************************
  *             pe_load_native_module
  *
@@ -785,6 +856,21 @@ struct module* pe_load_native_module(struct process* pcs, 
const WCHAR* name,
     modfmt->u.pe_info = (struct pe_module_info*)(modfmt + 1);
     if (pe_map_file(hFile, &modfmt->u.pe_info->fmap, DMT_PE))
     {
+#ifndef __REACTOS__
+        WCHAR *builtin_path = NULL;
+        HANDLE builtin_module;
+        if (modfmt->u.pe_info->fmap.u.pe.builtin && (builtin_path = 
find_builtin_pe(loaded_name, &builtin_module)))
+        {
+            struct image_file_map builtin_fmap;
+            if (pe_map_file(builtin_module, &builtin_fmap, DMT_PE))
+            {
+                TRACE("reloaded %s from %s\n", debugstr_w(loaded_name), 
debugstr_w(builtin_path));
+                pe_unmap_file(&modfmt->u.pe_info->fmap);
+                modfmt->u.pe_info->fmap = builtin_fmap;
+            }
+            CloseHandle(builtin_module);
+        }
+#endif
         if (!base) base = 
modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase;
         if (!size) size = 
modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage;
 
@@ -793,6 +879,11 @@ struct module* pe_load_native_module(struct process* pcs, 
const WCHAR* name,
                             
modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum);
         if (module)
         {
+#ifdef __REACTOS__
+            module->real_path = NULL;
+#else
+            module->real_path = builtin_path;
+#endif
             modfmt->module = module;
             modfmt->remove = pe_module_remove;
             modfmt->loc_compute = NULL;
@@ -807,6 +898,9 @@ struct module* pe_load_native_module(struct process* pcs, 
const WCHAR* name,
         else
         {
             ERR("could not load the module '%s'\n", debugstr_w(loaded_name));
+#ifndef __REACTOS__
+            heap_free(module->real_path);
+#endif
             pe_unmap_file(&modfmt->u.pe_info->fmap);
         }
     }
diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg
index 80fc0c075da..3b36c85191e 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: 7e16acf3806f9e810884d710c640f5f82c158093
+  wine: e21b61392cbc3a4879f837316c869c44b8dcf685

Reply via email to