Alexandre Julliard : kernel32: Return the binary type from get_binary_info ().

Alexandre Julliard julliard at winehq.org
Thu Sep 27 18:25:13 CDT 2018


Module: wine
Branch: master
Commit: df637816bc3ad1afa10135fcb2b784eca49e6f06
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=df637816bc3ad1afa10135fcb2b784eca49e6f06

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 27 14:44:47 2018 +0200

kernel32: Return the binary type from get_binary_info().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/process.c | 71 +++++++++++++++++++++----------------------------
 1 file changed, 31 insertions(+), 40 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 02dce89..59a829b 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -207,7 +207,7 @@ static NTSTATUS get_pe_info( HANDLE handle, pe_image_info_t *info )
 /***********************************************************************
  *           get_binary_info
  */
-static void get_binary_info( HANDLE hfile, struct binary_info *info )
+static enum binary_type get_binary_info( HANDLE hfile, struct binary_info *info )
 {
     union
     {
@@ -256,24 +256,21 @@ static void get_binary_info( HANDLE hfile, struct binary_info *info )
     switch (status)
     {
     case STATUS_SUCCESS:
-        info->type = BINARY_PE;
-        return;
+        return BINARY_PE;
     case STATUS_INVALID_IMAGE_WIN_32:
-        info->type = BINARY_PE;
-        return;
+        return BINARY_PE;
     case STATUS_INVALID_IMAGE_WIN_64:
-        info->type = BINARY_PE;
-        return;
+        return BINARY_PE;
     case STATUS_INVALID_IMAGE_WIN_16:
     case STATUS_INVALID_IMAGE_NE_FORMAT:
     case STATUS_INVALID_IMAGE_PROTECT:
-        info->type = BINARY_WIN16;
-        return;
+        return BINARY_WIN16;
     }
 
     /* Seek to the start of the file and read the header information. */
-    if (SetFilePointer( hfile, 0, NULL, SEEK_SET ) == -1) return;
-    if (!ReadFile( hfile, &header, sizeof(header), &len, NULL ) || len != sizeof(header)) return;
+    if (SetFilePointer( hfile, 0, NULL, SEEK_SET ) == -1) return BINARY_UNKNOWN;
+    if (!ReadFile( hfile, &header, sizeof(header), &len, NULL ) || len != sizeof(header))
+        return BINARY_UNKNOWN;
 
     if (!memcmp( header.elf.magic, "\177ELF", 4 ))
     {
@@ -287,11 +284,19 @@ static void get_binary_info( HANDLE hfile, struct binary_info *info )
             header.elf.type = RtlUshortByteSwap( header.elf.type );
             header.elf.machine = RtlUshortByteSwap( header.elf.machine );
         }
+        switch(header.elf.machine)
+        {
+        case 3:   info->pe.machine = IMAGE_FILE_MACHINE_I386; break;
+        case 20:  info->pe.machine = IMAGE_FILE_MACHINE_POWERPC; break;
+        case 40:  info->pe.machine = IMAGE_FILE_MACHINE_ARMNT; break;
+        case 50:  info->pe.machine = IMAGE_FILE_MACHINE_IA64; break;
+        case 62:  info->pe.machine = IMAGE_FILE_MACHINE_AMD64; break;
+        case 183: info->pe.machine = IMAGE_FILE_MACHINE_ARM64; break;
+        }
         switch(header.elf.type)
         {
         case 2:
-            info->type = BINARY_UNIX_EXE;
-            break;
+            return BINARY_UNIX_EXE;
         case 3:
         {
             LARGE_INTEGER phoff;
@@ -309,30 +314,15 @@ static void get_binary_info( HANDLE hfile, struct binary_info *info )
             }
             while (phnum--)
             {
-                if (SetFilePointerEx( hfile, phoff, NULL, FILE_BEGIN ) == -1) return;
-                if (!ReadFile( hfile, &type, sizeof(type), &len, NULL ) || len < sizeof(type)) return;
+                if (SetFilePointerEx( hfile, phoff, NULL, FILE_BEGIN ) == -1) return BINARY_UNKNOWN;
+                if (!ReadFile( hfile, &type, sizeof(type), &len, NULL ) || len < sizeof(type))
+                    return BINARY_UNKNOWN;
                 if (byteswap) type = RtlUlongByteSwap( type );
-                if (type == 3)
-                {
-                    info->type = BINARY_UNIX_EXE;
-                    break;
-                }
+                if (type == 3) return BINARY_UNIX_EXE;
                 phoff.QuadPart += (header.elf.class == 2) ? 56 : 32;
             }
-            if (!info->type) info->type = BINARY_UNIX_LIB;
-            break;
-        }
-        default:
-            return;
+            return BINARY_UNIX_LIB;
         }
-        switch(header.elf.machine)
-        {
-        case 3:   info->pe.machine = IMAGE_FILE_MACHINE_I386; break;
-        case 20:  info->pe.machine = IMAGE_FILE_MACHINE_POWERPC; break;
-        case 40:  info->pe.machine = IMAGE_FILE_MACHINE_ARMNT; break;
-        case 50:  info->pe.machine = IMAGE_FILE_MACHINE_IA64; break;
-        case 62:  info->pe.machine = IMAGE_FILE_MACHINE_AMD64; break;
-        case 183: info->pe.machine = IMAGE_FILE_MACHINE_ARM64; break;
         }
     }
     /* Mach-o File with Endian set to Big Endian or Little Endian */
@@ -344,11 +334,6 @@ static void get_binary_info( HANDLE hfile, struct binary_info *info )
             header.macho.filetype = RtlUlongByteSwap( header.macho.filetype );
             header.macho.cputype = RtlUlongByteSwap( header.macho.cputype );
         }
-        switch(header.macho.filetype)
-        {
-        case 2: info->type = BINARY_UNIX_EXE; break;
-        case 8: info->type = BINARY_UNIX_LIB; break;
-        }
         switch(header.macho.cputype)
         {
         case 0x00000007: info->pe.machine = IMAGE_FILE_MACHINE_I386; break;
@@ -357,7 +342,13 @@ static void get_binary_info( HANDLE hfile, struct binary_info *info )
         case 0x0100000c: info->pe.machine = IMAGE_FILE_MACHINE_ARM64; break;
         case 0x00000012: info->pe.machine = IMAGE_FILE_MACHINE_POWERPC; break;
         }
+        switch(header.macho.filetype)
+        {
+        case 2: return BINARY_UNIX_EXE;
+        case 8: return BINARY_UNIX_LIB;
+        }
     }
+    return BINARY_UNKNOWN;
 }
 
 
@@ -452,7 +443,7 @@ static HANDLE open_exe_file( const WCHAR *name, struct binary_info *binary_info
         if (contains_path( name ) && get_builtin_path( name, NULL, buffer, sizeof(buffer), binary_info ))
             handle = 0;
     }
-    else get_binary_info( handle, binary_info );
+    else binary_info->type = get_binary_info( handle, binary_info );
 
     return handle;
 }
@@ -477,7 +468,7 @@ static BOOL find_exe_file( const WCHAR *name, WCHAR *buffer, int buflen,
     if ((*handle = CreateFileW( buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE,
                                 NULL, OPEN_EXISTING, 0, 0 )) != INVALID_HANDLE_VALUE)
     {
-        get_binary_info( *handle, binary_info );
+        binary_info->type = get_binary_info( *handle, binary_info );
         return TRUE;
     }
     return FALSE;




More information about the wine-cvs mailing list