[PATCH 4/5] [DbgHelp]: keep the mapping of any PDB file opened until the module is unloaded

Eric Pouech eric.pouech at orange.fr
Sat Jan 8 07:04:14 CST 2011




A+
---

 0 files changed, 0 insertions(+), 0 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,




More information about the wine-patches mailing list