Eric Pouech : winedump: Added support for dumping FPO streams.

Alexandre Julliard julliard at winehq.org
Mon Jan 10 10:55:21 CST 2011


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

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Sat Jan  8 14:03:52 2011 +0100

winedump: Added support for dumping FPO streams.

---

 include/wine/mscvpdb.h |   16 +++++++++++
 tools/winedump/pdb.c   |   66 +++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 78 insertions(+), 4 deletions(-)

diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index 2d5b9c9..59ce8a5 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -1917,6 +1917,22 @@ typedef struct _PDB_SYMBOLS
     DWORD       resvd[5];
 } PDB_SYMBOLS, *PPDB_SYMBOLS;
 
+typedef struct _PDB_FPO_DATA
+{
+    DWORD       start;
+    DWORD       func_size;
+    DWORD       locals_size;
+    DWORD       params_size;
+    DWORD       maxstack_size;
+    DWORD       str_offset;
+    WORD        prolog_size;
+    WORD        savedregs_size;
+#define PDB_FPO_DFL_SEH         0x00000001
+#define PDB_FPO_DFL_EH          0x00000002
+#define PDB_FPO_DFL_IN_BLOCK    0x00000004
+    DWORD       flags;
+} PDB_FPO_DATA;
+
 #include "poppack.h"
 
 /* ----------------------------------------------
diff --git a/tools/winedump/pdb.c b/tools/winedump/pdb.c
index 5098d85..89146d5 100644
--- a/tools/winedump/pdb.c
+++ b/tools/winedump/pdb.c
@@ -508,6 +508,59 @@ static void pdb_dump_types(struct pdb_reader* reader)
     free(types);
 }
 
+static void pdb_dump_fpo(struct pdb_reader* reader)
+{
+    FPO_DATA*           fpo;
+    PDB_FPO_DATA*       fpoext;
+    unsigned            i, size, strsize;
+    char*               strbase;
+    const char*         frame_type[4] = {"Fpo", "Trap", "Tss", "NonFpo"};
+
+    fpo = reader->read_file(reader, 5);
+    size = pdb_get_file_size(reader, 5);
+    if (fpo && (size % sizeof(*fpo)) == 0)
+    {
+        size /= sizeof(*fpo);
+        printf("FPO data:\n\t   Start   Length #loc #pmt #prolog #reg frame  SEH /BP\n");
+        for (i = 0; i < size; i++)
+        {
+            printf("\t%08x %08x %4d %4d %7d %4d %6s  %c   %c\n",
+                   fpo[i].ulOffStart, fpo[i].cbProcSize, fpo[i].cdwLocals, fpo[i].cdwParams,
+                   fpo[i].cbProlog, fpo[i].cbRegs, frame_type[fpo[i].cbFrame],
+                   fpo[i].fHasSEH ? 'Y' : 'N', fpo[i].fUseBP ? 'Y' : 'N');
+        }
+    }
+    free(fpo);
+
+    strbase = reader->read_file(reader, 12);   /* FIXME: really fixed ??? */
+    if (!strbase) return;
+
+    if (*(const DWORD*)strbase != 0xeffeeffe)
+    {
+        printf("wrong header %x expecting 0xeffeeffe\n", *(const DWORD*)strbase);
+        free(strbase);
+        return;
+    }
+    strsize = *(const DWORD*)(strbase + 8);
+    fpoext = reader->read_file(reader, 10);
+    size = pdb_get_file_size(reader, 10);
+    if (fpoext && (size % sizeof(*fpoext)) == 0)
+    {
+        size /= sizeof(*fpoext);
+        printf("FPO data (extended):\n"
+               "\t   Start   Length   Locals   Params MaxStack Prolog #SavedRegs    Flags Command\n");
+        for (i = 0; i < size; i++)
+        {
+            printf("\t%08x %08x %8x %8x %8x %6x   %8x %08x %s\n",
+                   fpoext[i].start, fpoext[i].func_size, fpoext[i].locals_size, fpoext[i].params_size,
+                   fpoext[i].maxstack_size, fpoext[i].prolog_size, fpoext[i].savedregs_size, fpoext[i].flags,
+                   fpoext[i].str_offset < strsize ? strbase + 12 + fpoext[i].str_offset : "<out of bounds>");
+        }
+    }
+    free(fpoext);
+    free(strbase);
+}
+
 static const char       pdb2[] = "Microsoft C/C++ program database 2.00";
 
 static void pdb_jg_dump(void)
@@ -662,10 +715,14 @@ static void pdb_ds_dump(void)
            reader.u.ds.header->toc_page);
 
     /* files:
-     * 0: JG says old toc pages, I'd say free pages (tbc, low prio)
-     * 1: root structure
-     * 2: types
-     * 3: modules
+     *  0: JG says old toc pages, I'd say free pages (tbc, low prio)
+     *  1: root structure
+     *  2: types
+     *  3: modules
+     *  5: FPO data
+     *  8: segments
+     * 10: extended FPO data
+     * 12: string table (FPO unwinder, files for linetab2...)
      */
     root = reader.read_file(&reader, 1);
     if (root)
@@ -692,6 +749,7 @@ static void pdb_ds_dump(void)
 
     pdb_dump_types(&reader);
     pdb_dump_symbols(&reader);
+    pdb_dump_fpo(&reader);
 
     pdb_exit(&reader);
 }




More information about the wine-cvs mailing list