dbghelp: Move the PE debug info to the newly define scheme.
This commit is contained in:
parent
73f79e7fad
commit
cd92e3d147
|
@ -320,6 +320,7 @@ struct module;
|
|||
*/
|
||||
enum format_info
|
||||
{
|
||||
DFI_PE,
|
||||
DFI_DWARF,
|
||||
DFI_LAST
|
||||
};
|
||||
|
@ -335,6 +336,7 @@ struct module_format
|
|||
union
|
||||
{
|
||||
struct dwarf2_module_info_s* dwarf2_info;
|
||||
struct pe_module_info* pe_info;
|
||||
} u;
|
||||
};
|
||||
|
||||
|
@ -349,7 +351,6 @@ struct module
|
|||
|
||||
/* specific information for debug types */
|
||||
struct elf_module_info* elf_info;
|
||||
struct pe_module_info* pe_info;
|
||||
void (*module_remove)(struct process* pcs, struct module* module);
|
||||
struct module_format* format_info[DFI_LAST];
|
||||
|
||||
|
|
|
@ -257,10 +257,10 @@ static void pe_unmap_file(struct image_file_map* fmap)
|
|||
}
|
||||
}
|
||||
|
||||
static void pe_module_remove(struct process* pcs, struct module* module)
|
||||
static void pe_module_remove(struct process* pcs, struct module_format* modfmt)
|
||||
{
|
||||
pe_unmap_file(&module->pe_info->fmap);
|
||||
HeapFree(GetProcessHeap(), 0, module->pe_info);
|
||||
pe_unmap_file(&modfmt->u.pe_info->fmap);
|
||||
HeapFree(GetProcessHeap(), 0, modfmt);
|
||||
}
|
||||
|
||||
/******************************************************************
|
||||
|
@ -273,7 +273,7 @@ static void pe_module_remove(struct process* pcs, struct module* module)
|
|||
*/
|
||||
static BOOL pe_locate_with_coff_symbol_table(struct module* module)
|
||||
{
|
||||
struct image_file_map* fmap = &module->pe_info->fmap;
|
||||
struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
|
||||
const IMAGE_SYMBOL* isym;
|
||||
int i, numsym, naux;
|
||||
char tmp[9];
|
||||
|
@ -333,7 +333,7 @@ static BOOL pe_locate_with_coff_symbol_table(struct module* module)
|
|||
*/
|
||||
static BOOL pe_load_coff_symbol_table(struct module* module)
|
||||
{
|
||||
struct image_file_map* fmap = &module->pe_info->fmap;
|
||||
struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
|
||||
const IMAGE_SYMBOL* isym;
|
||||
int i, numsym, naux;
|
||||
const char* strtable;
|
||||
|
@ -413,7 +413,7 @@ static inline DWORD pe_get_sect_size(IMAGE_SECTION_HEADER* sect)
|
|||
*/
|
||||
static BOOL pe_load_stabs(const struct process* pcs, struct module* module)
|
||||
{
|
||||
struct image_file_map* fmap = &module->pe_info->fmap;
|
||||
struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
|
||||
struct image_section_map sect_stabs, sect_stabstr;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
|
@ -449,7 +449,7 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module)
|
|||
*/
|
||||
static BOOL pe_load_dwarf(struct module* module)
|
||||
{
|
||||
struct image_file_map* fmap = &module->pe_info->fmap;
|
||||
struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
ret = dwarf2_parse(module,
|
||||
|
@ -515,7 +515,7 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module,
|
|||
*/
|
||||
static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* module)
|
||||
{
|
||||
struct image_file_map* fmap = &module->pe_info->fmap;
|
||||
struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
|
||||
BOOL ret = FALSE;
|
||||
const IMAGE_DATA_DIRECTORY* dir;
|
||||
const IMAGE_DEBUG_DIRECTORY*dbg = NULL;
|
||||
|
@ -566,7 +566,7 @@ done:
|
|||
*/
|
||||
static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* module)
|
||||
{
|
||||
struct image_file_map* fmap = &module->pe_info->fmap;
|
||||
struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap;
|
||||
unsigned int i;
|
||||
const IMAGE_EXPORT_DIRECTORY* exports;
|
||||
DWORD base = module->module.BaseOfImage;
|
||||
|
@ -679,7 +679,7 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name,
|
|||
{
|
||||
struct module* module = NULL;
|
||||
BOOL opened = FALSE;
|
||||
struct pe_module_info* module_info;
|
||||
struct module_format* modfmt;
|
||||
WCHAR loaded_name[MAX_PATH];
|
||||
|
||||
loaded_name[0] = '\0';
|
||||
|
@ -694,20 +694,24 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name,
|
|||
else if (name) strcpyW(loaded_name, name);
|
||||
else if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
|
||||
FIXME("Trouble ahead (no module name passed in deferred mode)\n");
|
||||
if (!(module_info = HeapAlloc(GetProcessHeap(), 0, sizeof(*module_info))))
|
||||
if (!(modfmt = HeapAlloc(GetProcessHeap(), 0, sizeof(struct module_format) + sizeof(struct pe_module_info))))
|
||||
return NULL;
|
||||
if (pe_map_file(hFile, &module_info->fmap, DMT_PE))
|
||||
modfmt->u.pe_info = (struct pe_module_info*)(modfmt + 1);
|
||||
if (pe_map_file(hFile, &modfmt->u.pe_info->fmap, DMT_PE))
|
||||
{
|
||||
if (!base) base = module_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase;
|
||||
if (!size) size = module_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage;
|
||||
if (!base) base = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase;
|
||||
if (!size) size = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage;
|
||||
|
||||
module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size,
|
||||
module_info->fmap.u.pe.ntheader.FileHeader.TimeDateStamp,
|
||||
module_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum);
|
||||
modfmt->u.pe_info->fmap.u.pe.ntheader.FileHeader.TimeDateStamp,
|
||||
modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum);
|
||||
if (module)
|
||||
{
|
||||
module->pe_info = module_info;
|
||||
module->module_remove = pe_module_remove;
|
||||
modfmt->module = module;
|
||||
modfmt->remove = pe_module_remove;
|
||||
modfmt->loc_compute = NULL;
|
||||
|
||||
module->format_info[DFI_PE] = modfmt;
|
||||
if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
|
||||
module->module.SymType = SymDeferred;
|
||||
else
|
||||
|
@ -716,10 +720,10 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name,
|
|||
else
|
||||
{
|
||||
ERR("could not load the module '%s'\n", debugstr_w(loaded_name));
|
||||
pe_unmap_file(&module_info->fmap);
|
||||
pe_unmap_file(&modfmt->u.pe_info->fmap);
|
||||
}
|
||||
}
|
||||
if (!module) HeapFree(GetProcessHeap(), 0, module_info);
|
||||
if (!module) HeapFree(GetProcessHeap(), 0, modfmt);
|
||||
|
||||
if (opened) CloseHandle(hFile);
|
||||
|
||||
|
|
Loading…
Reference in New Issue