From 40fb62c99f79a151d0b92db6a0da51926c389661 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 17 Jan 2011 21:53:14 +0100 Subject: [PATCH] winedump: Dump streams names information out of ROOT object. --- tools/winedump/pdb.c | 81 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 8 deletions(-) diff --git a/tools/winedump/pdb.c b/tools/winedump/pdb.c index 5bfdfb831d9..e50853068c8 100644 --- a/tools/winedump/pdb.c +++ b/tools/winedump/pdb.c @@ -599,16 +599,51 @@ static void pdb_jg_dump(void) reader.u.jg.root = reader.read_file(&reader, 1); if (reader.u.jg.root) { + DWORD* pdw; + DWORD* ok_bits; + DWORD numok, count; + unsigned i; + printf("Root:\n" "\tVersion: %u\n" "\tTimeDateStamp: %08x\n" "\tAge: %08x\n" - "\tnames: %.*s\n", + "\tnames: %d\n", 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); + (unsigned)reader.u.jg.root->cbNames); + + pdw = (DWORD*)(&reader.u.jg.root->names[0] + reader.u.jg.root->cbNames); + numok = *pdw++; + count = *pdw++; + printf("\tStreams directory:\n" + "\t\tok: %08x\n" + "\t\tcount: %08x\n" + "\t\ttable:\n", + numok, count); + + /* bitfield: first dword is len (in dword), then data */ + ok_bits = pdw; + pdw += *ok_bits++ + 1; + if (*pdw++ != 0) + { + printf("unexpected value\n"); + return; + } + + for (i = 0; i < count; i++) + { + if (ok_bits[i / 32] & (1 << (i % 32))) + { + DWORD string_idx, stream_idx; + string_idx = *pdw++; + stream_idx = *pdw++; + printf("\t\t\t%2d) %-20s => %x\n", i, &reader.u.jg.root->names[string_idx], stream_idx); + numok--; + } + } + if (numok) printf(">>> unmatched present field with found\n"); /* Check for unknown versions */ switch (reader.u.jg.root->Version) @@ -644,7 +679,6 @@ static void pdb_jg_dump(void) free(segs); } #endif - pdb_dump_symbols(&reader); } else printf("-Unable to get root\n"); @@ -737,7 +771,10 @@ static void pdb_ds_dump(void) reader.u.ds.root = reader.read_file(&reader, 1); if (reader.u.ds.root) { - const char* ptr; + DWORD* pdw; + DWORD* ok_bits; + DWORD numok, count; + unsigned i; printf("Root:\n" "\tVersion: %u\n" @@ -750,9 +787,37 @@ static void pdb_ds_dump(void) 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 */ + pdw = (DWORD*)(&reader.u.ds.root->names[0] + reader.u.ds.root->cbNames); + numok = *pdw++; + count = *pdw++; + printf("\tStreams directory:\n" + "\t\tok: %08x\n" + "\t\tcount: %08x\n" + "\t\ttable:\n", + numok, count); + + /* bitfield: first dword is len (in dword), then data */ + ok_bits = pdw; + pdw += *ok_bits++ + 1; + if (*pdw++ != 0) + { + printf("unexpected value\n"); + return; + } + + for (i = 0; i < count; i++) + { + if (ok_bits[i / 32] & (1 << (i % 32))) + { + DWORD string_idx, stream_idx; + string_idx = *pdw++; + stream_idx = *pdw++; + printf("\t\t\t%2d) %-20s => %x\n", i, &reader.u.ds.root->names[string_idx], stream_idx); + numok--; + } + } + if (numok) printf(">>> unmatched present field with found\n"); + pdb_dump_types(&reader); pdb_dump_symbols(&reader); pdb_dump_fpo(&reader);