[PATCH 5/9] [WineDump]: making use of PDB_STREAM_INDEXES in order to get rid of hardwired indexes
Eric Pouech
eric.pouech at orange.fr
Mon Jan 17 14:53:31 CST 2011
A+
---
tools/winedump/pdb.c | 77 +++++++++++++++++++++++++++++---------------------
1 files changed, 45 insertions(+), 32 deletions(-)
diff --git a/tools/winedump/pdb.c b/tools/winedump/pdb.c
index 0ba5b46..9f90c89 100644
--- a/tools/winedump/pdb.c
+++ b/tools/winedump/pdb.c
@@ -222,7 +222,7 @@ static void *read_string_table(struct pdb_reader* reader)
return NULL;
}
-static void pdb_dump_symbols(struct pdb_reader* reader)
+static void pdb_dump_symbols(struct pdb_reader* reader, PDB_STREAM_INDEXES* sidx)
{
PDB_SYMBOLS* symbols;
unsigned char* modimage;
@@ -230,8 +230,10 @@ static void pdb_dump_symbols(struct pdb_reader* reader)
char* filesimage;
DWORD filessize = 0;
- symbols = reader->read_file(reader, 3);
+ sidx->FPO = sidx->unk0 = sidx->unk1 = sidx->unk2 = sidx->unk3 = sidx->segments =
+ sidx->unk4 = sidx->unk5 = sidx->unk6 = sidx->FPO_EXT = sidx->unk7 = -1;
+ symbols = reader->read_file(reader, 3);
if (!symbols) return;
switch (symbols->version)
@@ -377,32 +379,33 @@ static void pdb_dump_symbols(struct pdb_reader* reader)
}
if (symbols->stream_index_size)
{
- const PDB_STREAM_INDEXES_OLD* sidx_old;
- const PDB_STREAM_INDEXES* sidx;
-
printf("\t------------stream indexes--------------\n");
switch (symbols->stream_index_size)
{
case sizeof(PDB_STREAM_INDEXES_OLD):
- sidx_old = (const PDB_STREAM_INDEXES_OLD*)((const char*)symbols + sizeof(PDB_SYMBOLS) +
- symbols->module_size + symbols->offset_size +
- symbols->hash_size + symbols->srcmodule_size +
- symbols->pdbimport_size + symbols->unknown2_size);
+ /* PDB_STREAM_INDEXES is a superset of PDB_STREAM_INDEX_OLD
+ * FIXME: to be confirmed when all fields are fully understood
+ */
+ memcpy(sidx,
+ (const char*)symbols + sizeof(PDB_SYMBOLS) + symbols->module_size +
+ symbols->offset_size + symbols->hash_size + symbols->srcmodule_size +
+ symbols->pdbimport_size + symbols->unknown2_size,
+ sizeof(PDB_STREAM_INDEXES_OLD));
printf("\tFPO: %04x\n"
"\t?: %04x\n"
"\t?: %04x\n"
"\t?: %04x\n"
"\t?: %04x\n"
"\tSegments: %04x\n",
- sidx_old->FPO, sidx_old->unk0, sidx_old->unk1, sidx_old->unk2, sidx_old->unk3,
- sidx_old->segments);
+ sidx->FPO, sidx->unk0, sidx->unk1, sidx->unk2, sidx->unk3,
+ sidx->segments);
break;
case sizeof(PDB_STREAM_INDEXES):
- sidx = (const PDB_STREAM_INDEXES*)((const char*)symbols + sizeof(PDB_SYMBOLS) +
- symbols->module_size + symbols->offset_size +
- symbols->hash_size + symbols->srcmodule_size +
- symbols->pdbimport_size + symbols->unknown2_size);
-
+ memcpy(sidx,
+ (const char*)symbols + sizeof(PDB_SYMBOLS) + symbols->module_size +
+ symbols->offset_size + symbols->hash_size + symbols->srcmodule_size +
+ symbols->pdbimport_size + symbols->unknown2_size,
+ sizeof(*sidx));
printf("\tFPO: %04x\n"
"\t?: %04x\n"
"\t?: %04x\n"
@@ -613,16 +616,15 @@ static void pdb_dump_types(struct pdb_reader* reader)
free(types);
}
-static void pdb_dump_fpo(struct pdb_reader* reader)
+static void pdb_dump_fpo(struct pdb_reader* reader, unsigned stream_idx)
{
FPO_DATA* fpo;
- PDB_FPO_DATA* fpoext;
- unsigned i, size, strsize;
- char* strbase;
+ unsigned i, size;
const char* frame_type[4] = {"Fpo", "Trap", "Tss", "NonFpo"};
- fpo = reader->read_file(reader, 5);
- size = pdb_get_file_size(reader, 5);
+ if (stream_idx == (WORD)-1) return;
+ fpo = reader->read_file(reader, stream_idx);
+ size = pdb_get_file_size(reader, stream_idx);
if (fpo && (size % sizeof(*fpo)) == 0)
{
size /= sizeof(*fpo);
@@ -636,13 +638,21 @@ static void pdb_dump_fpo(struct pdb_reader* reader)
}
}
free(fpo);
+}
+
+static void pdb_dump_fpo_ext(struct pdb_reader* reader, unsigned stream_idx)
+{
+ PDB_FPO_DATA* fpoext;
+ unsigned i, size, strsize;
+ char* strbase;
+ if (stream_idx == (WORD)-1) return;
strbase = read_string_table(reader);
if (!strbase) return;
strsize = *(const DWORD*)(strbase + 8);
- fpoext = reader->read_file(reader, 10);
- size = pdb_get_file_size(reader, 10);
+ fpoext = reader->read_file(reader, stream_idx);
+ size = pdb_get_file_size(reader, stream_idx);
if (fpoext && (size % sizeof(*fpoext)) == 0)
{
size /= sizeof(*fpoext);
@@ -689,6 +699,7 @@ static void pdb_jg_dump(void)
DWORD* ok_bits;
DWORD numok, count;
unsigned i;
+ PDB_STREAM_INDEXES sidx;
printf("Root:\n"
"\tVersion: %u\n"
@@ -743,6 +754,7 @@ static void pdb_jg_dump(void)
printf("-Unknown root block version %d\n", reader.u.jg.root->Version);
}
pdb_dump_types(&reader);
+ pdb_dump_symbols(&reader, &sidx);
#if 0
/* segments info, index is unknown */
{
@@ -765,7 +777,6 @@ static void pdb_jg_dump(void)
free(segs);
}
#endif
- pdb_dump_symbols(&reader);
}
else printf("-Unable to get root\n");
@@ -849,11 +860,11 @@ static void pdb_ds_dump(void)
* 2: types
* 3: modules
* other known streams:
- * string table: it's index is in the stream table from ROOT object under "/names"
- * those other streams are likely not to have a fixed stream number
- * 5: FPO data
- * 8: segments
- * 10: extended FPO data
+ * - string table: it's index is in the stream table from ROOT object under "/names"
+ * those streams get their indexes out of the PDB_STREAM_INDEXES object
+ * - FPO data
+ * - segments
+ * - extended FPO data
*/
reader.u.ds.root = reader.read_file(&reader, 1);
if (reader.u.ds.root)
@@ -862,6 +873,7 @@ static void pdb_ds_dump(void)
DWORD* ok_bits;
DWORD numok, count;
unsigned i;
+ PDB_STREAM_INDEXES sidx;
printf("Root:\n"
"\tVersion: %u\n"
@@ -906,8 +918,9 @@ static void pdb_ds_dump(void)
if (numok) printf(">>> unmatched present field with found\n");
pdb_dump_types(&reader);
- pdb_dump_symbols(&reader);
- pdb_dump_fpo(&reader);
+ pdb_dump_symbols(&reader, &sidx);
+ pdb_dump_fpo(&reader, sidx.FPO);
+ pdb_dump_fpo_ext(&reader, sidx.FPO_EXT);
}
else printf("-Unable to get root\n");
More information about the wine-patches
mailing list