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

commit f69be6c561fcf5e151e96ad9729f3ec501b8393a
Author:     winesync <[email protected]>
AuthorDate: Fri Sep 11 13:00:06 2020 +0200
Commit:     Jérôme Gardou <[email protected]>
CommitDate: Wed Sep 16 10:35:31 2020 +0200

    [WINESYNC] dbghelp: Determine the wine loader name from the target 
process's architecture.
    
    Signed-off-by: Zebediah Figura <[email protected]>
    Signed-off-by: Alexandre Julliard <[email protected]>
    
    wine commit id a981edf0bc7c828e6b55fdc73b51a2f457043c4a by Zebediah Figura 
<[email protected]>
---
 dll/win32/dbghelp/compat.c          | 22 +++++++++-----
 dll/win32/dbghelp/compat.h          | 39 +++++++++++++-----------
 dll/win32/dbghelp/dbghelp.c         |  7 +++++
 dll/win32/dbghelp/dbghelp_private.h | 60 ++++++++++++++++++++-----------------
 dll/win32/dbghelp/elf_module.c      |  7 ++++-
 dll/win32/dbghelp/macho_module.c    |  4 ++-
 dll/win32/dbghelp/module.c          | 57 +++++++++++++++++------------------
 sdk/tools/winesync/dbghelp.cfg      |  2 +-
 8 files changed, 111 insertions(+), 87 deletions(-)

diff --git a/dll/win32/dbghelp/compat.c b/dll/win32/dbghelp/compat.c
index 51a43453fa8..dfd9ec13d29 100644
--- a/dll/win32/dbghelp/compat.c
+++ b/dll/win32/dbghelp/compat.c
@@ -71,8 +71,8 @@ __RtlImageRvaToSection(
 
 PVOID
 __RtlImageRvaToVa
-(const IMAGE_NT_HEADERS* NtHeader, 
- PVOID BaseAddress, 
+(const IMAGE_NT_HEADERS* NtHeader,
+ PVOID BaseAddress,
  ULONG Rva,
  PIMAGE_SECTION_HEADER *SectionHeader)
 {
@@ -160,7 +160,7 @@ HANDLE __CreateFileW(
 {
     char buf[MAX_PATH];
     HANDLE res;
-    
+
     WideCharToMultiByte(CP_ACP, 0, lpFileName, -1, buf, MAX_PATH, NULL, NULL);
     res = CreateFileA(buf, dwDesiredAccess, dwShareMode, lpSecurityAttributes, 
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
     return res;
@@ -187,7 +187,7 @@ void* __MapViewOfFile(HANDLE file,DWORD d1,DWORD d2,DWORD 
d3,SIZE_T s)
         free(result);
         return NULL;
     }
-    
+
     return result;
 }
 
@@ -222,15 +222,15 @@ __WideCharToMultiByte(UINT page, DWORD flags, LPCWSTR 
src, INT srclen,
     }
 
     if (srclen < 0) srclen = strlenW(src) + 1;
-    
+
     if(!dstlen)
         return srclen;
-    
+
     for(i=0; i<srclen && i<dstlen; i++)
         dst[i] = src[i] & 0xFF;
 
     if (used) *used = FALSE;
-    
+
     return i;
 }
 
@@ -247,7 +247,7 @@ __MultiByteToWideChar(UINT page, DWORD flags, LPCSTR src, 
INT srclen,
     }
 
     if (srclen < 0) srclen = strlen(src) + 1;
-    
+
     if(!dstlen)
         return srclen;
 
@@ -394,3 +394,9 @@ const char *wine_dbgstr_wn( const WCHAR *str, int n )
     *dst++ = 0;
     return res;
 }
+
+BOOL __IsWow64Process(HANDLE Process, BOOL* is_wow64)
+{
+       *is_wow64 = FALSE;
+       return TRUE;
+}
diff --git a/dll/win32/dbghelp/compat.h b/dll/win32/dbghelp/compat.h
index f6061c773c7..cbd90edbe81 100644
--- a/dll/win32/dbghelp/compat.h
+++ b/dll/win32/dbghelp/compat.h
@@ -400,7 +400,7 @@ typedef struct _EXCEPTION_REGISTRATION_RECORD
 #define INVALID_HANDLE_VALUE (HANDLE)(-1)
 #define HeapAlloc __HeapAlloc
 #define HeapReAlloc __HeapReAlloc
-#define HeapFree(x,y,z) free(z) 
+#define HeapFree(x,y,z) free(z)
 #define GetProcessHeap() 1
 #define GetProcessId(x) 8
 #define lstrcpynW __lstrcpynW
@@ -422,6 +422,8 @@ typedef struct _EXCEPTION_REGISTRATION_RECORD
 #define GetCurrentDirectoryW(x, y) 0
 #define GetFileSizeEx __GetFileSizeEx
 #define ReadProcessMemory(a,b,c,d,e) 0
+#define GetCurrentProcess() (HANDLE)1
+#define IsWow64Process __IsWow64Process
 
 void* __HeapAlloc(int heap, int flags, size_t size);
 void* __HeapReAlloc(int heap, DWORD d2, void *slab, SIZE_T newsize);
@@ -432,6 +434,7 @@ void* __MapViewOfFile(HANDLE file,DWORD d1,DWORD d2,DWORD 
d3,SIZE_T s);
 BOOL __UnmapViewOfFile(const void*);
 LPSTR __lstrcpynA(LPSTR,LPCSTR,int);
 BOOL __GetFileSizeEx(HANDLE,PLARGE_INTEGER);
+BOOL WINAPI __IsWow64Process(HANDLE,BOOL*);
 #define OPEN_EXISTING  3
 #define FILE_MAP_READ SECTION_MAP_READ
 typedef struct _LDT_ENTRY {
@@ -673,7 +676,7 @@ typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
 #define SYMFLAG_PUBLIC_CODE      0x00400000
 #define UNDNAME_COMPLETE                 (0x0000)
 #define UNDNAME_NAME_ONLY                (0x1000)
-typedef struct _TI_FINDCHILDREN_PARAMS 
+typedef struct _TI_FINDCHILDREN_PARAMS
 {
     ULONG Count;
     ULONG Start;
@@ -709,7 +712,7 @@ typedef struct _SYMBOL_INFO
     ULONG       MaxNameLen;
     CHAR        Name[1];
 } SYMBOL_INFO, *PSYMBOL_INFO;
-typedef enum 
+typedef enum
 {
     SymNone = 0,
     SymCoff,
@@ -791,7 +794,7 @@ typedef BOOL (CALLBACK *PFIND_EXE_FILE_CALLBACKW)(HANDLE, 
PCWSTR, PVOID);
 #define FindExecutableImageExW __FindExecutableImageExW
 HANDLE __FindExecutableImageExW(PCWSTR, PCWSTR, PWSTR, 
PFIND_EXE_FILE_CALLBACKW, PVOID);
 DWORD WINAPI UnDecorateSymbolName(PCSTR, PSTR, DWORD, DWORD);
-typedef enum _THREAD_WRITE_FLAGS 
+typedef enum _THREAD_WRITE_FLAGS
 {
     ThreadWriteThread            = 0x0001,
     ThreadWriteStack             = 0x0002,
@@ -911,7 +914,7 @@ typedef struct _IMAGEHLP_MODULE64
 } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
 typedef DWORD   RVA;
 typedef ULONG64 RVA64;
-typedef enum _MINIDUMP_TYPE 
+typedef enum _MINIDUMP_TYPE
 {
     MiniDumpNormal                              = 0x0000,
     MiniDumpWithDataSegs                        = 0x0001,
@@ -938,7 +941,7 @@ typedef struct _MINIDUMP_THREAD_CALLBACK
     ULONG64                     StackBase;
     ULONG64                     StackEnd;
 } MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
-typedef struct _MINIDUMP_THREAD_EX_CALLBACK 
+typedef struct _MINIDUMP_THREAD_EX_CALLBACK
 {
     ULONG                       ThreadId;
     HANDLE                      ThreadHandle;
@@ -949,7 +952,7 @@ typedef struct _MINIDUMP_THREAD_EX_CALLBACK
     ULONG64                     BackingStoreBase;
     ULONG64                     BackingStoreEnd;
 } MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
-typedef struct _MINIDUMP_MODULE_CALLBACK 
+typedef struct _MINIDUMP_MODULE_CALLBACK
 {
     PWCHAR                      FullPath;
     ULONG64                     BaseOfImage;
@@ -966,16 +969,16 @@ typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK
 {
     ULONG ThreadId;
 } MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
-typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK 
+typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK
 {
     ULONG64 BaseOfImage;
 } MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
-typedef struct _MINIDUMP_CALLBACK_INPUT 
+typedef struct _MINIDUMP_CALLBACK_INPUT
 {
     ULONG                       ProcessId;
     HANDLE                      ProcessHandle;
     ULONG                       CallbackType;
-    union 
+    union
     {
         MINIDUMP_THREAD_CALLBACK        Thread;
         MINIDUMP_THREAD_EX_CALLBACK     ThreadEx;
@@ -986,7 +989,7 @@ typedef struct _MINIDUMP_CALLBACK_INPUT
 } MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
 typedef struct _MINIDUMP_CALLBACK_OUTPUT
 {
-    union 
+    union
     {
         ULONG                           ModuleWriteFlags;
         ULONG                           ThreadWriteFlags;
@@ -998,7 +1001,7 @@ typedef struct _MINIDUMP_CALLBACK_OUTPUT
     } DUMMYUNIONNAME;
 } MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
 typedef BOOL (WINAPI* MINIDUMP_CALLBACK_ROUTINE)(PVOID, const 
PMINIDUMP_CALLBACK_INPUT, PMINIDUMP_CALLBACK_OUTPUT);
-typedef struct _MINIDUMP_CALLBACK_INFORMATION 
+typedef struct _MINIDUMP_CALLBACK_INFORMATION
 {
     MINIDUMP_CALLBACK_ROUTINE   CallbackRoutine;
     void*                       CallbackParam;
@@ -1060,7 +1063,7 @@ typedef struct _STACKFRAME64
     DWORD64     Reserved[3];
     KDHELP64    KdHelp;
 } STACKFRAME64, *LPSTACKFRAME64;
-typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO 
+typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO
 {
     TI_GET_SYMTAG,
     TI_GET_SYMNAME,
@@ -1245,13 +1248,13 @@ enum SymTagEnum
    SymTagPointerType,
    SymTagArrayType,
    SymTagBaseType,
-   SymTagTypedef, 
+   SymTagTypedef,
    SymTagBaseClass,
    SymTagFriend,
-   SymTagFunctionArgType, 
-   SymTagFuncDebugStart, 
+   SymTagFunctionArgType,
+   SymTagFuncDebugStart,
    SymTagFuncDebugEnd,
-   SymTagUsingNamespace, 
+   SymTagUsingNamespace,
    SymTagVTableShape,
    SymTagVTable,
    SymTagCustom,
@@ -1867,7 +1870,7 @@ typedef enum
    THUNK_ORDINAL_ADJUSTOR,
    THUNK_ORDINAL_VCALL,
    THUNK_ORDINAL_PCODE,
-   THUNK_ORDINAL_LOAD 
+   THUNK_ORDINAL_LOAD
 } THUNK_ORDINAL;
 
 typedef enum CV_call_e
diff --git a/dll/win32/dbghelp/dbghelp.c b/dll/win32/dbghelp/dbghelp.c
index 6779e9ae98e..14eeb781637 100644
--- a/dll/win32/dbghelp/dbghelp.c
+++ b/dll/win32/dbghelp/dbghelp.c
@@ -309,6 +309,7 @@ static BOOL check_live_target(struct process* pcs)
 BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR UserSearchPath, BOOL 
fInvadeProcess)
 {
     struct process*     pcs;
+    BOOL wow64, child_wow64;
 
     TRACE("(%p %s %u)\n", hProcess, debugstr_w(UserSearchPath), 
fInvadeProcess);
 
@@ -326,6 +327,12 @@ BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR 
UserSearchPath, BOOL fInvadeP
 
     pcs->handle = hProcess;
 
+    IsWow64Process(GetCurrentProcess(), &wow64);
+
+    if (!IsWow64Process(hProcess, &child_wow64))
+        return FALSE;
+    pcs->is_64bit = (sizeof(void *) == 8 || wow64) && !child_wow64;
+
     if (UserSearchPath)
     {
         pcs->search_path = lstrcpyW(HeapAlloc(GetProcessHeap(), 0,      
diff --git a/dll/win32/dbghelp/dbghelp_private.h 
b/dll/win32/dbghelp/dbghelp_private.h
index 0d1e8e4274d..a78bd156673 100644
--- a/dll/win32/dbghelp/dbghelp_private.h
+++ b/dll/win32/dbghelp/dbghelp_private.h
@@ -415,7 +415,7 @@ struct module
     struct wine_rb_tree         sources_offsets_tree;
 };
 
-struct process 
+struct process
 {
     struct process*             next;
     HANDLE                      handle;
@@ -433,6 +433,8 @@ struct process
 
     unsigned                    buffer_size;
     void*                       buffer;
+
+    BOOL                        is_64bit;
 };
 
 struct line_info
@@ -639,11 +641,13 @@ extern void         module_reset_debug_info(struct 
module* module) DECLSPEC_HIDD
 extern BOOL         module_remove(struct process* pcs,
                                   struct module* module) DECLSPEC_HIDDEN;
 extern void         module_set_module(struct module* module, const WCHAR* 
name) DECLSPEC_HIDDEN;
-extern const WCHAR *get_wine_loader_name(void) DECLSPEC_HIDDEN;
+#ifndef __REACTOS__
+extern WCHAR *      get_wine_loader_name(struct process *pcs) DECLSPEC_HIDDEN;
+#endif
 
 /* msc.c */
 extern BOOL         pe_load_debug_directory(const struct process* pcs,
-                                            struct module* module, 
+                                            struct module* module,
                                             const BYTE* mapping,
                                             const IMAGE_SECTION_HEADER* sectp, 
DWORD nsect,
                                             const IMAGE_DEBUG_DIRECTORY* dbg, 
int nDbg) DECLSPEC_HIDDEN;
@@ -657,7 +661,7 @@ extern BOOL         pdb_virtual_unwind(struct 
cpu_stack_walk* csw, DWORD_PTR ip,
 
 /* path.c */
 extern BOOL         path_find_symbol_file(const struct process* pcs, const 
struct module* module,
-                                          PCSTR full_path, const GUID* guid, 
DWORD dw1, DWORD dw2, 
+                                          PCSTR full_path, const GUID* guid, 
DWORD dw1, DWORD dw2,
                                           PSTR buffer, BOOL* is_unmatched) 
DECLSPEC_HIDDEN;
 
 /* pe_module.c */
@@ -720,14 +724,14 @@ extern struct symt_compiland*
                     symt_new_compiland(struct module* module, unsigned long 
address,
                                        unsigned src_idx) DECLSPEC_HIDDEN;
 extern struct symt_public*
-                    symt_new_public(struct module* module, 
-                                    struct symt_compiland* parent, 
+                    symt_new_public(struct module* module,
+                                    struct symt_compiland* parent,
                                     const char* typename,
                                     BOOL is_function,
                                     unsigned long address,
                                     unsigned size) DECLSPEC_HIDDEN;
 extern struct symt_data*
-                    symt_new_global_variable(struct module* module, 
+                    symt_new_global_variable(struct module* module,
                                              struct symt_compiland* parent,
                                              const char* name, unsigned 
is_static,
                                              struct location loc, unsigned 
long size,
@@ -738,31 +742,31 @@ extern struct symt_function*
                                       const char* name,
                                       unsigned long addr, unsigned long size,
                                       struct symt* type) DECLSPEC_HIDDEN;
-extern BOOL         symt_normalize_function(struct module* module, 
+extern BOOL         symt_normalize_function(struct module* module,
                                             const struct symt_function* func) 
DECLSPEC_HIDDEN;
 extern void         symt_add_func_line(struct module* module,
-                                       struct symt_function* func, 
-                                       unsigned source_idx, int line_num, 
+                                       struct symt_function* func,
+                                       unsigned source_idx, int line_num,
                                        unsigned long offset) DECLSPEC_HIDDEN;
 extern struct symt_data*
-                    symt_add_func_local(struct module* module, 
-                                        struct symt_function* func, 
+                    symt_add_func_local(struct module* module,
+                                        struct symt_function* func,
                                         enum DataKind dt, const struct 
location* loc,
                                         struct symt_block* block,
                                         struct symt* type, const char* name) 
DECLSPEC_HIDDEN;
 extern struct symt_block*
-                    symt_open_func_block(struct module* module, 
+                    symt_open_func_block(struct module* module,
                                          struct symt_function* func,
-                                         struct symt_block* block, 
+                                         struct symt_block* block,
                                          unsigned pc, unsigned len) 
DECLSPEC_HIDDEN;
 extern struct symt_block*
-                    symt_close_func_block(struct module* module, 
+                    symt_close_func_block(struct module* module,
                                           const struct symt_function* func,
                                           struct symt_block* block, unsigned 
pc) DECLSPEC_HIDDEN;
 extern struct symt_hierarchy_point*
-                    symt_add_function_point(struct module* module, 
+                    symt_add_function_point(struct module* module,
                                             struct symt_function* func,
-                                            enum SymTagEnum point, 
+                                            enum SymTagEnum point,
                                             const struct location* loc,
                                             const char* name) DECLSPEC_HIDDEN;
 extern BOOL         symt_fill_func_line_info(const struct module* module,
@@ -770,7 +774,7 @@ extern BOOL         symt_fill_func_line_info(const struct 
module* module,
                                              DWORD64 addr, IMAGEHLP_LINE64* 
line) DECLSPEC_HIDDEN;
 extern BOOL         symt_get_func_line_next(const struct module* module, 
PIMAGEHLP_LINE64 line) DECLSPEC_HIDDEN;
 extern struct symt_thunk*
-                    symt_new_thunk(struct module* module, 
+                    symt_new_thunk(struct module* module,
                                    struct symt_compiland* parent,
                                    const char* name, THUNK_ORDINAL ord,
                                    unsigned long addr, unsigned long size) 
DECLSPEC_HIDDEN;
@@ -791,38 +795,38 @@ extern void         symt_init_basic(struct module* 
module) DECLSPEC_HIDDEN;
 extern BOOL         symt_get_info(struct module* module, const struct symt* 
type,
                                   IMAGEHLP_SYMBOL_TYPE_INFO req, void* pInfo) 
DECLSPEC_HIDDEN;
 extern struct symt_basic*
-                    symt_new_basic(struct module* module, enum BasicType, 
+                    symt_new_basic(struct module* module, enum BasicType,
                                    const char* typename, unsigned size) 
DECLSPEC_HIDDEN;
 extern struct symt_udt*
                     symt_new_udt(struct module* module, const char* typename,
                                  unsigned size, enum UdtKind kind) 
DECLSPEC_HIDDEN;
 extern BOOL         symt_set_udt_size(struct module* module,
                                       struct symt_udt* type, unsigned size) 
DECLSPEC_HIDDEN;
-extern BOOL         symt_add_udt_element(struct module* module, 
-                                         struct symt_udt* udt_type, 
+extern BOOL         symt_add_udt_element(struct module* module,
+                                         struct symt_udt* udt_type,
                                          const char* name,
-                                         struct symt* elt_type, unsigned 
offset, 
+                                         struct symt* elt_type, unsigned 
offset,
                                          unsigned size) DECLSPEC_HIDDEN;
 extern struct symt_enum*
                     symt_new_enum(struct module* module, const char* typename,
                                   struct symt* basetype) DECLSPEC_HIDDEN;
-extern BOOL         symt_add_enum_element(struct module* module, 
-                                          struct symt_enum* enum_type, 
+extern BOOL         symt_add_enum_element(struct module* module,
+                                          struct symt_enum* enum_type,
                                           const char* name, int value) 
DECLSPEC_HIDDEN;
 extern struct symt_array*
-                    symt_new_array(struct module* module, int min, int max, 
+                    symt_new_array(struct module* module, int min, int max,
                                    struct symt* base, struct symt* index) 
DECLSPEC_HIDDEN;
 extern struct symt_function_signature*
-                    symt_new_function_signature(struct module* module, 
+                    symt_new_function_signature(struct module* module,
                                                 struct symt* ret_type,
                                                 enum CV_call_e call_conv) 
DECLSPEC_HIDDEN;
 extern BOOL         symt_add_function_signature_parameter(struct module* 
module,
                                                           struct 
symt_function_signature* sig,
                                                           struct symt* param) 
DECLSPEC_HIDDEN;
 extern struct symt_pointer*
-                    symt_new_pointer(struct module* module, 
+                    symt_new_pointer(struct module* module,
                                      struct symt* ref_type,
                                      unsigned long size) DECLSPEC_HIDDEN;
 extern struct symt_typedef*
-                    symt_new_typedef(struct module* module, struct symt* ref, 
+                    symt_new_typedef(struct module* module, struct symt* ref,
                                      const char* name) DECLSPEC_HIDDEN;
diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c
index e841b1b707a..4d877b44214 100644
--- a/dll/win32/dbghelp/elf_module.c
+++ b/dll/win32/dbghelp/elf_module.c
@@ -50,6 +50,7 @@
 
 #include "wine/library.h"
 #include "wine/debug.h"
+#include "wine/heap.h"
 
 #ifdef __ELF__
 
@@ -1568,13 +1569,17 @@ static BOOL elf_enum_modules_internal(const struct 
process* 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 ))
         ReadProcessMemory( pcs->handle, &pbi.PebBaseAddress->Reserved[0], 
&base, sizeof(base), NULL );
 
-    return elf_search_and_load_file(pcs, get_wine_loader_name(), base, 0, 
elf_info);
+    ret = elf_search_and_load_file(pcs, loader, base, 0, elf_info);
+    heap_free(loader);
+    return ret;
 }
 
 /******************************************************************
diff --git a/dll/win32/dbghelp/macho_module.c b/dll/win32/dbghelp/macho_module.c
index 01fa300eff7..4018c9dbf2d 100644
--- a/dll/win32/dbghelp/macho_module.c
+++ b/dll/win32/dbghelp/macho_module.c
@@ -1703,6 +1703,7 @@ BOOL    macho_synchronize_module_list(struct process* pcs)
  */
 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;
     struct dyld_all_image_infos image_infos;
@@ -1757,7 +1758,8 @@ static BOOL macho_search_loader(struct process* pcs, 
struct macho_info* macho_in
     }
 
     if (!ret)
-        ret = macho_search_and_load_file(pcs, get_wine_loader_name(), 0, 
macho_info);
+        ret = macho_search_and_load_file(pcs, loader, 0, macho_info);
+    heap_free(loader);
     return ret;
 }
 
diff --git a/dll/win32/dbghelp/module.c b/dll/win32/dbghelp/module.c
index 2ddf3f50644..8f7150460be 100644
--- a/dll/win32/dbghelp/module.c
+++ b/dll/win32/dbghelp/module.c
@@ -149,44 +149,41 @@ void module_set_module(struct module* module, const 
WCHAR* name)
     module_fill_module(name, module->modulename, sizeof(module->modulename) / 
sizeof(module->modulename[0]));
 }
 
-const WCHAR *get_wine_loader_name(void)
+#ifndef __REACTOS__
+/* Returned string must be freed by caller */
+WCHAR *get_wine_loader_name(struct process *pcs)
 {
-    static const BOOL is_win64 = sizeof(void *) > sizeof(int); /* FIXME: 
should depend on target process */
     static const WCHAR wineW[] = {'w','i','n','e',0};
     static const WCHAR suffixW[] = {'6','4',0};
-    static const WCHAR *loader;
+    WCHAR *buffer, *p;
+    const char *env;
 
-    if (!loader)
+    /* All binaries are loaded with WINELOADER (if run from tree) or by the
+     * main executable
+     */
+    if ((env = getenv("WINELOADER")))
+    {
+        DWORD len = 2 + MultiByteToWideChar( CP_UNIXCP, 0, env, -1, NULL, 0 );
+        buffer = heap_alloc( len * sizeof(WCHAR) );
+        MultiByteToWideChar( CP_UNIXCP, 0, env, -1, buffer, len );
+    }
+    else
     {
-        WCHAR *p, *buffer;
-        const char *ptr;
+        buffer = heap_alloc( sizeof(wineW) + 2 * sizeof(WCHAR) );
+        strcpyW( buffer, wineW );
+    }
 
-        /* All binaries are loaded with WINELOADER (if run from tree) or by the
-         * main executable
-         */
-        if ((ptr = getenv("WINELOADER")))
-        {
-            DWORD len = 2 + MultiByteToWideChar( CP_UNIXCP, 0, ptr, -1, NULL, 
0 );
-            buffer = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
-            MultiByteToWideChar( CP_UNIXCP, 0, ptr, -1, buffer, len );
-        }
-        else
-        {
-            buffer = HeapAlloc( GetProcessHeap(), 0, sizeof(wineW) + 2 * 
sizeof(WCHAR) );
-            strcpyW( buffer, wineW );
-        }
-        p = buffer + strlenW( buffer ) - strlenW( suffixW );
-        if (p > buffer && !strcmpW( p, suffixW ))
-        {
-            if (!is_win64) *p = 0;
-        }
-        else if (is_win64) strcatW( buffer, suffixW );
+    p = buffer + strlenW( buffer ) - strlenW( suffixW );
+    if (p > buffer && !strcmpW( p, suffixW ))
+        *p = 0;
 
-        TRACE( "returning %s\n", debugstr_w(buffer) );
-        loader = buffer;
-    }
-    return loader;
+    if (pcs->is_64bit)
+        strcatW(buffer, suffixW);
+
+    TRACE( "returning %s\n", debugstr_w(buffer) );
+    return buffer;
 }
+#endif
 
 static const char*      get_module_type(enum module_type type, BOOL virtual)
 {
diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg
index 55c41591d34..db9fd318575 100644
--- a/sdk/tools/winesync/dbghelp.cfg
+++ b/sdk/tools/winesync/dbghelp.cfg
@@ -3,4 +3,4 @@ directories:
 files:
   include/dbghelp.h: sdk/include/psdk/dbghelp.h
 tags:
-  wine: 9b973eee9e06a3dca7a6c5739741446bf46e27f5
+  wine: a981edf0bc7c828e6b55fdc73b51a2f457043c4a

Reply via email to