From d38fc0c36bc9530fdebf709316a73ad6db5e2db5 Mon Sep 17 00:00:00 2001 From: midipix Date: Fri, 9 Apr 2021 07:01:53 +0000 Subject: driver: added --hdrdump support. --- src/driver/pe_driver_ctx.c | 37 +++++++++++++++++++++++++++++++++++++ src/internal/perk_driver_impl.h | 1 + src/skin/pe_skin_default.c | 10 ++++++++++ 3 files changed, 48 insertions(+) (limited to 'src') diff --git a/src/driver/pe_driver_ctx.c b/src/driver/pe_driver_ctx.c index 486284c..bc20b6d 100644 --- a/src/driver/pe_driver_ctx.c +++ b/src/driver/pe_driver_ctx.c @@ -215,6 +215,43 @@ int pe_get_driver_ctx( case TAG_DSOSYMS: cctx.fmtflags |= PERK_OUTPUT_MDSO_SYMS; break; + + case TAG_HDRDUMP: + if (!entry->arg) { + cctx.hdrdump = 0; + cctx.hdrdump = ~cctx.hdrdump; + } else if (!strcmp(entry->arg,"dos")) { + cctx.hdrdump = PERK_HDRDUMP_IMAGE_DOS_HEADER; + } else if (!strcmp(entry->arg,"image.dos")) { + cctx.hdrdump = PERK_HDRDUMP_IMAGE_DOS_HEADER; + } else if (!strcmp(entry->arg,"coff")) { + cctx.hdrdump = PERK_HDRDUMP_COFF_IMAGE_HEADER; + cctx.hdrdump |= PERK_HDRDUMP_COFF_OBJECT_HEADER; + cctx.hdrdump |= PERK_HDRDUMP_COFF_OPT_HEADER; + } else if (!strcmp(entry->arg,"coff.image")) { + cctx.hdrdump = PERK_HDRDUMP_COFF_IMAGE_HEADER; + } else if (!strcmp(entry->arg,"coff.obj")) { + cctx.hdrdump = PERK_HDRDUMP_COFF_OBJECT_HEADER; + } else if (!strcmp(entry->arg,"coff.object")) { + cctx.hdrdump = PERK_HDRDUMP_COFF_OBJECT_HEADER; + } else if (!strcmp(entry->arg,"coff.opt")) { + cctx.hdrdump = PERK_HDRDUMP_COFF_OPT_HEADER; + } else if (!strcmp(entry->arg,"coff.optional")) { + cctx.hdrdump = PERK_HDRDUMP_COFF_OPT_HEADER; + } else if (!strcmp(entry->arg,"sectbl")) { + cctx.hdrdump = PERK_HDRDUMP_SECTION_TABLE; + } else if (!strcmp(entry->arg,"section.table")) { + cctx.hdrdump = PERK_HDRDUMP_SECTION_TABLE; + } else if (!strcmp(entry->arg,"exphdr")) { + cctx.hdrdump = PERK_HDRDUMP_EXPORT_HEADER; + } else if (!strcmp(entry->arg,"export.header")) { + cctx.hdrdump = PERK_HDRDUMP_EXPORT_HEADER; + } else if (!strcmp(entry->arg,"imptbl")) { + cctx.hdrdump = PERK_HDRDUMP_IMPORT_TABLE; + } else if (!strcmp(entry->arg,"import.table")) { + cctx.hdrdump = PERK_HDRDUMP_IMPORT_TABLE; + } + break; } } else nunits++; diff --git a/src/internal/perk_driver_impl.h b/src/internal/perk_driver_impl.h index b17b7be..dafad86 100644 --- a/src/internal/perk_driver_impl.h +++ b/src/internal/perk_driver_impl.h @@ -27,6 +27,7 @@ enum app_tags { TAG_IMPSYMS, TAG_DSOLIBS, TAG_DSOSYMS, + TAG_HDRDUMP, }; struct pe_driver_ctx_impl { diff --git a/src/skin/pe_skin_default.c b/src/skin/pe_skin_default.c index 60663ea..963af6e 100644 --- a/src/skin/pe_skin_default.c +++ b/src/skin/pe_skin_default.c @@ -40,5 +40,15 @@ const struct argv_option pe_default_options[] = { "list .dsometa (mdso) dependency libraries " "along with referenced symbols"}, + {"hdrdump", 'X',TAG_HDRDUMP,ARGV_OPTARG_OPTIONAL,0, + "dos|image.dos|" + "coff|coff.image|coff.object|coff.optional|" + "sectbl|section.table|" + "exphdr|export.header|" + "imptbl|import.table",0, + "output struct-based information for " + "either all headers (the default) " + "or a specific header"}, + {0,0,0,0,0,0,0,0} }; -- cgit v1.2.3