[PATCH] [WineDump]: added support for long section names (at least used by MinGW)

Eric Pouech eric.pouech at orange.fr
Wed Dec 23 15:05:44 CST 2009




A+
---

 tools/winedump/lib.c      |    2 +-
 tools/winedump/pe.c       |   19 ++++++++++++++++---
 tools/winedump/winedump.h |    2 +-
 3 files changed, 18 insertions(+), 5 deletions(-)


diff --git a/tools/winedump/lib.c b/tools/winedump/lib.c
index 85f305d..de5184a 100644
--- a/tools/winedump/lib.c
+++ b/tools/winedump/lib.c
@@ -88,7 +88,7 @@ static void dump_long_import(const void *base, const IMAGE_SECTION_HEADER *ish,
     for (i = 0; i < num_sect; i++)
     {
         if (globals.do_dumpheader)
-            dump_section(&ish[i]);
+            dump_section(&ish[i], NULL);
 
         if (globals.do_dump_rawdata)
         {
diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c
index a79593c..4846d1f 100644
--- a/tools/winedump/pe.c
+++ b/tools/winedump/pe.c
@@ -371,10 +371,13 @@ static	void	dump_pe_header(void)
     dump_optional_header((const IMAGE_OPTIONAL_HEADER32*)&PE_nt_headers->OptionalHeader, PE_nt_headers->FileHeader.SizeOfOptionalHeader);
 }
 
-void dump_section(const IMAGE_SECTION_HEADER *sectHead)
+void dump_section(const IMAGE_SECTION_HEADER *sectHead, const char* strtable)
 {
-	printf("  %-8.8s   VirtSize: 0x%08x  VirtAddr:  0x%08x\n",
+	printf("  %-8.8s   VirtSize: 0x%08x  VirtAddr:  0x%08x",
                sectHead->Name, sectHead->Misc.VirtualSize, sectHead->VirtualAddress);
+        if (strtable && sectHead->Name[0] == '/') /* long section name */
+            printf(" (%s)", strtable + atoi((const char*)sectHead->Name + 1));
+        printf("\n");
 	printf("    raw data offs:   0x%08x  raw data size: 0x%08x\n",
 	       sectHead->PointerToRawData, sectHead->SizeOfRawData);
 	printf("    relocation offs: 0x%08x  relocations:   0x%08x\n",
@@ -448,11 +451,21 @@ static void dump_sections(const void *base, const void* addr, unsigned num_sect)
 {
     const IMAGE_SECTION_HEADER*	sectHead = addr;
     unsigned			i;
+    const char*                 strtable;
+
+    if (PE_nt_headers->FileHeader.PointerToSymbolTable && PE_nt_headers->FileHeader.NumberOfSymbols)
+    {
+        /* FIXME: no way to get strtable size */
+        strtable = (const char*)base +
+            PE_nt_headers->FileHeader.PointerToSymbolTable +
+            PE_nt_headers->FileHeader.NumberOfSymbols * sizeof(IMAGE_SYMBOL);
+    }
+    else strtable = NULL;
 
     printf("Section Table\n");
     for (i = 0; i < num_sect; i++, sectHead++)
     {
-        dump_section(sectHead);
+        dump_section(sectHead, strtable);
 
         if (globals.do_dump_rawdata)
         {
diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h
index 9ad20a5..1f49369 100644
--- a/tools/winedump/winedump.h
+++ b/tools/winedump/winedump.h
@@ -234,7 +234,7 @@ const char*     get_guid_str(const GUID* guid);
 const char*     get_symbol_str(const char* symname);
 void            dump_file_header(const IMAGE_FILE_HEADER *);
 void            dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *, UINT);
-void            dump_section(const IMAGE_SECTION_HEADER *);
+void            dump_section(const IMAGE_SECTION_HEADER *, const char* strtable);
 
 enum FileSig    get_kind_exec(void);
 void            dos_dump( void );






More information about the wine-patches mailing list