Module: wine Branch: master Commit: 5ce195ae895db9ec9d51276dab6d5c870ceaee11 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5ce195ae895db9ec9d51276dab...
Author: Eric Pouech eric.pouech@orange.fr Date: Sat Jan 8 14:04:14 2011 +0100
dbghelp: Keep the mapping of any PDB file open until the module is unloaded.
---
dlls/dbghelp/msc.c | 75 +++++++++++++++++++++++++++------------------------ 1 files changed, 40 insertions(+), 35 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index 74db2e9..4dcf65f 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -66,6 +66,8 @@ struct pdb_file_info { enum pdb_kind kind; DWORD age; + HANDLE hMap; + const char* image; union { struct @@ -2130,16 +2132,16 @@ static void* pdb_read_ds_file(const struct PDB_DS_HEADER* pdb, return pdb_ds_read(pdb, block_list, toc->file_size[file_nr]); }
-static void* pdb_read_file(const char* image, const struct pdb_file_info* pdb_file, +static void* pdb_read_file(const struct pdb_file_info* pdb_file, DWORD file_nr) { switch (pdb_file->kind) { case PDB_JG: - return pdb_read_jg_file((const struct PDB_JG_HEADER*)image, + return pdb_read_jg_file((const struct PDB_JG_HEADER*)pdb_file->image, pdb_file->u.jg.toc, file_nr); case PDB_DS: - return pdb_read_ds_file((const struct PDB_DS_HEADER*)image, + return pdb_read_ds_file((const struct PDB_DS_HEADER*)pdb_file->image, pdb_file->u.ds.toc, file_nr); } return NULL; @@ -2180,7 +2182,13 @@ static void pdb_module_remove(struct process* pcsn, struct module_format* modfmt unsigned i;
for (i = 0; i < modfmt->u.pdb_info->used_subfiles; i++) + { pdb_free_file(&modfmt->u.pdb_info->pdb_files[i]); + if (modfmt->u.pdb_info->pdb_files[i].image) + UnmapViewOfFile(modfmt->u.pdb_info->pdb_files[i].image); + if (modfmt->u.pdb_info->pdb_files[i].hMap) + CloseHandle(modfmt->u.pdb_info->pdb_files[i].hMap); + } HeapFree(GetProcessHeap(), 0, modfmt); }
@@ -2259,11 +2267,11 @@ static void pdb_convert_symbol_file(const PDB_SYMBOLS* symbols, } }
-static HANDLE open_pdb_file(const struct process* pcs, - const struct pdb_lookup* lookup, - struct module* module) +static HANDLE map_pdb_file(const struct process* pcs, + const struct pdb_lookup* lookup, + struct module* module) { - HANDLE h; + HANDLE hFile, hMap = NULL; char dbg_file_path[MAX_PATH]; BOOL ret = FALSE;
@@ -2283,19 +2291,21 @@ static HANDLE open_pdb_file(const struct process* pcs, WARN("\tCouldn't find %s\n", lookup->filename); return NULL; } - h = CreateFileA(dbg_file_path, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - TRACE("%s: %s returns %p\n", lookup->filename, dbg_file_path, h); - return (h == INVALID_HANDLE_VALUE) ? NULL : h; + if ((hFile = CreateFileA(dbg_file_path, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) + { + hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); + CloseHandle(hFile); + } + return hMap; }
static void pdb_process_types(const struct msc_debug_info* msc_dbg, - const char* image, const struct pdb_file_info* pdb_file) { BYTE* types_image = NULL;
- types_image = pdb_read_file(image, pdb_file, 2); + types_image = pdb_read_file(pdb_file, 2); if (types_image) { PDB_TYPES types; @@ -2451,7 +2461,7 @@ static BOOL pdb_init(const struct pdb_lookup* pdb_lookup, struct pdb_file_info*
for (i = 1; i < num_files; i++) { - unsigned char* x = pdb_read_file(image, pdb_file, i); + unsigned char* x = pdb_read_file(pdb_file, i); FIXME("********************** [%u]: size=%08x\n", i, pdb_get_file_size(pdb_file, i)); dump(x, pdb_get_file_size(pdb_file, i)); @@ -2536,8 +2546,7 @@ static BOOL pdb_process_internal(const struct process* pcs, struct pdb_module_info* pdb_module_info, unsigned module_index) { - BOOL ret = FALSE; - HANDLE hFile, hMap = NULL; + HANDLE hMap = NULL; char* image = NULL; BYTE* symbols_image = NULL; char* files_image = NULL; @@ -2549,19 +2558,23 @@ static BOOL pdb_process_internal(const struct process* pcs,
pdb_file = &pdb_module_info->pdb_files[module_index == -1 ? 0 : module_index]; /* Open and map() .PDB file */ - if ((hFile = open_pdb_file(pcs, pdb_lookup, msc_dbg->module)) == NULL || - ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) == NULL) || + if ((hMap = map_pdb_file(pcs, pdb_lookup, msc_dbg->module)) == NULL || ((image = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) == NULL)) { WARN("Unable to open .PDB file: %s\n", pdb_lookup->filename); - goto leave; + CloseHandle(hMap); + return FALSE; } if (!pdb_init(pdb_lookup, pdb_file, image, &matched) || matched != 2) { - goto leave; + CloseHandle(hMap); + UnmapViewOfFile(image); + return FALSE; }
- symbols_image = pdb_read_file(image, pdb_file, 3); + pdb_file->hMap = hMap; + pdb_file->image = image; + symbols_image = pdb_read_file(pdb_file, 3); if (symbols_image) { PDB_SYMBOLS symbols; @@ -2583,7 +2596,7 @@ static BOOL pdb_process_internal(const struct process* pcs, symbols.version, symbols.version); }
- files_image = pdb_read_file(image, pdb_file, 12); /* FIXME: really fixed ??? */ + files_image = pdb_read_file(pdb_file, 12); /* FIXME: really fixed ??? */ if (files_image) { if (*(const DWORD*)files_image == 0xeffeeffe) @@ -2600,10 +2613,10 @@ static BOOL pdb_process_internal(const struct process* pcs,
pdb_process_symbol_imports(pcs, msc_dbg, &symbols, symbols_image, image, pdb_lookup, pdb_module_info, module_index); - pdb_process_types(msc_dbg, image, pdb_file); + pdb_process_types(msc_dbg, pdb_file);
/* Read global symbol table */ - globalimage = pdb_read_file(image, pdb_file, symbols.gsym_file); + globalimage = pdb_read_file(pdb_file, symbols.gsym_file); if (globalimage) { codeview_snarf(msc_dbg, globalimage, 0, @@ -2621,7 +2634,7 @@ static BOOL pdb_process_internal(const struct process* pcs, HeapValidate(GetProcessHeap(), 0, NULL); pdb_convert_symbol_file(&symbols, &sfile, &size, file);
- modimage = pdb_read_file(image, pdb_file, sfile.file); + modimage = pdb_read_file(pdb_file, sfile.file); if (modimage) { if (sfile.symbol_size) @@ -2655,19 +2668,11 @@ static BOOL pdb_process_internal(const struct process* pcs, else pdb_process_symbol_imports(pcs, msc_dbg, NULL, NULL, image, pdb_lookup, pdb_module_info, module_index); - ret = TRUE;
- leave: - /* Cleanup */ pdb_free(symbols_image); pdb_free(files_image); - pdb_free_file(pdb_file);
- if (image) UnmapViewOfFile(image); - if (hMap) CloseHandle(hMap); - if (hFile) CloseHandle(hFile); - - return ret; + return TRUE; }
static BOOL pdb_process_file(const struct process* pcs, @@ -2720,7 +2725,7 @@ BOOL pdb_fetch_file_info(const struct pdb_lookup* pdb_lookup, unsigned* matched) { HANDLE hFile, hMap = NULL; char* image = NULL; - BOOL ret = TRUE; + BOOL ret; struct pdb_file_info pdb_file;
if ((hFile = CreateFileA(pdb_lookup->filename, GENERIC_READ, FILE_SHARE_READ, NULL,