Module: wine Branch: master Commit: 982775ddae84dcb6fa92683703dca23664eb4722 URL: http://source.winehq.org/git/wine.git/?a=commit;h=982775ddae84dcb6fa92683703...
Author: Eric Pouech eric.pouech@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); }