Eric Pouech : dbghelp: Keep the file map around for every PE module, so that we can access image whenever we like to.
Alexandre Julliard
julliard at winehq.org
Fri Mar 19 11:16:37 CDT 2010
Module: wine
Branch: master
Commit: a2e65f13119a2a57d5f706663616e2911ccbeb93
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a2e65f13119a2a57d5f706663616e2911ccbeb93
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Thu Mar 18 21:31:13 2010 +0100
dbghelp: Keep the file map around for every PE module, so that we can access image whenever we like to.
---
dlls/dbghelp/dbghelp_private.h | 1 +
dlls/dbghelp/pe_module.c | 95 +++++++++++++++++++++-------------------
2 files changed, 51 insertions(+), 45 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 64e2d2f..3aa4f10 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -325,6 +325,7 @@ struct module
/* specific information for debug types */
struct elf_module_info* elf_info;
+ struct pe_module_info* pe_info;
struct dwarf2_module_info_s*dwarf2_info;
void (*module_remove)(struct process* pcs, struct module* module);
diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c
index 4d83889..171d616 100644
--- a/dlls/dbghelp/pe_module.c
+++ b/dlls/dbghelp/pe_module.c
@@ -36,6 +36,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
+struct pe_module_info
+{
+ struct image_file_map fmap;
+};
+
static void* pe_map_full(struct image_file_map* fmap, IMAGE_NT_HEADERS** nth)
{
if (!fmap->u.pe.full_map)
@@ -236,9 +241,16 @@ static void pe_unmap_file(struct image_file_map* fmap)
HeapFree(GetProcessHeap(), 0, fmap->u.pe.sect);
HeapFree(GetProcessHeap(), 0, (void*)fmap->u.pe.strtable); /* FIXME ugly (see pe_map_file) */
CloseHandle(fmap->u.pe.hMap);
+ fmap->u.pe.hMap = NULL;
}
}
+static void pe_module_remove(struct process* pcs, struct module* module)
+{
+ pe_unmap_file(&module->pe_info->fmap);
+ HeapFree(GetProcessHeap(), 0, module->pe_info);
+}
+
/******************************************************************
* pe_locate_with_coff_symbol_table
*
@@ -247,8 +259,9 @@ static void pe_unmap_file(struct image_file_map* fmap)
* Mingw32 requires this for stabs debug information as address for global variables isn't filled in
* (this is similar to what is done in elf_module.c when using the .symtab ELF section)
*/
-static BOOL pe_locate_with_coff_symbol_table(struct module* module, struct image_file_map* fmap)
+static BOOL pe_locate_with_coff_symbol_table(struct module* module)
{
+ struct image_file_map* fmap = &module->pe_info->fmap;
const IMAGE_SYMBOL* isym;
int i, numsym, naux;
char tmp[9];
@@ -306,8 +319,9 @@ static BOOL pe_locate_with_coff_symbol_table(struct module* module, struct image
*
* Load public symbols out of the COFF symbol table (if any).
*/
-static BOOL pe_load_coff_symbol_table(struct module* module, struct image_file_map* fmap)
+static BOOL pe_load_coff_symbol_table(struct module* module)
{
+ struct image_file_map* fmap = &module->pe_info->fmap;
const IMAGE_SYMBOL* isym;
int i, numsym, naux;
const char* strtable;
@@ -382,8 +396,9 @@ static inline DWORD pe_get_sect_size(IMAGE_SECTION_HEADER* sect)
* look for stabs information in PE header (it's how the mingw compiler provides
* its debugging information)
*/
-static BOOL pe_load_stabs(const struct process* pcs, struct module* module, struct image_file_map* fmap)
+static BOOL pe_load_stabs(const struct process* pcs, struct module* module)
{
+ struct image_file_map* fmap = &module->pe_info->fmap;
struct image_section_map sect_stabs, sect_stabstr;
BOOL ret = FALSE;
@@ -404,7 +419,7 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module, stru
}
image_unmap_section(§_stabs);
image_unmap_section(§_stabstr);
- if (ret) pe_locate_with_coff_symbol_table(module, fmap);
+ if (ret) pe_locate_with_coff_symbol_table(module);
}
TRACE("%s the STABS debug info\n", ret ? "successfully loaded" : "failed to load");
@@ -417,9 +432,9 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module, stru
* look for dwarf information in PE header (it's also a way for the mingw compiler
* to provide its debugging information)
*/
-static BOOL pe_load_dwarf(const struct process* pcs, struct module* module,
- struct image_file_map* fmap)
+static BOOL pe_load_dwarf(const struct process* pcs, struct module* module)
{
+ struct image_file_map* fmap = &module->pe_info->fmap;
struct image_section_map sect_debuginfo, sect_debugstr, sect_debugabbrev, sect_debugline, sect_debugloc;
BOOL ret = FALSE;
@@ -516,8 +531,9 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module,
*
* Process MSC debug information in PE file.
*/
-static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* module, struct image_file_map* fmap)
+static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* module)
{
+ struct image_file_map* fmap = &module->pe_info->fmap;
BOOL ret = FALSE;
const IMAGE_DATA_DIRECTORY* dir;
const IMAGE_DEBUG_DIRECTORY*dbg = NULL;
@@ -566,8 +582,9 @@ done:
/***********************************************************************
* pe_load_export_debug_info
*/
-static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* module, struct image_file_map* fmap)
+static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* module)
{
+ struct image_file_map* fmap = &module->pe_info->fmap;
unsigned int i;
const IMAGE_EXPORT_DIRECTORY* exports;
DWORD base = module->module.BaseOfImage;
@@ -649,48 +666,28 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module*
* pe_load_debug_info
*
*/
-BOOL pe_load_debug_info_internal(const struct process* pcs, struct module* module,
- struct image_file_map* fmap)
+BOOL pe_load_debug_info(const struct process* pcs, struct module* module)
{
BOOL ret = FALSE;
if (!(dbghelp_options & SYMOPT_PUBLICS_ONLY))
{
- ret = pe_load_stabs(pcs, module, fmap) ||
- pe_load_dwarf(pcs, module, fmap) ||
- pe_load_msc_debug_info(pcs, module, fmap) ||
- pe_load_coff_symbol_table(module, fmap);
+ ret = pe_load_stabs(pcs, module) ||
+ pe_load_dwarf(pcs, module) ||
+ pe_load_msc_debug_info(pcs, module) ||
+ pe_load_coff_symbol_table(module);
/* if we still have no debug info (we could only get SymExport at this
* point), then do the SymExport except if we have an ELF container,
* in which case we'll rely on the export's on the ELF side
*/
}
-/* FIXME shouldn't we check that? if (!module_get_debug(pcs, module))l */
- if (pe_load_export_debug_info(pcs, module, fmap) && !ret)
+ /* FIXME shouldn't we check that? if (!module_get_debug(pcs, module)) */
+ if (pe_load_export_debug_info(pcs, module) && !ret)
ret = TRUE;
return ret;
}
-BOOL pe_load_debug_info(const struct process* pcs, struct module* module)
-{
- BOOL ret = FALSE;
- HANDLE hFile;
- struct image_file_map fmap;
-
- hFile = CreateFileW(module->module.LoadedImageName, GENERIC_READ, FILE_SHARE_READ,
- NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile == INVALID_HANDLE_VALUE) return FALSE;
- if (pe_map_file(hFile, &fmap, DMT_PE))
- {
- ret = pe_load_debug_info_internal(pcs, module, &fmap);
- pe_unmap_file(&fmap);
- }
- CloseHandle(hFile);
-
- return ret;
-}
-
/******************************************************************
* pe_load_native_module
*
@@ -700,7 +697,7 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name,
{
struct module* module = NULL;
BOOL opened = FALSE;
- struct image_file_map fmap;
+ struct pe_module_info* module_info;
WCHAR loaded_name[MAX_PATH];
loaded_name[0] = '\0';
@@ -715,25 +712,33 @@ 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 (pe_map_file(hFile, &fmap, DMT_PE))
+ if (!(module_info = HeapAlloc(GetProcessHeap(), 0, sizeof(*module_info))))
+ return NULL;
+ if (pe_map_file(hFile, &module_info->fmap, DMT_PE))
{
- if (!base) base = fmap.u.pe.ntheader.OptionalHeader.ImageBase;
- if (!size) size = fmap.u.pe.ntheader.OptionalHeader.SizeOfImage;
+ if (!base) base = module_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase;
+ if (!size) size = module_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage;
module = module_new(pcs, loaded_name, DMT_PE, FALSE, base, size,
- fmap.u.pe.ntheader.FileHeader.TimeDateStamp,
- fmap.u.pe.ntheader.OptionalHeader.CheckSum);
+ module_info->fmap.u.pe.ntheader.FileHeader.TimeDateStamp,
+ module_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum);
if (module)
{
+ module->pe_info = module_info;
+ module->module_remove = pe_module_remove;
if (dbghelp_options & SYMOPT_DEFERRED_LOADS)
module->module.SymType = SymDeferred;
else
- pe_load_debug_info_internal(pcs, module, &fmap);
+ pe_load_debug_info(pcs, module);
+ }
+ else
+ {
+ ERR("could not load the module '%s'\n", debugstr_w(loaded_name));
+ pe_unmap_file(&module_info->fmap);
}
- else ERR("could not load the module '%s'\n", debugstr_w(loaded_name));
- pe_unmap_file(&fmap);
}
+ if (!module) HeapFree(GetProcessHeap(), 0, module_info);
+
if (opened) CloseHandle(hFile);
return module;
More information about the wine-cvs
mailing list