From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/dbghelp/dbghelp_private.h | 2 +- dlls/dbghelp/dwarf.c | 10 ++------ dlls/dbghelp/module.c | 16 +++++++++---- dlls/dbghelp/stabs.c | 2 +- include/dbghelp.h | 44 ++++++++++++++++++++++++++++++++++ programs/winedbg/info.c | 39 ++++++++++++++---------------- 6 files changed, 78 insertions(+), 35 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 1ce221a0f27..edae3f9324a 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -445,7 +445,7 @@ struct cpu; struct module { struct process* process; - IMAGEHLP_MODULEW64 module; + WINE_IMAGEHLP_MODULEW64 module; WCHAR modulename[64]; /* used for enumeration */ struct module* next; enum module_type type : 16; diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index 2a4f9a16228..c5a9373186a 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -175,7 +175,6 @@ typedef struct dwarf2_parse_module_context_s const struct elf_thunk_area*thunks; struct vector unit_contexts; struct dwarf2_dwz_alternate_s* dwz; - DWORD cu_versions; } dwarf2_parse_module_context_t;
typedef struct dwarf2_dwz_alternate_s @@ -2893,7 +2892,7 @@ static BOOL dwarf2_parse_compilation_unit_head(dwarf2_parse_context_t* ctx, TRACE("- offset_size: %u\n", ctx->head.offset_size);
if (ctx->head.version >= 2) - ctx->module_ctx->cu_versions |= 1 << (ctx->head.version - 2); + ctx->module_ctx->module->module.DebugFormatMask |= FORMAT_DWARF2 << (ctx->head.version - 2); if (max_supported_dwarf_version == 0) { char* env = getenv("DBGHELP_DWARF_VERSION"); @@ -4112,7 +4111,7 @@ static BOOL dwarf2_load_CU_module(dwarf2_parse_module_context_t* module_ctx, str module_ctx->thunks = thunks; module_ctx->load_offset = load_offset; vector_init(&module_ctx->unit_contexts, sizeof(dwarf2_parse_context_t), 16); - module_ctx->cu_versions = 0; + module_ctx->module->module.DebugFormatMask = 0;
/* phase I: parse all CU heads */ mod_ctx.data = sections[section_debug].address; @@ -4260,11 +4259,6 @@ BOOL dwarf2_parse(struct module* module, ULONG_PTR load_offset, dwarf2_load_CU_module(&module_ctx, module, section, load_offset, thunks, FALSE);
dwarf2_modfmt->module->module.SymType = SymDia; - /* hide dwarf versions in CVSig - * bits 24-31 will be set according to found dwarf version - * different CU can have different dwarf version, so use a bit per version (version 2 => b24) - */ - dwarf2_modfmt->module->module.CVSig = 'D' | ('W' << 8) | ('F' << 16) | ((module_ctx.cu_versions & 0xFF) << 24); /* FIXME: we could have a finer grain here */ dwarf2_modfmt->module->module.GlobalSymbols = TRUE; dwarf2_modfmt->module->module.TypeInfo = TRUE; diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index 22b58950b43..6c69031ddfd 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -39,6 +39,8 @@ const WCHAR S_ElfW[] = L"<elf>"; const WCHAR S_WineLoaderW[] = L"<wine-loader>"; static const WCHAR * const ext[] = {L".acm", L".dll", L".drv", L".exe", L".ocx", L".vxd", NULL};
+C_ASSERT(sizeof(IMAGEHLP_MODULEW64) == FIELD_OFFSET(WINE_IMAGEHLP_MODULEW64, Magic)); + static int match_ext(const WCHAR* ptr, size_t len) { const WCHAR* const *e; @@ -225,6 +227,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name, module->module.Publics = FALSE; module->module.MachineType = machine; module->module.Reserved = 0; + module->module.Magic = WINE_IMAGEHLP_MODULE_MAGIC;
module->reloc_delta = 0; module->type = type; @@ -1490,14 +1493,19 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, BOOL WINAPI SymGetModuleInfoW64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULEW64 ModuleInfo) { - struct process* pcs = process_find_by_handle(hProcess); - struct module* module; - IMAGEHLP_MODULEW64 miw64; + struct process* pcs = process_find_by_handle(hProcess); + struct module* module; + WINE_IMAGEHLP_MODULEW64 miw64;
TRACE("%p %I64x %p\n", hProcess, dwAddr, ModuleInfo);
if (!pcs) return FALSE; - if (ModuleInfo->SizeOfStruct > sizeof(*ModuleInfo)) return FALSE; + if (ModuleInfo->SizeOfStruct > sizeof(*ModuleInfo)) + { + if (!dbghelp_opt_native || ModuleInfo->SizeOfStruct != sizeof(miw64) || + ((WINE_IMAGEHLP_MODULEW64*)ModuleInfo)->Magic != WINE_IMAGEHLP_MODULE_MAGIC) + return FALSE; + } module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); if (!module) return FALSE;
diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c index f21f7e15d0b..c44257037a9 100644 --- a/dlls/dbghelp/stabs.c +++ b/dlls/dbghelp/stabs.c @@ -1664,7 +1664,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, stab_ptr->n_type, (ULONG_PTR)n_value, debugstr_a(strs + stab_ptr->n_strx)); } module->module.SymType = SymDia; - module->module.CVSig = 'S' | ('T' << 8) | ('A' << 16) | ('B' << 24); + module->module.DebugFormatMask |= FORMAT_STABS; /* FIXME: we could have a finer grain here */ module->module.LineNumbers = TRUE; module->module.GlobalSymbols = TRUE; diff --git a/include/dbghelp.h b/include/dbghelp.h index 15e9f9d2d77..e864052ab32 100644 --- a/include/dbghelp.h +++ b/include/dbghelp.h @@ -255,6 +255,50 @@ typedef struct _IMAGEHLP_MODULEW64 DWORD Reserved; } IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64;
+#ifdef __WINESRC__ +/* Wine's own extention of IMAGEHLP_MODULEW64 */ +typedef struct +{ + DWORD SizeOfStruct; + DWORD64 BaseOfImage; + DWORD ImageSize; + DWORD TimeDateStamp; + DWORD CheckSum; + DWORD NumSyms; + SYM_TYPE SymType; + WCHAR ModuleName[32]; + WCHAR ImageName[256]; + WCHAR LoadedImageName[256]; + WCHAR LoadedPdbName[256]; + DWORD CVSig; + WCHAR CVData[MAX_PATH*3]; + DWORD PdbSig; + GUID PdbSig70; + DWORD PdbAge; + BOOL PdbUnmatched; + BOOL DbgUnmatched; + BOOL LineNumbers; + BOOL GlobalSymbols; + BOOL TypeInfo; + BOOL SourceIndexed; + BOOL Publics; + DWORD MachineType; + DWORD Reserved; + /* Wine's specific extensions (fields above must be in sync with IMAGELP_MODULEW64) */ + DWORD DECLSPEC_ALIGN(8) Magic; + enum format_mask /* when SymType is SymDIA */ + { + FORMAT_DWARF2 = 0x00000001, + FORMAT_DWARF3 = 0x00000002, + FORMAT_DWARF4 = 0x00000004, + FORMAT_DWARF5 = 0x00000008, + FORMAT_DWARF = 0x0000000F, + FORMAT_STABS = 0x00010000, + } DebugFormatMask; +} WINE_IMAGEHLP_MODULEW64; +#define WINE_IMAGEHLP_MODULE_MAGIC 0xB0507E17 +#endif /* __WINESRC__ */ + #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) #define IMAGEHLP_LINE IMAGEHLP_LINE64 #define PIMAGEHLP_LINE PIMAGEHLP_LINE64 diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index 251b92c607b..a46ecec923a 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -116,7 +116,7 @@ void info_help(void) while (infotext[i]) dbg_printf("%s\n", infotext[i++]); }
-static const char* get_symtype_str(const IMAGEHLP_MODULE64* mi) +static const char* get_symtype_str(const WINE_IMAGEHLP_MODULEW64* mi) { switch (mi->SymType) { @@ -129,34 +129,30 @@ static const char* get_symtype_str(const IMAGEHLP_MODULE64* mi) case SymDeferred: return "Deferred"; case SymSym: return "Sym"; case SymDia: - switch (mi->CVSig) + if (mi->DebugFormatMask) { - case 'S' | ('T' << 8) | ('A' << 16) | ('B' << 24): - return "Stabs"; - case 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24): - /* previous versions of dbghelp used to report this... */ - return "Dwarf"; - default: - if ((mi->CVSig & 0x00FFFFFF) == ('D' | ('W' << 8) | ('F' << 16))) + static char tmp[64]; + tmp[0] = '\0'; + if (mi->DebugFormatMask & FORMAT_STABS) strcpy(tmp, "stabs"); + if (mi->DebugFormatMask & FORMAT_DWARF) { - static char tmp[64]; - DWORD versbit = mi->CVSig >> 24; - strcpy(tmp, "Dwarf"); - if (versbit & 1) strcat(tmp, "-2"); - if (versbit & 2) strcat(tmp, "-3"); - if (versbit & 4) strcat(tmp, "-4"); - if (versbit & 8) strcat(tmp, "-5"); - return tmp; + if (tmp[0]) strcat(tmp, ", "); + strcat(tmp, "Dwarf"); + if (mi->DebugFormatMask & FORMAT_DWARF2) strcat(tmp, "-2"); + if (mi->DebugFormatMask & FORMAT_DWARF3) strcat(tmp, "-3"); + if (mi->DebugFormatMask & FORMAT_DWARF4) strcat(tmp, "-4"); + if (mi->DebugFormatMask & FORMAT_DWARF5) strcat(tmp, "-5"); } - return "DIA"; + return tmp; } + return "DIA"; } }
struct info_module { - IMAGEHLP_MODULE64 mi; - char name[64]; + WINE_IMAGEHLP_MODULEW64 mi; + char name[64]; };
struct info_modules @@ -226,7 +222,8 @@ static BOOL CALLBACK info_mod_cb(PCSTR mod_name, DWORD64 base, PVOID ctx) im->modules = new; } im->modules[im->num_used].mi.SizeOfStruct = sizeof(im->modules[im->num_used].mi); - if (SymGetModuleInfo64(dbg_curr_process->handle, base, &im->modules[im->num_used].mi)) + im->modules[im->num_used].mi.Magic = WINE_IMAGEHLP_MODULE_MAGIC; + if (SymGetModuleInfoW64(dbg_curr_process->handle, base, (IMAGEHLP_MODULEW64*)&im->modules[im->num_used].mi)) { const int dst_len = sizeof(im->modules[im->num_used].name); lstrcpynA(im->modules[im->num_used].name, mod_name, dst_len - 1);