dbghelp: Add a helper function to determine the name of the wine loader.
This commit is contained in:
parent
22cd7e0e5e
commit
3bae7d0383
|
@ -528,7 +528,6 @@ extern BOOL macho_synchronize_module_list(struct process* pcs);
|
||||||
/* module.c */
|
/* module.c */
|
||||||
extern const WCHAR S_ElfW[];
|
extern const WCHAR S_ElfW[];
|
||||||
extern const WCHAR S_WineLoaderW[];
|
extern const WCHAR S_WineLoaderW[];
|
||||||
extern const WCHAR S_WineW[];
|
|
||||||
extern const WCHAR S_SlashW[];
|
extern const WCHAR S_SlashW[];
|
||||||
|
|
||||||
extern struct module*
|
extern struct module*
|
||||||
|
@ -555,6 +554,7 @@ extern void module_reset_debug_info(struct module* module);
|
||||||
extern BOOL module_remove(struct process* pcs,
|
extern BOOL module_remove(struct process* pcs,
|
||||||
struct module* module);
|
struct module* module);
|
||||||
extern void module_set_module(struct module* module, const WCHAR* name);
|
extern void module_set_module(struct module* module, const WCHAR* name);
|
||||||
|
extern const WCHAR *get_wine_loader_name(void);
|
||||||
|
|
||||||
/* msc.c */
|
/* msc.c */
|
||||||
extern BOOL pe_load_debug_directory(const struct process* pcs,
|
extern BOOL pe_load_debug_directory(const struct process* pcs,
|
||||||
|
|
|
@ -1458,23 +1458,7 @@ 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)
|
||||||
{
|
{
|
||||||
BOOL ret;
|
return elf_search_and_load_file(pcs, get_wine_loader_name(), 0, 0, elf_info);
|
||||||
const char* ptr;
|
|
||||||
|
|
||||||
/* All binaries are loaded with WINELOADER (if run from tree) or by the
|
|
||||||
* main executable
|
|
||||||
*/
|
|
||||||
if ((ptr = getenv("WINELOADER")))
|
|
||||||
{
|
|
||||||
WCHAR tmp[MAX_PATH];
|
|
||||||
MultiByteToWideChar(CP_ACP, 0, ptr, -1, tmp, sizeof(tmp) / sizeof(WCHAR));
|
|
||||||
ret = elf_search_and_load_file(pcs, tmp, 0, 0, elf_info);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = elf_search_and_load_file(pcs, S_WineW, 0, 0, elf_info);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
|
|
|
@ -1274,25 +1274,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)
|
||||||
{
|
{
|
||||||
BOOL ret;
|
return macho_search_and_load_file(pcs, get_wine_loader_name(), 0, macho_info);
|
||||||
const char* ptr;
|
|
||||||
|
|
||||||
TRACE("(%p/%p, %p)\n", pcs, pcs->handle, macho_info);
|
|
||||||
|
|
||||||
/* All binaries are loaded with WINELOADER (if run from tree) or by the
|
|
||||||
* main executable
|
|
||||||
*/
|
|
||||||
if ((ptr = getenv("WINELOADER")))
|
|
||||||
{
|
|
||||||
WCHAR tmp[MAX_PATH];
|
|
||||||
MultiByteToWideChar(CP_UNIXCP, 0, ptr, -1, tmp, sizeof(tmp) / sizeof(WCHAR));
|
|
||||||
ret = macho_search_and_load_file(pcs, tmp, 0, macho_info);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = macho_search_and_load_file(pcs, S_WineW, 0, macho_info);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
|
|
|
@ -38,7 +38,6 @@ static const WCHAR S_DotSoW[] = {'.','s','o','\0'};
|
||||||
static const WCHAR S_DotDylibW[] = {'.','d','y','l','i','b','\0'};
|
static const WCHAR S_DotDylibW[] = {'.','d','y','l','i','b','\0'};
|
||||||
static const WCHAR S_DotPdbW[] = {'.','p','d','b','\0'};
|
static const WCHAR S_DotPdbW[] = {'.','p','d','b','\0'};
|
||||||
static const WCHAR S_DotDbgW[] = {'.','d','b','g','\0'};
|
static const WCHAR S_DotDbgW[] = {'.','d','b','g','\0'};
|
||||||
const WCHAR S_WineW[] = {'w','i','n','e',0};
|
|
||||||
const WCHAR S_SlashW[] = {'/','\0'};
|
const WCHAR S_SlashW[] = {'/','\0'};
|
||||||
|
|
||||||
static const WCHAR S_AcmW[] = {'.','a','c','m','\0'};
|
static const WCHAR S_AcmW[] = {'.','a','c','m','\0'};
|
||||||
|
@ -78,6 +77,7 @@ static const WCHAR* get_filename(const WCHAR* name, const WCHAR* endptr)
|
||||||
|
|
||||||
static void module_fill_module(const WCHAR* in, WCHAR* out, size_t size)
|
static void module_fill_module(const WCHAR* in, WCHAR* out, size_t size)
|
||||||
{
|
{
|
||||||
|
const WCHAR *loader = get_wine_loader_name();
|
||||||
const WCHAR *ptr, *endptr;
|
const WCHAR *ptr, *endptr;
|
||||||
size_t len, l;
|
size_t len, l;
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ static void module_fill_module(const WCHAR* in, WCHAR* out, size_t size)
|
||||||
out[len] = '\0';
|
out[len] = '\0';
|
||||||
if (len > 4 && (l = match_ext(out, len)))
|
if (len > 4 && (l = match_ext(out, len)))
|
||||||
out[len - l] = '\0';
|
out[len - l] = '\0';
|
||||||
else if (len > 4 && !strcmpiW(out + len - 4, S_WineW))
|
else if (len > strlenW(loader) && !strcmpiW(out + len - strlenW(loader), loader))
|
||||||
lstrcpynW(out, S_WineLoaderW, size);
|
lstrcpynW(out, S_WineLoaderW, size);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -106,6 +106,29 @@ void module_set_module(struct module* module, const WCHAR* name)
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const WCHAR *get_wine_loader_name(void)
|
||||||
|
{
|
||||||
|
static const WCHAR wineW[] = {'w','i','n','e',0};
|
||||||
|
static const WCHAR *loader;
|
||||||
|
const char *ptr;
|
||||||
|
|
||||||
|
if (!loader)
|
||||||
|
{
|
||||||
|
/* All binaries are loaded with WINELOADER (if run from tree) or by the
|
||||||
|
* main executable
|
||||||
|
*/
|
||||||
|
if ((ptr = getenv("WINELOADER")))
|
||||||
|
{
|
||||||
|
DWORD len = MultiByteToWideChar( CP_UNIXCP, 0, ptr, -1, NULL, 0 );
|
||||||
|
WCHAR *buffer = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
|
||||||
|
MultiByteToWideChar( CP_UNIXCP, 0, ptr, -1, buffer, len );
|
||||||
|
loader = buffer;
|
||||||
|
}
|
||||||
|
else loader = wineW;
|
||||||
|
}
|
||||||
|
return loader;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* get_module_type(enum module_type type, BOOL virtual)
|
static const char* get_module_type(enum module_type type, BOOL virtual)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -417,7 +440,8 @@ static BOOL module_is_container_loaded(const struct process* pcs,
|
||||||
*/
|
*/
|
||||||
enum module_type module_get_type_by_name(const WCHAR* name)
|
enum module_type module_get_type_by_name(const WCHAR* name)
|
||||||
{
|
{
|
||||||
int len = strlenW(name);
|
int loader_len, len = strlenW(name);
|
||||||
|
const WCHAR *loader;
|
||||||
|
|
||||||
/* Skip all version extensions (.[digits]) regex: "(\.\d+)*$" */
|
/* Skip all version extensions (.[digits]) regex: "(\.\d+)*$" */
|
||||||
do
|
do
|
||||||
|
@ -452,7 +476,10 @@ enum module_type module_get_type_by_name(const WCHAR* name)
|
||||||
return DMT_DBG;
|
return DMT_DBG;
|
||||||
|
|
||||||
/* wine is also a native module (Mach-O on Mac OS X, ELF elsewhere) */
|
/* wine is also a native module (Mach-O on Mac OS X, ELF elsewhere) */
|
||||||
if (((len > 4 && name[len - 5] == '/') || len == 4) && !strcmpiW(name + len - 4, S_WineW))
|
loader = get_wine_loader_name();
|
||||||
|
loader_len = strlenW( loader );
|
||||||
|
if ((len == loader_len || (len > loader_len && name[len - loader_len - 1] == '/')) &&
|
||||||
|
!strcmpiW(name + len - loader_len, loader))
|
||||||
{
|
{
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
return DMT_MACHO;
|
return DMT_MACHO;
|
||||||
|
|
Loading…
Reference in New Issue