mirror of
https://github.com/reactos/reactos.git
synced 2025-01-04 05:20:54 +00:00
[WINESYNC] dbghelp: Determine the wine loader name from the target process's architecture.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org> wine commit id a981edf0bc7c828e6b55fdc73b51a2f457043c4a by Zebediah Figura <zfigura@codeweavers.com>
This commit is contained in:
parent
3346544802
commit
f69be6c561
8 changed files with 112 additions and 88 deletions
|
@ -71,8 +71,8 @@ __RtlImageRvaToSection(
|
||||||
|
|
||||||
PVOID
|
PVOID
|
||||||
__RtlImageRvaToVa
|
__RtlImageRvaToVa
|
||||||
(const IMAGE_NT_HEADERS* NtHeader,
|
(const IMAGE_NT_HEADERS* NtHeader,
|
||||||
PVOID BaseAddress,
|
PVOID BaseAddress,
|
||||||
ULONG Rva,
|
ULONG Rva,
|
||||||
PIMAGE_SECTION_HEADER *SectionHeader)
|
PIMAGE_SECTION_HEADER *SectionHeader)
|
||||||
{
|
{
|
||||||
|
@ -160,7 +160,7 @@ HANDLE __CreateFileW(
|
||||||
{
|
{
|
||||||
char buf[MAX_PATH];
|
char buf[MAX_PATH];
|
||||||
HANDLE res;
|
HANDLE res;
|
||||||
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, lpFileName, -1, buf, MAX_PATH, NULL, NULL);
|
WideCharToMultiByte(CP_ACP, 0, lpFileName, -1, buf, MAX_PATH, NULL, NULL);
|
||||||
res = CreateFileA(buf, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
res = CreateFileA(buf, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||||
return res;
|
return res;
|
||||||
|
@ -187,7 +187,7 @@ void* __MapViewOfFile(HANDLE file,DWORD d1,DWORD d2,DWORD d3,SIZE_T s)
|
||||||
free(result);
|
free(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,15 +222,15 @@ __WideCharToMultiByte(UINT page, DWORD flags, LPCWSTR src, INT srclen,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srclen < 0) srclen = strlenW(src) + 1;
|
if (srclen < 0) srclen = strlenW(src) + 1;
|
||||||
|
|
||||||
if(!dstlen)
|
if(!dstlen)
|
||||||
return srclen;
|
return srclen;
|
||||||
|
|
||||||
for(i=0; i<srclen && i<dstlen; i++)
|
for(i=0; i<srclen && i<dstlen; i++)
|
||||||
dst[i] = src[i] & 0xFF;
|
dst[i] = src[i] & 0xFF;
|
||||||
|
|
||||||
if (used) *used = FALSE;
|
if (used) *used = FALSE;
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ __MultiByteToWideChar(UINT page, DWORD flags, LPCSTR src, INT srclen,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srclen < 0) srclen = strlen(src) + 1;
|
if (srclen < 0) srclen = strlen(src) + 1;
|
||||||
|
|
||||||
if(!dstlen)
|
if(!dstlen)
|
||||||
return srclen;
|
return srclen;
|
||||||
|
|
||||||
|
@ -394,3 +394,9 @@ const char *wine_dbgstr_wn( const WCHAR *str, int n )
|
||||||
*dst++ = 0;
|
*dst++ = 0;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL __IsWow64Process(HANDLE Process, BOOL* is_wow64)
|
||||||
|
{
|
||||||
|
*is_wow64 = FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
|
@ -400,7 +400,7 @@ typedef struct _EXCEPTION_REGISTRATION_RECORD
|
||||||
#define INVALID_HANDLE_VALUE (HANDLE)(-1)
|
#define INVALID_HANDLE_VALUE (HANDLE)(-1)
|
||||||
#define HeapAlloc __HeapAlloc
|
#define HeapAlloc __HeapAlloc
|
||||||
#define HeapReAlloc __HeapReAlloc
|
#define HeapReAlloc __HeapReAlloc
|
||||||
#define HeapFree(x,y,z) free(z)
|
#define HeapFree(x,y,z) free(z)
|
||||||
#define GetProcessHeap() 1
|
#define GetProcessHeap() 1
|
||||||
#define GetProcessId(x) 8
|
#define GetProcessId(x) 8
|
||||||
#define lstrcpynW __lstrcpynW
|
#define lstrcpynW __lstrcpynW
|
||||||
|
@ -422,6 +422,8 @@ typedef struct _EXCEPTION_REGISTRATION_RECORD
|
||||||
#define GetCurrentDirectoryW(x, y) 0
|
#define GetCurrentDirectoryW(x, y) 0
|
||||||
#define GetFileSizeEx __GetFileSizeEx
|
#define GetFileSizeEx __GetFileSizeEx
|
||||||
#define ReadProcessMemory(a,b,c,d,e) 0
|
#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* __HeapAlloc(int heap, int flags, size_t size);
|
||||||
void* __HeapReAlloc(int heap, DWORD d2, void *slab, SIZE_T newsize);
|
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*);
|
BOOL __UnmapViewOfFile(const void*);
|
||||||
LPSTR __lstrcpynA(LPSTR,LPCSTR,int);
|
LPSTR __lstrcpynA(LPSTR,LPCSTR,int);
|
||||||
BOOL __GetFileSizeEx(HANDLE,PLARGE_INTEGER);
|
BOOL __GetFileSizeEx(HANDLE,PLARGE_INTEGER);
|
||||||
|
BOOL WINAPI __IsWow64Process(HANDLE,BOOL*);
|
||||||
#define OPEN_EXISTING 3
|
#define OPEN_EXISTING 3
|
||||||
#define FILE_MAP_READ SECTION_MAP_READ
|
#define FILE_MAP_READ SECTION_MAP_READ
|
||||||
typedef struct _LDT_ENTRY {
|
typedef struct _LDT_ENTRY {
|
||||||
|
@ -673,7 +676,7 @@ typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
|
||||||
#define SYMFLAG_PUBLIC_CODE 0x00400000
|
#define SYMFLAG_PUBLIC_CODE 0x00400000
|
||||||
#define UNDNAME_COMPLETE (0x0000)
|
#define UNDNAME_COMPLETE (0x0000)
|
||||||
#define UNDNAME_NAME_ONLY (0x1000)
|
#define UNDNAME_NAME_ONLY (0x1000)
|
||||||
typedef struct _TI_FINDCHILDREN_PARAMS
|
typedef struct _TI_FINDCHILDREN_PARAMS
|
||||||
{
|
{
|
||||||
ULONG Count;
|
ULONG Count;
|
||||||
ULONG Start;
|
ULONG Start;
|
||||||
|
@ -709,7 +712,7 @@ typedef struct _SYMBOL_INFO
|
||||||
ULONG MaxNameLen;
|
ULONG MaxNameLen;
|
||||||
CHAR Name[1];
|
CHAR Name[1];
|
||||||
} SYMBOL_INFO, *PSYMBOL_INFO;
|
} SYMBOL_INFO, *PSYMBOL_INFO;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
SymNone = 0,
|
SymNone = 0,
|
||||||
SymCoff,
|
SymCoff,
|
||||||
|
@ -791,7 +794,7 @@ typedef BOOL (CALLBACK *PFIND_EXE_FILE_CALLBACKW)(HANDLE, PCWSTR, PVOID);
|
||||||
#define FindExecutableImageExW __FindExecutableImageExW
|
#define FindExecutableImageExW __FindExecutableImageExW
|
||||||
HANDLE __FindExecutableImageExW(PCWSTR, PCWSTR, PWSTR, PFIND_EXE_FILE_CALLBACKW, PVOID);
|
HANDLE __FindExecutableImageExW(PCWSTR, PCWSTR, PWSTR, PFIND_EXE_FILE_CALLBACKW, PVOID);
|
||||||
DWORD WINAPI UnDecorateSymbolName(PCSTR, PSTR, DWORD, DWORD);
|
DWORD WINAPI UnDecorateSymbolName(PCSTR, PSTR, DWORD, DWORD);
|
||||||
typedef enum _THREAD_WRITE_FLAGS
|
typedef enum _THREAD_WRITE_FLAGS
|
||||||
{
|
{
|
||||||
ThreadWriteThread = 0x0001,
|
ThreadWriteThread = 0x0001,
|
||||||
ThreadWriteStack = 0x0002,
|
ThreadWriteStack = 0x0002,
|
||||||
|
@ -911,7 +914,7 @@ typedef struct _IMAGEHLP_MODULE64
|
||||||
} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
|
} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
|
||||||
typedef DWORD RVA;
|
typedef DWORD RVA;
|
||||||
typedef ULONG64 RVA64;
|
typedef ULONG64 RVA64;
|
||||||
typedef enum _MINIDUMP_TYPE
|
typedef enum _MINIDUMP_TYPE
|
||||||
{
|
{
|
||||||
MiniDumpNormal = 0x0000,
|
MiniDumpNormal = 0x0000,
|
||||||
MiniDumpWithDataSegs = 0x0001,
|
MiniDumpWithDataSegs = 0x0001,
|
||||||
|
@ -938,7 +941,7 @@ typedef struct _MINIDUMP_THREAD_CALLBACK
|
||||||
ULONG64 StackBase;
|
ULONG64 StackBase;
|
||||||
ULONG64 StackEnd;
|
ULONG64 StackEnd;
|
||||||
} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
|
} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
|
||||||
typedef struct _MINIDUMP_THREAD_EX_CALLBACK
|
typedef struct _MINIDUMP_THREAD_EX_CALLBACK
|
||||||
{
|
{
|
||||||
ULONG ThreadId;
|
ULONG ThreadId;
|
||||||
HANDLE ThreadHandle;
|
HANDLE ThreadHandle;
|
||||||
|
@ -949,7 +952,7 @@ typedef struct _MINIDUMP_THREAD_EX_CALLBACK
|
||||||
ULONG64 BackingStoreBase;
|
ULONG64 BackingStoreBase;
|
||||||
ULONG64 BackingStoreEnd;
|
ULONG64 BackingStoreEnd;
|
||||||
} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
|
} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
|
||||||
typedef struct _MINIDUMP_MODULE_CALLBACK
|
typedef struct _MINIDUMP_MODULE_CALLBACK
|
||||||
{
|
{
|
||||||
PWCHAR FullPath;
|
PWCHAR FullPath;
|
||||||
ULONG64 BaseOfImage;
|
ULONG64 BaseOfImage;
|
||||||
|
@ -966,16 +969,16 @@ typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK
|
||||||
{
|
{
|
||||||
ULONG ThreadId;
|
ULONG ThreadId;
|
||||||
} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
|
} MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
|
||||||
typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK
|
typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK
|
||||||
{
|
{
|
||||||
ULONG64 BaseOfImage;
|
ULONG64 BaseOfImage;
|
||||||
} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
|
} MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
|
||||||
typedef struct _MINIDUMP_CALLBACK_INPUT
|
typedef struct _MINIDUMP_CALLBACK_INPUT
|
||||||
{
|
{
|
||||||
ULONG ProcessId;
|
ULONG ProcessId;
|
||||||
HANDLE ProcessHandle;
|
HANDLE ProcessHandle;
|
||||||
ULONG CallbackType;
|
ULONG CallbackType;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
MINIDUMP_THREAD_CALLBACK Thread;
|
MINIDUMP_THREAD_CALLBACK Thread;
|
||||||
MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
|
MINIDUMP_THREAD_EX_CALLBACK ThreadEx;
|
||||||
|
@ -986,7 +989,7 @@ typedef struct _MINIDUMP_CALLBACK_INPUT
|
||||||
} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
|
} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
|
||||||
typedef struct _MINIDUMP_CALLBACK_OUTPUT
|
typedef struct _MINIDUMP_CALLBACK_OUTPUT
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
ULONG ModuleWriteFlags;
|
ULONG ModuleWriteFlags;
|
||||||
ULONG ThreadWriteFlags;
|
ULONG ThreadWriteFlags;
|
||||||
|
@ -998,7 +1001,7 @@ typedef struct _MINIDUMP_CALLBACK_OUTPUT
|
||||||
} DUMMYUNIONNAME;
|
} DUMMYUNIONNAME;
|
||||||
} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
|
} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
|
||||||
typedef BOOL (WINAPI* MINIDUMP_CALLBACK_ROUTINE)(PVOID, const PMINIDUMP_CALLBACK_INPUT, 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;
|
MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;
|
||||||
void* CallbackParam;
|
void* CallbackParam;
|
||||||
|
@ -1060,7 +1063,7 @@ typedef struct _STACKFRAME64
|
||||||
DWORD64 Reserved[3];
|
DWORD64 Reserved[3];
|
||||||
KDHELP64 KdHelp;
|
KDHELP64 KdHelp;
|
||||||
} STACKFRAME64, *LPSTACKFRAME64;
|
} STACKFRAME64, *LPSTACKFRAME64;
|
||||||
typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO
|
typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO
|
||||||
{
|
{
|
||||||
TI_GET_SYMTAG,
|
TI_GET_SYMTAG,
|
||||||
TI_GET_SYMNAME,
|
TI_GET_SYMNAME,
|
||||||
|
@ -1245,13 +1248,13 @@ enum SymTagEnum
|
||||||
SymTagPointerType,
|
SymTagPointerType,
|
||||||
SymTagArrayType,
|
SymTagArrayType,
|
||||||
SymTagBaseType,
|
SymTagBaseType,
|
||||||
SymTagTypedef,
|
SymTagTypedef,
|
||||||
SymTagBaseClass,
|
SymTagBaseClass,
|
||||||
SymTagFriend,
|
SymTagFriend,
|
||||||
SymTagFunctionArgType,
|
SymTagFunctionArgType,
|
||||||
SymTagFuncDebugStart,
|
SymTagFuncDebugStart,
|
||||||
SymTagFuncDebugEnd,
|
SymTagFuncDebugEnd,
|
||||||
SymTagUsingNamespace,
|
SymTagUsingNamespace,
|
||||||
SymTagVTableShape,
|
SymTagVTableShape,
|
||||||
SymTagVTable,
|
SymTagVTable,
|
||||||
SymTagCustom,
|
SymTagCustom,
|
||||||
|
@ -1867,7 +1870,7 @@ typedef enum
|
||||||
THUNK_ORDINAL_ADJUSTOR,
|
THUNK_ORDINAL_ADJUSTOR,
|
||||||
THUNK_ORDINAL_VCALL,
|
THUNK_ORDINAL_VCALL,
|
||||||
THUNK_ORDINAL_PCODE,
|
THUNK_ORDINAL_PCODE,
|
||||||
THUNK_ORDINAL_LOAD
|
THUNK_ORDINAL_LOAD
|
||||||
} THUNK_ORDINAL;
|
} THUNK_ORDINAL;
|
||||||
|
|
||||||
typedef enum CV_call_e
|
typedef enum CV_call_e
|
||||||
|
|
|
@ -309,6 +309,7 @@ static BOOL check_live_target(struct process* pcs)
|
||||||
BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess)
|
BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess)
|
||||||
{
|
{
|
||||||
struct process* pcs;
|
struct process* pcs;
|
||||||
|
BOOL wow64, child_wow64;
|
||||||
|
|
||||||
TRACE("(%p %s %u)\n", hProcess, debugstr_w(UserSearchPath), fInvadeProcess);
|
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;
|
pcs->handle = hProcess;
|
||||||
|
|
||||||
|
IsWow64Process(GetCurrentProcess(), &wow64);
|
||||||
|
|
||||||
|
if (!IsWow64Process(hProcess, &child_wow64))
|
||||||
|
return FALSE;
|
||||||
|
pcs->is_64bit = (sizeof(void *) == 8 || wow64) && !child_wow64;
|
||||||
|
|
||||||
if (UserSearchPath)
|
if (UserSearchPath)
|
||||||
{
|
{
|
||||||
pcs->search_path = lstrcpyW(HeapAlloc(GetProcessHeap(), 0,
|
pcs->search_path = lstrcpyW(HeapAlloc(GetProcessHeap(), 0,
|
||||||
|
|
|
@ -415,7 +415,7 @@ struct module
|
||||||
struct wine_rb_tree sources_offsets_tree;
|
struct wine_rb_tree sources_offsets_tree;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct process
|
struct process
|
||||||
{
|
{
|
||||||
struct process* next;
|
struct process* next;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
|
@ -433,6 +433,8 @@ struct process
|
||||||
|
|
||||||
unsigned buffer_size;
|
unsigned buffer_size;
|
||||||
void* buffer;
|
void* buffer;
|
||||||
|
|
||||||
|
BOOL is_64bit;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct line_info
|
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,
|
extern BOOL module_remove(struct process* pcs,
|
||||||
struct module* module) DECLSPEC_HIDDEN;
|
struct module* module) DECLSPEC_HIDDEN;
|
||||||
extern void module_set_module(struct module* module, const WCHAR* name) 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 */
|
/* msc.c */
|
||||||
extern BOOL pe_load_debug_directory(const struct process* pcs,
|
extern BOOL pe_load_debug_directory(const struct process* pcs,
|
||||||
struct module* module,
|
struct module* module,
|
||||||
const BYTE* mapping,
|
const BYTE* mapping,
|
||||||
const IMAGE_SECTION_HEADER* sectp, DWORD nsect,
|
const IMAGE_SECTION_HEADER* sectp, DWORD nsect,
|
||||||
const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg) DECLSPEC_HIDDEN;
|
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 */
|
/* path.c */
|
||||||
extern BOOL path_find_symbol_file(const struct process* pcs, const struct module* module,
|
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;
|
PSTR buffer, BOOL* is_unmatched) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* pe_module.c */
|
/* pe_module.c */
|
||||||
|
@ -720,14 +724,14 @@ extern struct symt_compiland*
|
||||||
symt_new_compiland(struct module* module, unsigned long address,
|
symt_new_compiland(struct module* module, unsigned long address,
|
||||||
unsigned src_idx) DECLSPEC_HIDDEN;
|
unsigned src_idx) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_public*
|
extern struct symt_public*
|
||||||
symt_new_public(struct module* module,
|
symt_new_public(struct module* module,
|
||||||
struct symt_compiland* parent,
|
struct symt_compiland* parent,
|
||||||
const char* typename,
|
const char* typename,
|
||||||
BOOL is_function,
|
BOOL is_function,
|
||||||
unsigned long address,
|
unsigned long address,
|
||||||
unsigned size) DECLSPEC_HIDDEN;
|
unsigned size) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_data*
|
extern struct symt_data*
|
||||||
symt_new_global_variable(struct module* module,
|
symt_new_global_variable(struct module* module,
|
||||||
struct symt_compiland* parent,
|
struct symt_compiland* parent,
|
||||||
const char* name, unsigned is_static,
|
const char* name, unsigned is_static,
|
||||||
struct location loc, unsigned long size,
|
struct location loc, unsigned long size,
|
||||||
|
@ -738,31 +742,31 @@ extern struct symt_function*
|
||||||
const char* name,
|
const char* name,
|
||||||
unsigned long addr, unsigned long size,
|
unsigned long addr, unsigned long size,
|
||||||
struct symt* type) DECLSPEC_HIDDEN;
|
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;
|
const struct symt_function* func) DECLSPEC_HIDDEN;
|
||||||
extern void symt_add_func_line(struct module* module,
|
extern void symt_add_func_line(struct module* module,
|
||||||
struct symt_function* func,
|
struct symt_function* func,
|
||||||
unsigned source_idx, int line_num,
|
unsigned source_idx, int line_num,
|
||||||
unsigned long offset) DECLSPEC_HIDDEN;
|
unsigned long offset) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_data*
|
extern struct symt_data*
|
||||||
symt_add_func_local(struct module* module,
|
symt_add_func_local(struct module* module,
|
||||||
struct symt_function* func,
|
struct symt_function* func,
|
||||||
enum DataKind dt, const struct location* loc,
|
enum DataKind dt, const struct location* loc,
|
||||||
struct symt_block* block,
|
struct symt_block* block,
|
||||||
struct symt* type, const char* name) DECLSPEC_HIDDEN;
|
struct symt* type, const char* name) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_block*
|
extern struct symt_block*
|
||||||
symt_open_func_block(struct module* module,
|
symt_open_func_block(struct module* module,
|
||||||
struct symt_function* func,
|
struct symt_function* func,
|
||||||
struct symt_block* block,
|
struct symt_block* block,
|
||||||
unsigned pc, unsigned len) DECLSPEC_HIDDEN;
|
unsigned pc, unsigned len) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_block*
|
extern struct symt_block*
|
||||||
symt_close_func_block(struct module* module,
|
symt_close_func_block(struct module* module,
|
||||||
const struct symt_function* func,
|
const struct symt_function* func,
|
||||||
struct symt_block* block, unsigned pc) DECLSPEC_HIDDEN;
|
struct symt_block* block, unsigned pc) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_hierarchy_point*
|
extern struct symt_hierarchy_point*
|
||||||
symt_add_function_point(struct module* module,
|
symt_add_function_point(struct module* module,
|
||||||
struct symt_function* func,
|
struct symt_function* func,
|
||||||
enum SymTagEnum point,
|
enum SymTagEnum point,
|
||||||
const struct location* loc,
|
const struct location* loc,
|
||||||
const char* name) DECLSPEC_HIDDEN;
|
const char* name) DECLSPEC_HIDDEN;
|
||||||
extern BOOL symt_fill_func_line_info(const struct module* module,
|
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;
|
DWORD64 addr, IMAGEHLP_LINE64* line) DECLSPEC_HIDDEN;
|
||||||
extern BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line) DECLSPEC_HIDDEN;
|
extern BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_thunk*
|
extern struct symt_thunk*
|
||||||
symt_new_thunk(struct module* module,
|
symt_new_thunk(struct module* module,
|
||||||
struct symt_compiland* parent,
|
struct symt_compiland* parent,
|
||||||
const char* name, THUNK_ORDINAL ord,
|
const char* name, THUNK_ORDINAL ord,
|
||||||
unsigned long addr, unsigned long size) DECLSPEC_HIDDEN;
|
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,
|
extern BOOL symt_get_info(struct module* module, const struct symt* type,
|
||||||
IMAGEHLP_SYMBOL_TYPE_INFO req, void* pInfo) DECLSPEC_HIDDEN;
|
IMAGEHLP_SYMBOL_TYPE_INFO req, void* pInfo) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_basic*
|
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;
|
const char* typename, unsigned size) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_udt*
|
extern struct symt_udt*
|
||||||
symt_new_udt(struct module* module, const char* typename,
|
symt_new_udt(struct module* module, const char* typename,
|
||||||
unsigned size, enum UdtKind kind) DECLSPEC_HIDDEN;
|
unsigned size, enum UdtKind kind) DECLSPEC_HIDDEN;
|
||||||
extern BOOL symt_set_udt_size(struct module* module,
|
extern BOOL symt_set_udt_size(struct module* module,
|
||||||
struct symt_udt* type, unsigned size) DECLSPEC_HIDDEN;
|
struct symt_udt* type, unsigned size) DECLSPEC_HIDDEN;
|
||||||
extern BOOL symt_add_udt_element(struct module* module,
|
extern BOOL symt_add_udt_element(struct module* module,
|
||||||
struct symt_udt* udt_type,
|
struct symt_udt* udt_type,
|
||||||
const char* name,
|
const char* name,
|
||||||
struct symt* elt_type, unsigned offset,
|
struct symt* elt_type, unsigned offset,
|
||||||
unsigned size) DECLSPEC_HIDDEN;
|
unsigned size) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_enum*
|
extern struct symt_enum*
|
||||||
symt_new_enum(struct module* module, const char* typename,
|
symt_new_enum(struct module* module, const char* typename,
|
||||||
struct symt* basetype) DECLSPEC_HIDDEN;
|
struct symt* basetype) DECLSPEC_HIDDEN;
|
||||||
extern BOOL symt_add_enum_element(struct module* module,
|
extern BOOL symt_add_enum_element(struct module* module,
|
||||||
struct symt_enum* enum_type,
|
struct symt_enum* enum_type,
|
||||||
const char* name, int value) DECLSPEC_HIDDEN;
|
const char* name, int value) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_array*
|
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;
|
struct symt* base, struct symt* index) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_function_signature*
|
extern struct symt_function_signature*
|
||||||
symt_new_function_signature(struct module* module,
|
symt_new_function_signature(struct module* module,
|
||||||
struct symt* ret_type,
|
struct symt* ret_type,
|
||||||
enum CV_call_e call_conv) DECLSPEC_HIDDEN;
|
enum CV_call_e call_conv) DECLSPEC_HIDDEN;
|
||||||
extern BOOL symt_add_function_signature_parameter(struct module* module,
|
extern BOOL symt_add_function_signature_parameter(struct module* module,
|
||||||
struct symt_function_signature* sig,
|
struct symt_function_signature* sig,
|
||||||
struct symt* param) DECLSPEC_HIDDEN;
|
struct symt* param) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_pointer*
|
extern struct symt_pointer*
|
||||||
symt_new_pointer(struct module* module,
|
symt_new_pointer(struct module* module,
|
||||||
struct symt* ref_type,
|
struct symt* ref_type,
|
||||||
unsigned long size) DECLSPEC_HIDDEN;
|
unsigned long size) DECLSPEC_HIDDEN;
|
||||||
extern struct symt_typedef*
|
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;
|
const char* name) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
|
|
||||||
#include "wine/library.h"
|
#include "wine/library.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "wine/heap.h"
|
||||||
|
|
||||||
#ifdef __ELF__
|
#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)
|
static BOOL elf_search_loader(struct process* pcs, struct elf_info* elf_info)
|
||||||
{
|
{
|
||||||
|
WCHAR *loader = get_wine_loader_name(pcs);
|
||||||
PROCESS_BASIC_INFORMATION pbi;
|
PROCESS_BASIC_INFORMATION pbi;
|
||||||
ULONG_PTR base = 0;
|
ULONG_PTR base = 0;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
if (!NtQueryInformationProcess( pcs->handle, ProcessBasicInformation, &pbi, sizeof(pbi), NULL ))
|
if (!NtQueryInformationProcess( pcs->handle, ProcessBasicInformation, &pbi, sizeof(pbi), NULL ))
|
||||||
ReadProcessMemory( pcs->handle, &pbi.PebBaseAddress->Reserved[0], &base, sizeof(base), 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
|
|
|
@ -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)
|
static BOOL macho_search_loader(struct process* pcs, struct macho_info* macho_info)
|
||||||
{
|
{
|
||||||
|
WCHAR *loader = get_wine_loader_name(pcs);
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
ULONG_PTR dyld_image_info_address;
|
ULONG_PTR dyld_image_info_address;
|
||||||
struct dyld_all_image_infos image_infos;
|
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)
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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]));
|
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 wineW[] = {'w','i','n','e',0};
|
||||||
static const WCHAR suffixW[] = {'6','4',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")))
|
||||||
{
|
{
|
||||||
WCHAR *p, *buffer;
|
DWORD len = 2 + MultiByteToWideChar( CP_UNIXCP, 0, env, -1, NULL, 0 );
|
||||||
const char *ptr;
|
buffer = heap_alloc( len * sizeof(WCHAR) );
|
||||||
|
MultiByteToWideChar( CP_UNIXCP, 0, env, -1, buffer, len );
|
||||||
/* 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 );
|
|
||||||
|
|
||||||
TRACE( "returning %s\n", debugstr_w(buffer) );
|
|
||||||
loader = buffer;
|
|
||||||
}
|
}
|
||||||
return loader;
|
else
|
||||||
|
{
|
||||||
|
buffer = heap_alloc( sizeof(wineW) + 2 * sizeof(WCHAR) );
|
||||||
|
strcpyW( buffer, wineW );
|
||||||
|
}
|
||||||
|
|
||||||
|
p = buffer + strlenW( buffer ) - strlenW( suffixW );
|
||||||
|
if (p > buffer && !strcmpW( p, suffixW ))
|
||||||
|
*p = 0;
|
||||||
|
|
||||||
|
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)
|
static const char* get_module_type(enum module_type type, BOOL virtual)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,4 +3,4 @@ directories:
|
||||||
files:
|
files:
|
||||||
include/dbghelp.h: sdk/include/psdk/dbghelp.h
|
include/dbghelp.h: sdk/include/psdk/dbghelp.h
|
||||||
tags:
|
tags:
|
||||||
wine: 9b973eee9e06a3dca7a6c5739741446bf46e27f5
|
wine: a981edf0bc7c828e6b55fdc73b51a2f457043c4a
|
||||||
|
|
Loading…
Reference in a new issue