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