summaryrefslogtreecommitdiff
path: root/devtools/test_binaries/PEDUMP.C
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/test_binaries/PEDUMP.C')
-rw-r--r--devtools/test_binaries/PEDUMP.C139
1 files changed, 139 insertions, 0 deletions
diff --git a/devtools/test_binaries/PEDUMP.C b/devtools/test_binaries/PEDUMP.C
new file mode 100644
index 0000000..dd47ff4
--- /dev/null
+++ b/devtools/test_binaries/PEDUMP.C
@@ -0,0 +1,139 @@
+//--------------------
+// PROGRAM: PEDUMP
+// FILE: PEDUMP.C
+// AUTHOR: Matt Pietrek - 1993
+//--------------------
+#include <windows.h>
+#include <stdio.h>
+#include "objdump.h"
+#include "exedump.h"
+#include "extrnvar.h"
+
+// Global variables set here, and used in EXEDUMP.C and OBJDUMP.C
+BOOL fShowRelocations = FALSE;
+BOOL fShowRawSectionData = FALSE;
+BOOL fShowSymbolTable = FALSE;
+BOOL fShowLineNumbers = FALSE;
+
+char HelpText[] =
+"PEDUMP - Win32/COFF .EXE/.OBJ file dumper - 1993 Matt Pietrek\n\n"
+"Syntax: PEDUMP [switches] filename\n\n"
+" /A include everything in dump\n"
+" /H include hex dump of sections\n"
+" /L include line number information\n"
+" /R show base relocations\n"
+" /S show symbol table\n";
+
+//
+// Open up a file, memory map it, and call the appropriate dumping routine
+//
+void DumpFile(LPSTR filename)
+{
+ HANDLE hFile;
+ HANDLE hFileMapping;
+ LPVOID lpFileBase;
+ PIMAGE_DOS_HEADER dosHeader;
+
+ hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+
+ if ( hFile == INVALID_HANDLE_VALUE )
+ {
+ printf("Couldn't open file with CreateFile()\n");
+ return;
+ }
+
+ hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
+ if ( hFileMapping == 0 )
+ {
+ CloseHandle(hFile);
+ printf("Couldn't open file mapping with CreateFileMapping()\n");
+ return;
+ }
+
+ lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
+ if ( lpFileBase == 0 )
+ {
+ CloseHandle(hFileMapping);
+ CloseHandle(hFile);
+ printf("Couldn't map view of file with MapViewOfFile()\n");
+ return;
+ }
+
+ printf("Dump of file %s\n\n", filename);
+
+ dosHeader = (PIMAGE_DOS_HEADER)lpFileBase;
+ if ( dosHeader->e_magic == IMAGE_DOS_SIGNATURE )
+ {
+ DumpExeFile( dosHeader );
+ }
+ else if ( (dosHeader->e_magic == 0x014C) // Does it look like a i386
+ && (dosHeader->e_sp == 0) ) // COFF OBJ file???
+ {
+ // The two tests above aren't what they look like. They're
+ // really checking for IMAGE_FILE_HEADER.Machine == i386 (0x14C)
+ // and IMAGE_FILE_HEADER.SizeOfOptionalHeader == 0;
+
+ DumpObjFile( (PIMAGE_FILE_HEADER)lpFileBase );
+ }
+ else
+ printf("unrecognized file format\n");
+ UnmapViewOfFile(lpFileBase);
+ CloseHandle(hFileMapping);
+ CloseHandle(hFile);
+}
+
+//
+// process all the command line arguments and return a pointer to
+// the filename argument.
+//
+PSTR ProcessCommandLine(int argc, char *argv[])
+{
+ int i;
+
+ for ( i=1; i < argc; i++ )
+ {
+ strupr(argv[i]);
+
+ // Is it a switch character?
+ if ( (argv[i][0] == '-') || (argv[i][0] == '/') )
+ {
+ if ( argv[i][1] == 'A' )
+ {
+ fShowRelocations = TRUE;
+ fShowRawSectionData = TRUE;
+ fShowSymbolTable = TRUE;
+ fShowLineNumbers = TRUE;
+ }
+ else if ( argv[i][1] == 'H' )
+ fShowRawSectionData = TRUE;
+ else if ( argv[i][1] == 'L' )
+ fShowLineNumbers = TRUE;
+ else if ( argv[i][1] == 'R' )
+ fShowRelocations = TRUE;
+ else if ( argv[i][1] == 'S' )
+ fShowSymbolTable = TRUE;
+ }
+ else // Not a switch character. Must be the filename
+ {
+ return argv[i];
+ }
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ PSTR filename;
+
+ if ( argc == 1 )
+ {
+ printf( HelpText );
+ return 1;
+ }
+
+ filename = ProcessCommandLine(argc, argv);
+ if ( filename )
+ DumpFile( filename );
+
+ return 0;
+}