Skip to content

Commit

Permalink
Merge PDB functions and modules
Browse files Browse the repository at this point in the history
  • Loading branch information
dd86k committed Jan 7, 2025
1 parent e78c561 commit 81bd793
Show file tree
Hide file tree
Showing 6 changed files with 360 additions and 309 deletions.
22 changes: 10 additions & 12 deletions dumper/dumper.d
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ int dump_file(const(char)* path) {
if (SETTING(Setting.extractAny) == 0) {
print_string("filename", path);
print_u64("filesize", adbg_object_filesize(o));
print_string("type", adbg_object_type_name(o));
print_string("shortname", adbg_object_type_shortname(o));
print_string("type", adbg_object_format_name(o));
print_string("shortname", adbg_object_format_shortname(o));
}
final switch (o.format) with (AdbgObject) {
case mz: return dump_mz(o);
Expand All @@ -150,15 +150,14 @@ int dump_file(const(char)* path) {
case lx: return dump_lx(o);
case elf: return dump_elf(o);
case macho: return dump_macho(o);
case pdb20: return dump_pdb20(o);
case pdb70: return dump_pdb70(o);
case pdb: return dump_pdb(o);
case archive: return dump_archive(o);
case mdmp: return dump_minidump(o);
case dmp: return dump_dmp(o);
case omf: return dump_omf(o);
case coff: return dump_coff(o);
case mscoff: return dump_mscoff(o);
case unknown: assert(0, "Unknown object type"); // Raw/unknown
case unknown: assert(0, "Unsupported object type");
}
}

Expand All @@ -171,21 +170,20 @@ int dump_file(const(char)* path) {
printf("%s: ", path);

if (SETTING(Setting.shortName)) {
puts(SAFEVAL(adbg_object_type_shortname(o)));
puts(SAFEVAL(adbg_object_format_shortname(o)));
return 0;
}

// Otherwise, make a basic summary
printf("%s, %s", adbg_object_type_name(o), adbg_object_kind_string(o));
printf("%s, %s", adbg_object_format_name(o), adbg_object_kind_string(o));

// Print machine type used for object
const(char)* machstr = adbg_object_machine_string(o);
if (machstr)
printf(", %s", machstr);
if (machstr) printf(", %s", machstr);

// Print OS ABI type used for object
const(char)* osabistr = adbg_object_osabi_string(o);
if (osabistr)
printf(", %s", osabistr);
if (osabistr) printf(", %s", osabistr);

putchar('\n');
return 0;
Expand All @@ -197,7 +195,7 @@ const(char)* SAFEVAL(const(char)* value) {

private immutable {
/// Padding spacing to use in characters
// PE32 has fields like MinorOperatingSystemVersion (27 chars)
// PE32 has long field names like MinorOperatingSystemVersion (27 chars)
int __field_padding = -28;
/// Number of columns to produce in hexdumps, in bytes.
int __columns = 16;
Expand Down
3 changes: 1 addition & 2 deletions dumper/format/package.d
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ public import
format.pe,
format.elf,
format.macho,
format.pdb70,
format.pdb20,
format.pdb,
format.mdmp,
format.dmp,
format.omf,
Expand Down
117 changes: 67 additions & 50 deletions dumper/format/pdb70.d → dumper/format/pdb.d
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
/// Authors: dd86k <[email protected]>
/// Copyright: © dd86k <[email protected]>
/// License: BSD-3-Clause-Clear
module format.pdb70;
module format.pdb;

import adbg.objectserver;
import adbg.objects.pdb;
Expand All @@ -26,68 +26,85 @@ import common.errormgmt;

extern (C):

int dump_pdb70(adbg_object_t *o) {
int dump_pdb(adbg_object_t *o) {
if (SELECTED(Select.headers))
dump_pdb70_header(o);
dump_pdb_header(o);
if (opt_pdb_stream)
dump_pdb70_stream(o, atoi(opt_pdb_stream));
dump_pdb_stream(o, atoi(opt_pdb_stream));
return 0;
}

private:

void dump_pdb70_header(adbg_object_t *o) {
void dump_pdb_header(adbg_object_t *o) {
print_header("Header");

pdb70_file_header_t *header = adbg_object_pdb70_header(o);

print_stringl("Magic", header.Magic.ptr, 24);
print_u32("BlockSize", header.BlockSize);
print_u32("FreeIndex", header.FreeIndex);
print_u32("BlockCount", header.BlockCount);
print_u32("DirectorySize", header.DirectorySize);
print_x32("Unknown", header.Unknown);
print_x32("DirectoryOffset", header.DirectoryOffset);

//TODO: Consider moving this information to another selector
print_header("FPM information");
ubyte *fpm = adbg_object_pdb70_fpm(o);
size_t fpmcount = adbg_object_pdb70_fpmcount(o);
for (size_t fpmi; fpmi < fpmcount; ++fpmi) {
char[48] buf = void;
uint blocknum = cast(uint)fpmi * 8;
snprintf(buf.ptr, 48, "Block %u-%u", blocknum, blocknum + 7);
print_x8(buf.ptr, fpm[fpmi]);
}

print_header("Stream information");
uint count = adbg_object_pdb70_total_count(o);
print_columns("Stream Number", "Size".ptr, "BlockIDs".ptr);
//print_u32("Stream count", count);
for (uint i; i < count; ++i, putchar('\n')) {
// Print stream number
char[48] buf = void;
snprintf(buf.ptr, 48, "Stream %u", i);
print_name(buf.ptr);
final switch (adbg_object_pdb_version(o)) with(PdbVersion) {
case pdb20:
pdb20_file_header_t *header = adbg_object_pdb20_header(o);

uint size = adbg_object_pdb70_stream_size(o, i);
with (header) {
print_stringl("Magic", header.Magic.ptr, 37);
print_u32("BlockSize", BlockSize);
print_u16("StartPage", StartPage);
print_u16("BlockCount", BlockCount);
print_u32("RootSize", RootSize);
print_x32("Reserved", Reserved);
print_u16("RootNumber", RootNumber);
}
break;
case pdb70:
pdb70_file_header_t *header = adbg_object_pdb70_header(o);

// Skip if empty
if (size == 0 || size == PDB_BLOCK_SIZE_UNUSED)
continue;
print_stringl("Magic", header.Magic.ptr, 24);
print_u32("BlockSize", header.BlockSize);
print_u32("FreeIndex", header.FreeIndex);
print_u32("BlockCount", header.BlockCount);
print_u32("DirectorySize", header.DirectorySize);
print_x32("Unknown", header.Unknown);
print_x32("DirectoryOffset", header.DirectoryOffset);

uint *blocks = adbg_object_pdb70_stream_blocks(o, i);
if (blocks == null)
continue;
//TODO: Consider moving this information to another selector/option
print_header("FPM information");
ubyte *fpm = adbg_object_pdb70_fpm(o);
size_t fpmcount = adbg_object_pdb70_fpmcount(o);
for (size_t fpmi; fpmi < fpmcount; ++fpmi) {
char[48] buf = void;
uint blocknum = cast(uint)fpmi * 8;
snprintf(buf.ptr, 48, "Block %u-%u", blocknum, blocknum + 7);
print_x8(buf.ptr, fpm[fpmi]);
}

// Print stream size + associated blocks
uint blkcount = adbg_object_pdb70_stream_block_count(o, i);
printf("%u\t(", size);
for (uint bi; bi < blkcount; ++bi) {
if (bi) putchar(',');
printf("%u", blocks[bi]);
print_header("Stream information");
uint count = adbg_object_pdb70_total_count(o);
print_columns("Stream Number", "Size".ptr, "BlockIDs".ptr);
//print_u32("Stream count", count);
for (uint i; i < count; ++i, putchar('\n')) {
// Print stream number
char[48] buf = void;
snprintf(buf.ptr, 48, "Stream %u", i);
print_name(buf.ptr);

uint size = adbg_object_pdb70_stream_size(o, i);

// Skip if empty
if (size == 0 || size == PDB_BLOCK_SIZE_UNUSED)
continue;

uint *blocks = adbg_object_pdb70_stream_blocks(o, i);
if (blocks == null)
continue;

// Print stream size + associated blocks
uint blkcount = adbg_object_pdb70_stream_block_count(o, i);
printf("%u\t(", size);
for (uint bi; bi < blkcount; ++bi) {
if (bi) putchar(',');
printf("%u", blocks[bi]);
}
printf(")");
}
printf(")");
break;
}
}

Expand All @@ -105,7 +122,7 @@ const(char)* pdb_stream_name(size_t i) {
return StreamNames[i].ptr;
}

void dump_pdb70_stream(adbg_object_t *o, int num) {
void dump_pdb_stream(adbg_object_t *o, int num) {
switch (num) { // specific
case 1: dump_pdb70_stream_pdb(o); return;
case 2, 4: dump_pdb70_stream_tpi_ipi(o, num); return;
Expand Down
39 changes: 0 additions & 39 deletions dumper/format/pdb20.d

This file was deleted.

Loading

0 comments on commit 81bd793

Please sign in to comment.