Alexandre Julliard : version: Support loading resources from both 32-bit and 64-bit PE binaries.

Alexandre Julliard julliard at winehq.org
Thu Mar 25 11:44:44 CDT 2010


Module: wine
Branch: master
Commit: 81575421a9f4220dbb85d1c6af9645b49da1dd58
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=81575421a9f4220dbb85d1c6af9645b49da1dd58

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 25 10:54:50 2010 +0100

version: Support loading resources from both 32-bit and 64-bit PE binaries.

---

 dlls/version/resource.c |   33 ++++++++++++++++++++++++---------
 1 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/dlls/version/resource.c b/dlls/version/resource.c
index 68cda3f..e27a967 100644
--- a/dlls/version/resource.c
+++ b/dlls/version/resource.c
@@ -196,7 +196,11 @@ static BOOL find_ne_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff )
  */
 static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff )
 {
-    IMAGE_NT_HEADERS pehd;
+    union
+    {
+        IMAGE_NT_HEADERS32 nt32;
+        IMAGE_NT_HEADERS64 nt64;
+    } pehd;
     DWORD pehdoffset;
     PIMAGE_DATA_DIRECTORY resDataDir;
     PIMAGE_SECTION_HEADER sections;
@@ -205,14 +209,27 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff )
     const void *resDir;
     const IMAGE_RESOURCE_DIRECTORY *resPtr;
     const IMAGE_RESOURCE_DATA_ENTRY *resData;
-    int i, nSections;
+    int i, len, nSections;
     BOOL ret = FALSE;
 
     /* Read in PE header */
     pehdoffset = LZSeek( lzfd, 0, SEEK_CUR );
-    if ( sizeof(pehd) != LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ) ) return 0;
+    len = LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) );
+    if (len < sizeof(pehd.nt32.FileHeader)) return 0;
+    if (len < sizeof(pehd)) memset( (char *)&pehd + len, 0, sizeof(pehd) - len );
+
+    switch (pehd.nt32.OptionalHeader.Magic)
+    {
+    case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
+        resDataDir = pehd.nt32.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE;
+        break;
+    case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
+        resDataDir = pehd.nt64.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE;
+        break;
+    default:
+        return 0;
+    }
 
-    resDataDir = pehd.OptionalHeader.DataDirectory+IMAGE_DIRECTORY_ENTRY_RESOURCE;
     if ( !resDataDir->Size )
     {
         TRACE("No resources in PE dll\n" );
@@ -220,15 +237,13 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff )
     }
 
     /* Read in section table */
-    nSections = pehd.FileHeader.NumberOfSections;
+    nSections = pehd.nt32.FileHeader.NumberOfSections;
     sections = HeapAlloc( GetProcessHeap(), 0,
                           nSections * sizeof(IMAGE_SECTION_HEADER) );
     if ( !sections ) return FALSE;
 
-    LZSeek( lzfd, pehdoffset +
-                    sizeof(DWORD) + /* Signature */
-                    sizeof(IMAGE_FILE_HEADER) +
-                    pehd.FileHeader.SizeOfOptionalHeader, SEEK_SET );
+    len = FIELD_OFFSET( IMAGE_NT_HEADERS32, OptionalHeader ) + pehd.nt32.FileHeader.SizeOfOptionalHeader;
+    LZSeek( lzfd, pehdoffset + len, SEEK_SET );
 
     if ( nSections * sizeof(IMAGE_SECTION_HEADER) !=
          LZRead( lzfd, (LPSTR)sections, nSections * sizeof(IMAGE_SECTION_HEADER) ) )




More information about the wine-cvs mailing list