Eric Pouech : winedump: Force the PDB_?? _ROOT to always be present in reader object.

Alexandre Julliard julliard at winehq.org
Tue Jan 18 10:27:33 CST 2011


Module: wine
Branch: master
Commit: b7635f96ff9a338221fa6558008981572a525aac
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b7635f96ff9a338221fa6558008981572a525aac

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Mon Jan 17 21:53:08 2011 +0100

winedump: Force the PDB_??_ROOT to always be present in reader object.

---

 tools/winedump/pdb.c |  100 +++++++++++++++++++++++++------------------------
 1 files changed, 51 insertions(+), 49 deletions(-)

diff --git a/tools/winedump/pdb.c b/tools/winedump/pdb.c
index 1b7beeb..5bfdfb8 100644
--- a/tools/winedump/pdb.c
+++ b/tools/winedump/pdb.c
@@ -54,11 +54,13 @@ struct pdb_reader
         {
             const struct PDB_JG_HEADER* header;
             const struct PDB_JG_TOC*    toc;
+            const struct PDB_JG_ROOT*   root;
         } jg;
         struct
         {
             const struct PDB_DS_HEADER* header;
             const struct PDB_DS_TOC*    toc;
+            const struct PDB_DS_ROOT*   root;
         } ds;
     } u;
     void*       (*read_file)(struct pdb_reader*, DWORD);
@@ -150,9 +152,15 @@ static void pdb_exit(struct pdb_reader* reader)
     }
 #endif
     if (reader->read_file == pdb_jg_read_file)
+    {
+        free((char*)reader->u.jg.root);
         free((char*)reader->u.jg.toc);
+    }
     else
+    {
+        free((char*)reader->u.ds.root);
         free((char*)reader->u.ds.toc);
+    }
 }
 
 static void *read_string_table(struct pdb_reader* reader)
@@ -571,7 +579,6 @@ static const char       pdb2[] = "Microsoft C/C++ program database 2.00";
 static void pdb_jg_dump(void)
 {
     struct pdb_reader   reader;
-    struct PDB_JG_ROOT* root = NULL;
 
     /*
      * Read in TOC and well-known files
@@ -589,23 +596,22 @@ static void pdb_jg_dump(void)
            reader.u.jg.header->free_list,
            reader.u.jg.header->total_alloc);
 
-    root = reader.read_file(&reader, 1);
-    
-    if (root)
+    reader.u.jg.root = reader.read_file(&reader, 1);
+    if (reader.u.jg.root)
     {
         printf("Root:\n"
                "\tVersion:       %u\n"
                "\tTimeDateStamp: %08x\n"
                "\tAge:           %08x\n"
                "\tnames:         %.*s\n",
-               root->Version,
-               root->TimeDateStamp,
-               root->Age,
-               (unsigned)root->cbNames,
-               root->names);
+               reader.u.jg.root->Version,
+               reader.u.jg.root->TimeDateStamp,
+               reader.u.jg.root->Age,
+               (unsigned)reader.u.jg.root->cbNames,
+               reader.u.jg.root->names);
 
         /* Check for unknown versions */
-        switch (root->Version)
+        switch (reader.u.jg.root->Version)
         {
         case 19950623:      /* VC 4.0 */
         case 19950814:
@@ -613,37 +619,36 @@ static void pdb_jg_dump(void)
         case 19970604:      /* VC 6.0 */
             break;
         default:
-            printf("-Unknown root block version %d\n", root->Version);
+            printf("-Unknown root block version %d\n", reader.u.jg.root->Version);
         }
-        free(root);
-    }
-    else printf("-Unable to get root\n");
-
-    pdb_dump_types(&reader);
+        pdb_dump_types(&reader);
 #if 0
-    /* segments info, index is unknown */
-    {
-        const void*     segs = pdb_read_file(pdb, toc, 8); /* FIXME which index ??? */
-        const void*     ptr = segs;
-
-        if (segs) while (ptr < segs + toc->file[8].size)
+        /* segments info, index is unknown */
         {
-            printf("Segment %s\n", (const char*)ptr);
-            ptr += (strlen(ptr) + 1 + 3) & ~3;
-            printf("\tdword[0]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[1]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[2]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[3]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[4]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[5]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[6]: %08lx\n", *(DWORD*)ptr); ptr += 4;
-            printf("\tdword[7]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+            const void*     segs = pdb_read_file(pdb, toc, 8); /* FIXME which index ??? */
+            const void*     ptr = segs;
+
+            if (segs) while (ptr < segs + toc->file[8].size)
+            {
+                printf("Segment %s\n", (const char*)ptr);
+                ptr += (strlen(ptr) + 1 + 3) & ~3;
+                printf("\tdword[0]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[1]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[2]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[3]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[4]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[5]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[6]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+                printf("\tdword[7]: %08lx\n", *(DWORD*)ptr); ptr += 4;
+            }
+            free(segs);
         }
-        free(segs);
-    }
 #endif
 
-    pdb_dump_symbols(&reader);
+        pdb_dump_symbols(&reader);
+    }
+    else printf("-Unable to get root\n");
+
     pdb_exit(&reader);
 }
 
@@ -700,7 +705,6 @@ static const char       pdb7[] = "Microsoft C/C++ MSF 7.00";
 static void pdb_ds_dump(void)
 {
     struct pdb_reader   reader;
-    struct PDB_DS_ROOT* root;
 
     pdb_ds_init(&reader);
     printf("Header (DS)\n"
@@ -730,8 +734,8 @@ static void pdb_ds_dump(void)
      * 10: extended FPO data
      * 12: string table (FPO unwinder, files for linetab2...)
      */
-    root = reader.read_file(&reader, 1);
-    if (root)
+    reader.u.ds.root = reader.read_file(&reader, 1);
+    if (reader.u.ds.root)
     {
         const char*     ptr;
 
@@ -741,22 +745,20 @@ static void pdb_ds_dump(void)
                "\tAge:                  %08x\n"
                "\tguid                  %s\n"
                "\tcbNames:              %08x\n",
-               root->Version,
-               root->TimeDateStamp,
-               root->Age,
-               get_guid_str(&root->guid),
-               root->cbNames);
-        for (ptr = &root->names[0]; ptr < &root->names[0] + root->cbNames; ptr += strlen(ptr) + 1)
+               reader.u.ds.root->Version,
+               reader.u.ds.root->TimeDateStamp,
+               reader.u.ds.root->Age,
+               get_guid_str(&reader.u.ds.root->guid),
+               reader.u.ds.root->cbNames);
+        for (ptr = &reader.u.ds.root->names[0]; ptr < &reader.u.ds.root->names[0] + reader.u.ds.root->cbNames; ptr += strlen(ptr) + 1)
             printf("\tString:               %s\n", ptr);
         /* follows an unknown list of DWORDs */
-        free(root);
+        pdb_dump_types(&reader);
+        pdb_dump_symbols(&reader);
+        pdb_dump_fpo(&reader);
     }
     else printf("-Unable to get root\n");
 
-    pdb_dump_types(&reader);
-    pdb_dump_symbols(&reader);
-    pdb_dump_fpo(&reader);
-
     pdb_exit(&reader);
 }
 




More information about the wine-cvs mailing list