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
This commit is contained in:
Eric Pouech 2006-01-23 16:38:57 +01:00 committed by Alexandre Julliard
parent bdf32ee032
commit 0509fe72c9
3 changed files with 40 additions and 21 deletions

View File

@ -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);
/* module.c */
extern int module_compute_num_syms(struct module* module);
extern struct module*
module_find_by_addr(const struct process* pcs, unsigned long addr,
enum module_type type);

View File

@ -271,6 +271,7 @@ struct module* module_get_debug(const struct process* pcs, struct module* module
}
if (!ret) module->module.SymType = SymNone;
assert(module->module.SymType != SymDeferred);
module_compute_num_syms(module);
}
return (module && module->module.SymType != SymNone) ? module : NULL;
}
@ -359,6 +360,18 @@ enum module_type module_get_type_by_name(const char* name)
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.@)
*/
@ -404,7 +417,7 @@ DWORD WINAPI SymLoadModule(HANDLE hProcess, HANDLE hFile, const char* ImageName,
WARN("Couldn't locate %s\n", ImageName);
return 0;
}
module_compute_num_syms(module);
done:
/* by default pe_load_module fills module.ModuleName from a derivation
* of ImageName. Overwrite it, if we have better information
@ -436,6 +449,7 @@ DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName,
if (!module) return FALSE;
if (ModuleName)
lstrcpynA(module->module.ModuleName, ModuleName, sizeof(module->module.ModuleName));
module->module.SymType = SymVirtual;
return TRUE;
}
@ -601,7 +615,10 @@ BOOL WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr,
{
module = module_get_container(pcs, module);
if (module && module->module.SymType != SymNone)
{
ModuleInfo->SymType = module->module.SymType;
ModuleInfo->NumSyms = module->module.NumSyms;
}
}
return TRUE;
@ -616,8 +633,8 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
{
struct process* pcs = process_find_by_handle(hProcess);
struct module* module;
DWORD sz;
IMAGEHLP_MODULE64 mod;
char* ptr;
TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo);
@ -626,6 +643,7 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN);
if (!module) return FALSE;
mod.SizeOfStruct = ModuleInfo->SizeOfStruct;
mod.BaseOfImage = module->module.BaseOfImage;
mod.ImageSize = module->module.ImageSize;
mod.TimeDateStamp = module->module.TimeDateStamp;
@ -635,18 +653,21 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
strcpy(mod.ModuleName, module->module.ModuleName);
strcpy(mod.ImageName, module->module.ImageName);
strcpy(mod.LoadedImageName, module->module.LoadedImageName);
/* FIXME: all following attributes need to be set */
mod.LoadedPdbName[0] = '\0';
mod.CVSig = 0;
/* FIXME: for now, using some 'rather sane' value */
sprintf(mod.LoadedPdbName, ".\%s.pdb", module->module.ModuleName);
mod.CVSig = 0x53445352; /* RSDS */
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;
memset(&mod.PdbSig70, 0, sizeof(mod.PdbSig70));
mod.PdbAge = 0;
mod.PdbUnmatched = 0;
mod.DbgUnmatched = 0;
mod.LineNumbers = 0;
mod.GlobalSymbols = 0;
mod.TypeInfo = 0;
mod.PdbUnmatched = FALSE;
mod.DbgUnmatched = FALSE;
mod.LineNumbers = TRUE;
mod.GlobalSymbols = TRUE;
mod.TypeInfo = TRUE;
mod.SourceIndexed = 0;
mod.Publics = 0;
@ -654,11 +675,12 @@ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
{
module = module_get_container(pcs, module);
if (module && module->module.SymType != SymNone)
{
mod.SymType = module->module.SymType;
mod.NumSyms = module->module.NumSyms;
}
}
sz = ModuleInfo->SizeOfStruct;
memcpy(ModuleInfo, &mod, sz);
ModuleInfo->SizeOfStruct = sz;
memcpy(ModuleInfo, &mod, mod.SizeOfStruct);
return TRUE;
}

View File

@ -575,24 +575,20 @@ static BOOL symt_enum_module(struct module* module, regex_t* regex,
*/
static BOOL resort_symbols(struct module* module)
{
int nsym = 0;
int nsym;
void* ptr;
struct symt_ht* sym;
struct hash_table_iter hti;
hash_table_iter_init(&module->ht_symbols, &hti, NULL);
while ((ptr = hash_table_iter_up(&hti)))
nsym++;
if (!(module->module.NumSyms = nsym)) return FALSE;
if (!module_compute_num_syms(module)) return FALSE;
if (module->addr_sorttab)
module->addr_sorttab = HeapReAlloc(GetProcessHeap(), 0,
module->addr_sorttab,
nsym * sizeof(struct symt_ht*));
module->module.NumSyms * sizeof(struct symt_ht*));
else
module->addr_sorttab = HeapAlloc(GetProcessHeap(), 0,
nsym * sizeof(struct symt_ht*));
module->module.NumSyms * sizeof(struct symt_ht*));
if (!module->addr_sorttab) return FALSE;
nsym = 0;