https://git.reactos.org/?p=reactos.git;a=commitdiff;h=95f6a74d855565e92caf3…
commit 95f6a74d855565e92caf3c9de4c873ff945ee765
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Fri Sep 11 16:56:27 2020 +0200
Commit: Jérôme Gardou <jerome.gardou(a)reactos.org>
CommitDate: Wed Sep 16 10:35:44 2020 +0200
[WINESYNC] dbghelp: Try loading builtin modules from unix installation.
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id e21b61392cbc3a4879f837316c869c44b8dcf685 by Jacek Caban
<jacek(a)codeweavers.com>
---
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