[4/7] winedump: Handle properly partial optional COFF headers, export dump_file_header() and dump_optional_header() for use outside of pe.c

Dmitry Timoshkov dmitry at codeweavers.com
Thu Dec 7 07:43:15 CST 2006


Hello,

Changelog:
    winedump: Handle properly partial optional COFF headers, export
    dump_file_header() and dump_optional_header() for use outside of pe.c.

---
 tools/winedump/pe.c       |   63 ++++++++++++++++++++++++++++++--------------
 tools/winedump/winedump.h |    7 +++++
 2 files changed, 50 insertions(+), 20 deletions(-)

diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c
index a5bba57..b3360f4 100644
--- a/tools/winedump/pe.c
+++ b/tools/winedump/pe.c
@@ -91,7 +91,7 @@ static const IMAGE_NT_HEADERS32 *get_nt_
     const IMAGE_DOS_HEADER *dos;
     dos = PRD(0, sizeof(*dos));
     if (!dos) return NULL;
-    return PRD(dos->e_lfanew, sizeof(IMAGE_NT_HEADERS32));
+    return PRD(dos->e_lfanew, sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER));
 }
 
 static int is_fake_dll( void )
@@ -223,8 +223,16 @@ static inline void print_datadirectory(D
     }
 }
 
-static void dump_optional_header32(const IMAGE_OPTIONAL_HEADER32 *optionalHeader)
+static void dump_optional_header32(const IMAGE_OPTIONAL_HEADER32 *image_oh, UINT header_size)
 {
+    IMAGE_OPTIONAL_HEADER32 oh;
+    const IMAGE_OPTIONAL_HEADER32 *optionalHeader;
+
+    /* in case optional header is missing or partial */
+    memset(&oh, 0, sizeof(oh));
+    memcpy(&oh, image_oh, min(header_size, sizeof(oh)));
+    optionalHeader = &oh;
+
     print_word("Magic", optionalHeader->Magic);
     print_ver("linker version",
               optionalHeader->MajorLinkerVersion, optionalHeader->MinorLinkerVersion);
@@ -257,10 +265,19 @@ static void dump_optional_header32(const
     print_dword("RVAs & sizes", optionalHeader->NumberOfRvaAndSizes);
     printf("\n");
     print_datadirectory(optionalHeader->NumberOfRvaAndSizes, optionalHeader->DataDirectory);
+    printf("\n");
 }
 
-static void dump_optional_header64(const IMAGE_OPTIONAL_HEADER64 *optionalHeader)
+static void dump_optional_header64(const IMAGE_OPTIONAL_HEADER64 *image_oh, UINT header_size)
 {
+    IMAGE_OPTIONAL_HEADER64 oh;
+    const IMAGE_OPTIONAL_HEADER64 *optionalHeader;
+
+    /* in case optional header is missing or partial */
+    memset(&oh, 0, sizeof(oh));
+    memcpy(&oh, image_oh, min(header_size, sizeof(oh)));
+    optionalHeader = &oh;
+
     print_word("Magic", optionalHeader->Magic);
     print_ver("linker version",
               optionalHeader->MajorLinkerVersion, optionalHeader->MinorLinkerVersion);
@@ -292,14 +309,29 @@ static void dump_optional_header64(const
     print_dword("RVAs & sizes", optionalHeader->NumberOfRvaAndSizes);
     printf("\n");
     print_datadirectory(optionalHeader->NumberOfRvaAndSizes, optionalHeader->DataDirectory);
+    printf("\n");
 }
 
-static	void	dump_pe_header(void)
+void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *optionalHeader, UINT header_size)
 {
-    const IMAGE_FILE_HEADER     *fileHeader;
+    printf("Optional Header (%s)\n", get_magic_type(optionalHeader->Magic));
+
+    switch(optionalHeader->Magic) {
+        case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
+            dump_optional_header32(optionalHeader, header_size);
+            break;
+        case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
+            dump_optional_header64((const IMAGE_OPTIONAL_HEADER64 *)optionalHeader, header_size);
+            break;
+        default:
+            printf("  Unknown optional header magic: 0x%-4X\n", optionalHeader->Magic);
+            break;
+    }
+}
 
+void dump_file_header(const IMAGE_FILE_HEADER *fileHeader)
+{
     printf("File Header\n");
-    fileHeader = &PE_nt_headers->FileHeader;
 
     printf("  Machine:                      %04X (%s)\n",
 	   fileHeader->Machine, get_machine_str(fileHeader->Machine));
@@ -330,21 +362,12 @@ static	void	dump_pe_header(void)
     X(IMAGE_FILE_BYTES_REVERSED_HI, 	"BYTES_REVERSED_HI");
 #undef X
     printf("\n");
+}
 
-    /* hope we have the right size */
-    printf("Optional Header (%s)\n", get_magic_type(PE_nt_headers->OptionalHeader.Magic));
-    switch(PE_nt_headers->OptionalHeader.Magic) {
-        case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
-            dump_optional_header32((const IMAGE_OPTIONAL_HEADER32*)&PE_nt_headers->OptionalHeader);
-            break;
-        case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
-            dump_optional_header64((const IMAGE_OPTIONAL_HEADER64*)&PE_nt_headers->OptionalHeader);
-            break;
-        default:
-            printf("  Unknown header magic: 0x%-4X\n", PE_nt_headers->OptionalHeader.Magic);
-            break;
-    }
-    printf("\n");
+static	void	dump_pe_header(void)
+{
+    dump_file_header(&PE_nt_headers->FileHeader);
+    dump_optional_header((const IMAGE_OPTIONAL_HEADER32*)&PE_nt_headers->OptionalHeader, PE_nt_headers->FileHeader.SizeOfOptionalHeader);
 }
 
 static	void	dump_sections(const void* addr, unsigned num_sect)
diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h
index 0d2a051..e48f252 100644
--- a/tools/winedump/winedump.h
+++ b/tools/winedump/winedump.h
@@ -47,6 +47,11 @@
 #include <assert.h>
 #include <stdarg.h>
 
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "windef.h"
+#include "winbase.h"
+
 /* Argument type constants */
 #define MAX_FUNCTION_ARGS   32
 
@@ -230,6 +235,8 @@ void            dump_data( const unsigne
 const char*	get_time_str( unsigned long );
 unsigned int    strlenW( const unsigned short *str );
 void            dump_unicode_str( const unsigned short *str, int len );
+void            dump_file_header(const IMAGE_FILE_HEADER *);
+void            dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *, UINT);
 
 enum FileSig    get_kind_exec(void);
 void            pe_dump( void );
-- 
1.4.4.1






More information about the wine-patches mailing list