size art

Dmitry Timoshkov dmitry at baikal.ru
Thu Aug 22 01:13:14 CDT 2002


Hello.

Well, here is a result of my attempt to make it work.
Now I'm stuck probably due a Linux limitation to mmap not aligned
to the page size data. Anybody with more clues?

Changelog:
    Relax a bit PE consistence checks.
    Return BINARY_DOS type if extended header was not recognized.

-- 
Dmitry.
-------------- next part --------------
diff -u cvs/hq/wine/loader/module.c wine/loader/module.c
--- cvs/hq/wine/loader/module.c	Sat Aug 17 18:42:28 2002
+++ wine/loader/module.c	Thu Aug 22 13:12:01 2002
@@ -635,15 +635,14 @@
          */
         if (!memcmp( magic, "PE\0\0", 4 ))
         {
-            IMAGE_NT_HEADERS nt;
+            IMAGE_FILE_HEADER FileHeader;
 
-            if (SetFilePointer( hfile, header.mz.e_lfanew, NULL, SEEK_SET ) != -1 &&
-                ReadFile( hfile, &nt, sizeof(nt), &len, NULL ) && len == sizeof(nt))
+            if (ReadFile( hfile, &FileHeader, sizeof(FileHeader), &len, NULL ) && len == sizeof(FileHeader))
             {
-                if (nt.FileHeader.Characteristics & IMAGE_FILE_DLL) return BINARY_PE_DLL;
+                if (FileHeader.Characteristics & IMAGE_FILE_DLL) return BINARY_PE_DLL;
                 return BINARY_PE_EXE;
             }
-            return BINARY_UNKNOWN;
+            return BINARY_DOS;
         }
 
         if (!memcmp( magic, "NE", 2 ))
@@ -666,7 +665,7 @@
                 }
             }
             /* Couldn't read header, so abort. */
-            return BINARY_UNKNOWN;
+            return BINARY_DOS;
         }
 
         /* Unknown extended header, but this file is nonetheless DOS-executable. */
diff -u cvs/hq/wine/memory/virtual.c wine/memory/virtual.c
--- cvs/hq/wine/memory/virtual.c	Sat Aug 17 18:42:29 2002
+++ wine/memory/virtual.c	Thu Aug 22 15:00:03 2002
@@ -645,7 +645,7 @@
         DWORD size;
 
         /* a few sanity checks */
-        size = sec->VirtualAddress + ROUND_SIZE( sec->VirtualAddress, sec->Misc.VirtualSize );
+        size = sec->VirtualAddress + ROUND_SIZE( 0, sec->Misc.VirtualSize );
         if (sec->VirtualAddress > total_size || size > total_size || size < sec->VirtualAddress)
         {
             ERR_(module)( "Section %.8s too large (%lx+%lx/%lx)\n",
diff -u cvs/hq/wine/server/mapping.c wine/server/mapping.c
--- cvs/hq/wine/server/mapping.c	Mon Jun  3 13:01:48 2002
+++ wine/server/mapping.c	Thu Aug 22 13:21:12 2002
@@ -211,8 +211,13 @@
     if (read( fd, &dos, sizeof(dos) ) != sizeof(dos)) goto error;
     if (dos.e_magic != IMAGE_DOS_SIGNATURE) goto error;
     if (lseek( fd, dos.e_lfanew, SEEK_SET ) == -1) goto error;
-    if (read( fd, &nt, sizeof(nt) ) != sizeof(nt)) goto error;
+
+    if (read( fd, &nt.Signature, sizeof(nt.Signature) ) != sizeof(nt.Signature)) goto error;
     if (nt.Signature != IMAGE_NT_SIGNATURE) goto error;
+    if (read( fd, &nt.FileHeader, sizeof(nt.FileHeader) ) != sizeof(nt.FileHeader)) goto error;
+    /* zero out Optional header in the case it's not present or partial */
+    memset(&nt.OptionalHeader, 0, sizeof(nt.OptionalHeader));
+    if (read( fd, &nt.OptionalHeader, nt.FileHeader.SizeOfOptionalHeader) != nt.FileHeader.SizeOfOptionalHeader) goto error;
 
     /* load the section headers */
 


More information about the wine-patches mailing list