Alexandre Julliard : kernel32: Add a 64-bit flag to the MODULE_GetBinaryType return value.

Alexandre Julliard julliard at winehq.org
Wed Aug 12 11:10:05 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Aug 12 15:50:47 2009 +0200

kernel32: Add a 64-bit flag to the MODULE_GetBinaryType return value.

---

 dlls/kernel32/kernel_private.h |    1 +
 dlls/kernel32/module.c         |   25 ++++++++++++++++---------
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index 03819d2..386bab2 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -92,6 +92,7 @@ extern LONG CALLBACK INSTR_vectored_handler( EXCEPTION_POINTERS *ptrs );
 #define BINARY_UNIX_LIB   0x06
 #define BINARY_TYPE_MASK  0x0f
 #define BINARY_FLAG_DLL   0x10
+#define BINARY_FLAG_64BIT 0x20
 
 /* module.c */
 extern WCHAR *MODULE_get_dll_load_path( LPCWSTR module );
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index f93580c..ddb8fe2 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -233,15 +233,19 @@ DWORD MODULE_GetBinaryType( HANDLE hfile, void **res_start, void **res_end )
         struct
         {
             unsigned char magic[4];
-            unsigned char ignored[12];
+            unsigned char class;
+            unsigned char data;
+            unsigned char version;
+            unsigned char ignored[9];
             unsigned short type;
+            unsigned short machine;
         } elf;
         struct
         {
-            unsigned long magic;
-            unsigned long cputype;
-            unsigned long cpusubtype;
-            unsigned long filetype;
+            unsigned int magic;
+            unsigned int cputype;
+            unsigned int cpusubtype;
+            unsigned int filetype;
         } macho;
         IMAGE_DOS_HEADER mz;
     } header;
@@ -256,11 +260,12 @@ DWORD MODULE_GetBinaryType( HANDLE hfile, void **res_start, void **res_end )
 
     if (!memcmp( header.elf.magic, "\177ELF", 4 ))
     {
+        DWORD flags = (header.elf.class == 2) ? BINARY_FLAG_64BIT : 0;
         /* FIXME: we don't bother to check byte order, architecture, etc. */
         switch(header.elf.type)
         {
-        case 2: return BINARY_UNIX_EXE;
-        case 3: return BINARY_UNIX_LIB;
+        case 2: return flags | BINARY_UNIX_EXE;
+        case 3: return flags | BINARY_UNIX_LIB;
         }
         return BINARY_UNKNOWN;
     }
@@ -268,9 +273,11 @@ DWORD MODULE_GetBinaryType( HANDLE hfile, void **res_start, void **res_end )
     /* Mach-o File with Endian set to Big Endian or Little Endian */
     if (header.macho.magic == 0xfeedface || header.macho.magic == 0xcefaedfe)
     {
+        DWORD flags = (header.macho.cputype >> 24) == 1 ? BINARY_FLAG_64BIT : 0;
         switch(header.macho.filetype)
         {
-            case 0x8: /* MH_BUNDLE */ return BINARY_UNIX_LIB;
+        case 2: return flags | BINARY_UNIX_EXE;
+        case 8: return flags | BINARY_UNIX_LIB;
         }
         return BINARY_UNKNOWN;
     }
@@ -321,7 +328,7 @@ DWORD MODULE_GetBinaryType( HANDLE hfile, void **res_start, void **res_end )
                 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
                     if (res_start) *res_start = NULL;
                     if (res_end) *res_end = NULL;
-                    return ret;
+                    return ret | BINARY_FLAG_64BIT;
                 }
             }
             return BINARY_DOS;




More information about the wine-cvs mailing list