From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/winedbg/info.c | 54 +++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 15 deletions(-)
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index 1fde9641fa1..3e3d2e5c9a3 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -150,7 +150,7 @@ static const char* get_symtype_str(const WINE_IMAGEHLP_MODULEW64* mi) }
enum module_kind {MODKIND_SYSTEM = 0x00, MODKIND_ELF = 0x01, MODKIND_MACHO = 0x02, - MODKIND_PE = 0x10, MODKIND_PE_FAKEDLL = 0x11, + MODKIND_PE = 0x10, MODKIND_PE_FAKEDLL = 0x11, MODKIND_PE_NATIVE = 0x12, MODKIND_PE_BUILTIN = 0x13, MODKIND_ERROR = 0x80};
static inline enum module_kind modkind_get_family(enum module_kind mk) @@ -186,6 +186,32 @@ static const char* get_machine_str(DWORD machine) } }
+static const char builtin_signature[] = "Wine builtin DLL"; +static const char fakedll_signature[] = "Wine placeholder DLL"; + +static enum module_kind get_pe_module_kind(const struct info_module* module) +{ + char tmp[sizeof(IMAGE_DOS_HEADER) + 32]; + + if (dbg_read_memory((void*)(ULONG_PTR)module->mi.BaseOfImage, tmp, sizeof(tmp))) + { + const IMAGE_DOS_HEADER* dosh = (IMAGE_DOS_HEADER*)tmp; + if (dosh->e_magic == IMAGE_DOS_SIGNATURE) + { + SIZE_T len = dosh->e_lfanew; + if (len >= sizeof(IMAGE_DOS_HEADER) + 32) + { + if (!strcmp((char*)(dosh + 1), builtin_signature)) + return MODKIND_PE_BUILTIN; + if (!strcmp((char*)(dosh + 1), fakedll_signature)) + return MODKIND_PE_FAKEDLL; + } + return MODKIND_PE_NATIVE; + } + } + return MODKIND_ERROR; +} + static void module_print_info(const struct info_module *module, BOOL is_embedded, BOOL multi_machine) { if (multi_machine) @@ -227,8 +253,10 @@ static inline const char* module_get_type_name(const struct info_module* mod) case MODKIND_SYSTEM: return "System"; case MODKIND_ELF: return "ELF"; case MODKIND_MACHO: return "Mach-O"; - case MODKIND_PE_FAKEDLL: + case MODKIND_PE_NATIVE: case MODKIND_PE: return "PE"; + case MODKIND_PE_FAKEDLL: + case MODKIND_PE_BUILTIN: return "PE-Wine"; case MODKIND_ERROR: break; } return ""; @@ -254,9 +282,9 @@ static BOOL CALLBACK info_mod_cb(PCSTR mod_name, DWORD64 base, PVOID ctx)
switch (mod->mi.SystemModule) { - case WINE_SYSMODULE_ELF: mod->kind = MODKIND_ELF; break; - case WINE_SYSMODULE_MACHO: mod->kind = MODKIND_MACHO; break; - case WINE_SYSMODULE_NONE: mod->kind = MODKIND_PE; break; + case WINE_SYSMODULE_ELF: mod->kind = MODKIND_ELF; break; + case WINE_SYSMODULE_MACHO: mod->kind = MODKIND_MACHO; break; + case WINE_SYSMODULE_NONE: mod->kind = get_pe_module_kind(mod); break; } lstrcpynA(mod->name, mod_name, dst_len); mod->name[dst_len] = 0; @@ -314,36 +342,32 @@ void info_win32_module(DWORD64 base, BOOL multi_machine)
for (i = 0; i < im.num_used; i++) { + enum module_kind mod_family = modkind_get_family(im.modules[i].kind); if (base && (base < im.modules[i].mi.BaseOfImage || base >= im.modules[i].mi.BaseOfImage + im.modules[i].mi.ImageSize)) continue; if (!multi_machine && machine != im.modules[i].mi.MachineType) continue; - if (modkind_get_family(im.modules[i].kind) == MODKIND_SYSTEM) + if (mod_family == MODKIND_SYSTEM) { dbg_printf("%s\t", module_get_type_name(&im.modules[i])); module_print_info(&im.modules[i], FALSE, multi_machine); /* print all modules embedded in this one */ for (j = 0; j < im.num_used; j++) { - if (modkind_get_family(im.modules[j].kind) == MODKIND_PE && module_is_container(&im.modules[i], &im.modules[j])) + if (modkind_get_family(im.modules[j].kind) == MODKIND_PE_FAKEDLL && module_is_container(&im.modules[i], &im.modules[j])) { dbg_printf(" \-PE\t"); module_print_info(&im.modules[j], TRUE, multi_machine); } } } - else + else if (mod_family == MODKIND_PE && im.modules[i].kind != MODKIND_PE_FAKEDLL) { - /* check module is not embedded in another module */ - for (j = 0; j < im.num_used; j++) - { - if (modkind_get_family(im.modules[j].kind) == MODKIND_SYSTEM && module_is_container(&im.modules[j], &im.modules[i])) - break; - } - if (j < im.num_used) continue; dbg_printf("%s\t", module_get_type_name(&im.modules[i])); module_print_info(&im.modules[i], FALSE, multi_machine); } + else continue; + num_printed++; } free(im.modules);