dbghelp: Properly manage in dbghelp interfaces local variables and parameters that are constant.

This commit is contained in:
Eric Pouech 2010-06-07 21:50:46 +02:00 committed by Alexandre Julliard
parent 99a5488a18
commit 083eca072d
3 changed files with 31 additions and 3 deletions

View File

@ -347,6 +347,7 @@ struct module_format
struct module
{
struct process* process;
IMAGEHLP_MODULEW64 module;
/* ANSI copy of module.ModuleName for efficiency */
char module_name[MAX_PATH];

View File

@ -142,6 +142,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
pool_init(&module->pool, 65536);
module->process = pcs;
module->module.SizeOfStruct = sizeof(module->module);
module->module.BaseOfImage = mod_addr;
module->module.ImageSize = size;

View File

@ -803,9 +803,35 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
break;
case TI_GET_VALUE:
if (type->tag != SymTagData || ((const struct symt_data*)type)->kind != DataIsConstant)
return FALSE;
X(VARIANT) = ((const struct symt_data*)type)->u.value;
if (type->tag != SymTagData) return FALSE;
switch (((const struct symt_data*)type)->kind)
{
case DataIsConstant: X(VARIANT) = ((const struct symt_data*)type)->u.value; break;
case DataIsLocal:
case DataIsParam:
{
struct location loc = ((const struct symt_data*)type)->u.var;
unsigned i;
struct module_format* modfmt;
if (loc.kind < loc_user) return FALSE;
for (i = 0; i < DFI_LAST; i++)
{
modfmt = module->format_info[i];
if (modfmt && modfmt->loc_compute)
{
modfmt->loc_compute(module->process, modfmt,
(const struct symt_function*)((const struct symt_data*)type)->container, &loc);
break;
}
}
if (loc.kind != loc_absolute) return FALSE;
X(VARIANT).n1.n2.vt = VT_UI4; /* FIXME */
X(VARIANT).n1.n2.n3.uiVal = loc.offset;
}
break;
default: return FALSE;
}
break;
case TI_GET_CALLING_CONVENTION: