dbghelp: Virtual modules.

Rewrote virtual modules handling so that it's an option to either PE
or ELF modules rather than a specific type.
This commit is contained in:
Eric Pouech 2006-02-20 12:16:08 +01:00 committed by Alexandre Julliard
parent 8445773c0e
commit 88aa6703af
5 changed files with 31 additions and 28 deletions

View File

@ -258,14 +258,14 @@ enum module_type
DMT_ELF, /* a real ELF shared module */
DMT_PE, /* a native or builtin PE module */
DMT_PDB, /* PDB file */
DMT_VIRTUAL, /* a virtual module (ie defined by caller) */
};
struct module
{
IMAGEHLP_MODULE module;
struct module* next;
enum module_type type;
enum module_type type : 16;
unsigned short is_virtual : 1;
struct elf_module_info* elf_info;
/* memory allocation pool */
@ -345,9 +345,9 @@ extern struct module*
module_get_debug(const struct process* pcs, struct module*);
extern struct module*
module_new(struct process* pcs, const char* name,
enum module_type type, unsigned long addr,
unsigned long size, unsigned long stamp,
unsigned long checksum);
enum module_type type, BOOL virtual,
unsigned long addr, unsigned long size,
unsigned long stamp, unsigned long checksum);
extern struct module*
module_get_container(const struct process* pcs,
const struct module* inner);

View File

@ -1091,7 +1091,7 @@ static BOOL elf_load_file(struct process* pcs, const char* filename,
struct elf_module_info *elf_module_info =
HeapAlloc(GetProcessHeap(), 0, sizeof(struct elf_module_info));
if (!elf_module_info) goto leave;
elf_info->module = module_new(pcs, filename, DMT_ELF,
elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE,
(load_offset) ? load_offset : fmap.elf_start,
fmap.elf_size, 0, calc_crc32(&fmap));
if (!elf_info->module)
@ -1292,7 +1292,8 @@ BOOL elf_synchronize_module_list(struct process* pcs)
for (module = pcs->lmodules; module; module = module->next)
{
if (module->type == DMT_ELF) module->elf_info->elf_mark = 0;
if (module->type == DMT_ELF && !module->is_virtual)
module->elf_info->elf_mark = 0;
}
es.pcs = pcs;
@ -1303,8 +1304,8 @@ BOOL elf_synchronize_module_list(struct process* pcs)
module = pcs->lmodules;
while (module)
{
if (module->type == DMT_ELF && !module->elf_info->elf_mark &&
!module->elf_info->elf_loader)
if (module->type == DMT_ELF && !module->is_virtual &&
!module->elf_info->elf_mark && !module->elf_info->elf_loader)
{
module_remove(pcs, module);
/* restart all over */

View File

@ -78,13 +78,12 @@ static void module_fill_module(const char* in, char* out, size_t size)
while ((*out = tolower(*out))) out++;
}
static const char* get_module_type(enum module_type type)
static const char* get_module_type(enum module_type type, BOOL virtual)
{
switch (type)
{
case DMT_ELF: return "ELF";
case DMT_PE: return "PE";
case DMT_VIRTUAL: return "Virtual";
case DMT_ELF: return virtual ? "Virtual ELF" : "ELF";
case DMT_PE: return virtual ? "Virtual PE" : "PE";
default: return "---";
}
}
@ -93,13 +92,13 @@ static const char* get_module_type(enum module_type type)
* Creates and links a new module to a process
*/
struct module* module_new(struct process* pcs, const char* name,
enum module_type type,
enum module_type type, BOOL virtual,
unsigned long mod_addr, unsigned long size,
unsigned long stamp, unsigned long checksum)
{
struct module* module;
assert(type == DMT_ELF || type == DMT_PE || type == DMT_VIRTUAL);
assert(type == DMT_ELF || type == DMT_PE);
if (!(module = HeapAlloc(GetProcessHeap(), 0, sizeof(*module))))
return NULL;
@ -109,7 +108,7 @@ struct module* module_new(struct process* pcs, const char* name,
pcs->lmodules = module;
TRACE("=> %s %08lx-%08lx %s\n",
get_module_type(type), mod_addr, mod_addr + size, name);
get_module_type(type, virtual), mod_addr, mod_addr + size, name);
pool_init(&module->pool, 65536);
@ -126,6 +125,7 @@ struct module* module_new(struct process* pcs, const char* name,
module->module.CheckSum = checksum;
module->type = type;
module->is_virtual = virtual ? TRUE : FALSE;
module->sortlist_valid = FALSE;
module->addr_sorttab = NULL;
/* FIXME: this seems a bit too high (on a per module basis)
@ -154,8 +154,7 @@ struct module* module_find_by_name(const struct process* pcs,
if (type == DMT_UNKNOWN)
{
if ((module = module_find_by_name(pcs, name, DMT_PE)) ||
(module = module_find_by_name(pcs, name, DMT_ELF)) ||
(module = module_find_by_name(pcs, name, DMT_VIRTUAL)))
(module = module_find_by_name(pcs, name, DMT_ELF)))
return module;
}
else
@ -243,8 +242,9 @@ struct module* module_get_debug(const struct process* pcs, struct module* module
if (module->module.SymType == SymDeferred)
{
BOOL ret;
switch (module->type)
if (module->is_virtual) ret = FALSE;
else switch (module->type)
{
case DMT_ELF:
ret = elf_load_debug_info(module, NULL);
@ -264,7 +264,6 @@ struct module* module_get_debug(const struct process* pcs, struct module* module
ret ? CBA_DEFERRED_SYMBOL_LOAD_COMPLETE : CBA_DEFERRED_SYMBOL_LOAD_FAILURE,
&idsl64);
break;
case DMT_VIRTUAL: /* fall through */
default:
ret = FALSE;
break;
@ -290,8 +289,7 @@ struct module* module_find_by_addr(const struct process* pcs, unsigned long addr
if (type == DMT_UNKNOWN)
{
if ((module = module_find_by_addr(pcs, addr, DMT_PE)) ||
(module = module_find_by_addr(pcs, addr, DMT_ELF)) ||
(module = module_find_by_addr(pcs, addr, DMT_VIRTUAL)))
(module = module_find_by_addr(pcs, addr, DMT_ELF)))
return module;
}
else
@ -436,6 +434,10 @@ DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName,
PCSTR ModuleName, DWORD64 BaseOfDll, DWORD DllSize,
PMODLOAD_DATA Data, DWORD Flags)
{
TRACE("(%p %p %s %s %s %08lx %p %08lx)\n",
hProcess, hFile, debugstr_a(ImageName), debugstr_a(ModuleName),
wine_dbgstr_longlong(BaseOfDll), DllSize, Data, Flags);
if (Data)
FIXME("Unsupported load data parameter %p for %s\n", Data, ImageName);
if (!validate_addr64(BaseOfDll)) return FALSE;
@ -445,7 +447,8 @@ DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName,
struct module* module;
if (!pcs) return FALSE;
module = module_new(pcs, ImageName, DMT_VIRTUAL, (DWORD)BaseOfDll, DllSize, 0, 0);
module = module_new(pcs, ImageName, module_get_type_by_name(ImageName), TRUE,
(DWORD)BaseOfDll, DllSize, 0, 0);
if (!module) return FALSE;
if (ModuleName)
lstrcpynA(module->module.ModuleName, ModuleName, sizeof(module->module.ModuleName));

View File

@ -282,7 +282,6 @@ static BOOL CALLBACK sffip_cb(LPCSTR buffer, void* user)
}
break;
case DMT_PDB:
case DMT_VIRTUAL:
FIXME("NIY on '%s'\n", buffer);
break;
default:

View File

@ -360,7 +360,7 @@ struct module* pe_load_module(struct process* pcs, const char* name,
if (!base) base = nth->OptionalHeader.ImageBase;
if (!size) size = nth->OptionalHeader.SizeOfImage;
module = module_new(pcs, loaded_name, DMT_PE, base, size,
module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size,
nth->FileHeader.TimeDateStamp,
nth->OptionalHeader.CheckSum);
if (module)
@ -428,11 +428,11 @@ struct module* pe_load_module_from_pcs(struct process* pcs, const char* name,
if (pe_load_nt_header(pcs->handle, base, &nth))
{
if (!size) size = nth.OptionalHeader.SizeOfImage;
module = module_new(pcs, name, DMT_PE, base, size,
module = module_new(pcs, name, DMT_PE, FALSE, base, size,
nth.FileHeader.TimeDateStamp, nth.OptionalHeader.CheckSum);
}
} else if (size)
module = module_new(pcs, name, DMT_PE, base, size, 0 /* FIXME */, 0 /* FIXME */);
module = module_new(pcs, name, DMT_PE, FALSE, base, size, 0 /* FIXME */, 0 /* FIXME */);
}
return module;
}