From d75e0cd1f002e4c794a71acc93c5f7ddcd2ce907 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Fri, 5 Jan 2007 21:42:19 +0100 Subject: [PATCH] winedump: Print some basic info for pure DOS file (which fixes segfault while reading DOS files). --- tools/winedump/Makefile.in | 1 + tools/winedump/dos.c | 70 ++++++++++++++++++++++++++++++++++++++ tools/winedump/dump.c | 4 +-- tools/winedump/winedump.h | 1 + 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tools/winedump/dos.c diff --git a/tools/winedump/Makefile.in b/tools/winedump/Makefile.in index 32a2a1d85aa..63af00b5860 100644 --- a/tools/winedump/Makefile.in +++ b/tools/winedump/Makefile.in @@ -10,6 +10,7 @@ MODULE = none C_SRCS = \ debug.c \ + dos.c \ dump.c \ emf.c \ le.c \ diff --git a/tools/winedump/dos.c b/tools/winedump/dos.c new file mode 100644 index 00000000000..8424f790e92 --- /dev/null +++ b/tools/winedump/dos.c @@ -0,0 +1,70 @@ +/* + * DOS dumping utility + * + * Copyright 2006 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#include + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "winedump.h" + +void dos_dump(void) +{ + const IMAGE_DOS_HEADER* dh; + + if ((dh = PRD(0, sizeof(IMAGE_DOS_HEADER)))) + { + printf("DOS image:\n"); + printf(" Signature: %.2s\n", (const char*)&dh->e_magic); + printf(" Bytes on last page: %u\n", dh->e_cblp); + printf(" Number of pages: %u\n", dh->e_cp); + printf(" Relocations: %u\n", dh->e_crlc); + printf(" Size of header: %u\n", dh->e_cparhdr); + printf(" Min extra paragraphs: %u\n", dh->e_minalloc); + printf(" Max extra paragraphs: %u\n", dh->e_maxalloc); + printf(" Initial stack: %x:%x\n", dh->e_ss, dh->e_sp); + printf(" Checksum: %x\n", dh->e_csum); + printf(" Initial address: %x:%x\n", dh->e_cs, dh->e_ip); + printf(" Relocation (file): %u\n", dh->e_lfarlc); + printf(" Overlay number: %u\n", dh->e_ovno); + printf(" OEM id(info): %x(%x)\n", dh->e_oemid, dh->e_oeminfo); + printf(" Offset to ext header: %x\n", dh->e_lfanew); + } +} diff --git a/tools/winedump/dump.c b/tools/winedump/dump.c index 6cd9c9e4821..21074d10efb 100644 --- a/tools/winedump/dump.c +++ b/tools/winedump/dump.c @@ -151,7 +151,7 @@ static const struct dumper } dumpers[] = { - {SIG_DOS, get_kind_exec, NULL}, + {SIG_DOS, get_kind_exec, dos_dump}, {SIG_PE, get_kind_exec, pe_dump}, {SIG_DBG, get_kind_dbg, dbg_dump}, {SIG_PDB, get_kind_pdb, pdb_dump}, @@ -160,7 +160,7 @@ dumpers[] = {SIG_COFFLIB, get_kind_lib, lib_dump}, {SIG_MDMP, get_kind_mdmp, mdmp_dump}, {SIG_LNK, get_kind_lnk, lnk_dump}, - {SIG_EMF, get_kind_emf, emf_dump}, + {SIG_EMF, get_kind_emf, emf_dump}, {SIG_UNKNOWN, NULL, NULL} /* sentinel */ }; diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h index 1da28d7f7ee..540bbd02215 100644 --- a/tools/winedump/winedump.h +++ b/tools/winedump/winedump.h @@ -241,6 +241,7 @@ void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *, UINT); void dump_section(const IMAGE_SECTION_HEADER *); enum FileSig get_kind_exec(void); +void dos_dump( void ); void pe_dump( void ); void ne_dump( void ); void le_dump( void );