Commit 0509fe72 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

dbghelp: Return better values in module information.

- 32/64: number of symbols is now correct - 64: the 64 bit extra fields are now initialized with some non null yet sensible value
parent bdf32ee0
...@@ -334,6 +334,7 @@ extern BOOL elf_synchronize_module_list(struct process* pcs); ...@@ -334,6 +334,7 @@ extern BOOL elf_synchronize_module_list(struct process* pcs);
extern DWORD WINAPI addr_to_linear(HANDLE hProcess, HANDLE hThread, ADDRESS* addr); extern DWORD WINAPI addr_to_linear(HANDLE hProcess, HANDLE hThread, ADDRESS* addr);
/* module.c */ /* module.c */
extern int module_compute_num_syms(struct module* module);
extern struct module* extern struct module*
module_find_by_addr(const struct process* pcs, unsigned long addr, module_find_by_addr(const struct process* pcs, unsigned long addr,
enum module_type type); enum module_type type);
......
...@@ -271,6 +271,7 @@ struct module* module_get_debug(const struct process* pcs, struct module* module ...@@ -271,6 +271,7 @@ struct module* module_get_debug(const struct process* pcs, struct module* module
} }
if (!ret) module->module.SymType = SymNone; if (!ret) module->module.SymType = SymNone;
assert(module->module.SymType != SymDeferred); assert(module->module.SymType != SymDeferred);
module_compute_num_syms(module);
} }
return (module && module->module.SymType != SymNone) ? module : NULL; return (module && module->module.SymType != SymNone) ? module : NULL;
} }
...@@ -359,6 +360,18 @@ enum module_type module_get_type_by_name(const char* name) ...@@ -359,6 +360,18 @@ enum module_type module_get_type_by_name(const char* name)
return DMT_PE; return DMT_PE;
} }
int module_compute_num_syms(struct module* module)
{
struct hash_table_iter hti;
void* ptr;
module->module.NumSyms = 0;
hash_table_iter_init(&module->ht_symbols, &hti, NULL);
while ((ptr = hash_table_iter_up(&hti)))
module->module.NumSyms++;
return module->module.NumSyms;
}
/*********************************************************************** /***********************************************************************
* SymLoadModule (DBGHELP.@) * SymLoadModule (DBGHELP.@)
*/ */
...@@ -404,7 +417,7 @@ DWORD WINAPI SymLoadModule(HANDLE hProcess, HANDLE hFile, const char* ImageName, ...@@ -404,7 +417,7 @@ DWORD WINAPI SymLoadModule(HANDLE hProcess, HANDLE hFile, const char* ImageName,
WARN("Couldn't locate %s\n", ImageName); WARN("Couldn't locate %s\n", ImageName);
return 0; return 0;
} }
module_compute_num_syms(module);
done: done:
/* by default pe_load_module fills module.ModuleName from a derivation /* by default pe_load_module fills module.ModuleName from a derivation
* of ImageName. Overwrite it, if we have better information * of ImageName. Overwrite it, if we have better information
...@@ -436,6 +449,7 @@ DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, ...@@ -436,6 +449,7 @@ DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName,
if (!module) return FALSE; if (!module) return FALSE;
if (ModuleName) if (ModuleName)
lstrcpynA(module->module.ModuleName, ModuleName, sizeof(module->module.ModuleName)); lstrcpynA(module->module.ModuleName, ModuleName, sizeof(module->module.ModuleName));
module->module.SymType = SymVirtual;
return TRUE; return TRUE;
} }
...@@ -601,7 +615,10 @@ BOOL WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr, ...@@ -601,7 +615,10 @@ BOOL WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr,
{ {
module = module_get_container(pcs, module); module = module_get_container(pcs, module);
if (module && module->module.SymType != SymNone) if (module && module->module.SymType != SymNone)
{
ModuleInfo->SymType = module->module.SymType; ModuleInfo->SymType = module->module.SymType;
ModuleInfo->NumSyms = module->module.NumSyms;
}
} }
return TRUE; return TRUE;
...@@ -616,8 +633,8 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, ...@@ -616,8 +633,8 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
{ {
struct process* pcs = process_find_by_handle(hProcess); struct process* pcs = process_find_by_handle(hProcess);
struct module* module; struct module* module;
DWORD sz;
IMAGEHLP_MODULE64 mod; IMAGEHLP_MODULE64 mod;
char* ptr;
TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo); TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo);
...@@ -626,6 +643,7 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, ...@@ -626,6 +643,7 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN);
if (!module) return FALSE; if (!module) return FALSE;
mod.SizeOfStruct = ModuleInfo->SizeOfStruct;
mod.BaseOfImage = module->module.BaseOfImage; mod.BaseOfImage = module->module.BaseOfImage;
mod.ImageSize = module->module.ImageSize; mod.ImageSize = module->module.ImageSize;
mod.TimeDateStamp = module->module.TimeDateStamp; mod.TimeDateStamp = module->module.TimeDateStamp;
...@@ -635,18 +653,21 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, ...@@ -635,18 +653,21 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
strcpy(mod.ModuleName, module->module.ModuleName); strcpy(mod.ModuleName, module->module.ModuleName);
strcpy(mod.ImageName, module->module.ImageName); strcpy(mod.ImageName, module->module.ImageName);
strcpy(mod.LoadedImageName, module->module.LoadedImageName); strcpy(mod.LoadedImageName, module->module.LoadedImageName);
/* FIXME: all following attributes need to be set */ /* FIXME: for now, using some 'rather sane' value */
mod.LoadedPdbName[0] = '\0'; sprintf(mod.LoadedPdbName, ".\%s.pdb", module->module.ModuleName);
mod.CVSig = 0; mod.CVSig = 0x53445352; /* RSDS */
memset(mod.CVData, 0, sizeof(mod.CVData)); memset(mod.CVData, 0, sizeof(mod.CVData));
strcpy(mod.CVData, module->module.LoadedImageName);
if ((ptr = strrchr(mod.CVData, '.')))
strcpy(ptr + 1, "pdb");
mod.PdbSig = 0; mod.PdbSig = 0;
memset(&mod.PdbSig70, 0, sizeof(mod.PdbSig70)); memset(&mod.PdbSig70, 0, sizeof(mod.PdbSig70));
mod.PdbAge = 0; mod.PdbAge = 0;
mod.PdbUnmatched = 0; mod.PdbUnmatched = FALSE;
mod.DbgUnmatched = 0; mod.DbgUnmatched = FALSE;
mod.LineNumbers = 0; mod.LineNumbers = TRUE;
mod.GlobalSymbols = 0; mod.GlobalSymbols = TRUE;
mod.TypeInfo = 0; mod.TypeInfo = TRUE;
mod.SourceIndexed = 0; mod.SourceIndexed = 0;
mod.Publics = 0; mod.Publics = 0;
...@@ -654,11 +675,12 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, ...@@ -654,11 +675,12 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
{ {
module = module_get_container(pcs, module); module = module_get_container(pcs, module);
if (module && module->module.SymType != SymNone) if (module && module->module.SymType != SymNone)
{
mod.SymType = module->module.SymType; mod.SymType = module->module.SymType;
mod.NumSyms = module->module.NumSyms;
}
} }
sz = ModuleInfo->SizeOfStruct; memcpy(ModuleInfo, &mod, mod.SizeOfStruct);
memcpy(ModuleInfo, &mod, sz);
ModuleInfo->SizeOfStruct = sz;
return TRUE; return TRUE;
} }
......
...@@ -575,24 +575,20 @@ static BOOL symt_enum_module(struct module* module, regex_t* regex, ...@@ -575,24 +575,20 @@ static BOOL symt_enum_module(struct module* module, regex_t* regex,
*/ */
static BOOL resort_symbols(struct module* module) static BOOL resort_symbols(struct module* module)
{ {
int nsym = 0; int nsym;
void* ptr; void* ptr;
struct symt_ht* sym; struct symt_ht* sym;
struct hash_table_iter hti; struct hash_table_iter hti;
hash_table_iter_init(&module->ht_symbols, &hti, NULL); if (!module_compute_num_syms(module)) return FALSE;
while ((ptr = hash_table_iter_up(&hti)))
nsym++;
if (!(module->module.NumSyms = nsym)) return FALSE;
if (module->addr_sorttab) if (module->addr_sorttab)
module->addr_sorttab = HeapReAlloc(GetProcessHeap(), 0, module->addr_sorttab = HeapReAlloc(GetProcessHeap(), 0,
module->addr_sorttab, module->addr_sorttab,
nsym * sizeof(struct symt_ht*)); module->module.NumSyms * sizeof(struct symt_ht*));
else else
module->addr_sorttab = HeapAlloc(GetProcessHeap(), 0, module->addr_sorttab = HeapAlloc(GetProcessHeap(), 0,
nsym * sizeof(struct symt_ht*)); module->module.NumSyms * sizeof(struct symt_ht*));
if (!module->addr_sorttab) return FALSE; if (!module->addr_sorttab) return FALSE;
nsym = 0; nsym = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment