Alexandre Julliard : kernel32: Determine the module architecture for all binary types.
Alexandre Julliard
julliard at winehq.org
Fri Nov 22 10:23:06 CST 2013
Module: wine
Branch: master
Commit: f2c54dba015f6f3e359f87c0950b25b9ffeb1e96
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2c54dba015f6f3e359f87c0950b25b9ffeb1e96
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Nov 22 12:18:31 2013 +0100
kernel32: Determine the module architecture for all binary types.
---
dlls/kernel32/kernel_private.h | 1 +
dlls/kernel32/module.c | 34 +++++++++++++++++++++++++++++++++-
dlls/kernel32/process.c | 20 ++++++++++++++++----
3 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index cfc2935..5c6c197 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -81,6 +81,7 @@ enum binary_type
struct binary_info
{
enum binary_type type;
+ DWORD arch;
DWORD flags;
void *res_start;
void *res_end;
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index babc756..63cf012 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -264,22 +264,52 @@ void MODULE_get_binary_info( HANDLE hfile, struct binary_info *info )
if (!memcmp( header.elf.magic, "\177ELF", 4 ))
{
if (header.elf.class == 2) info->flags |= BINARY_FLAG_64BIT;
- /* FIXME: we don't bother to check byte order, architecture, etc. */
+#ifdef WORDS_BIGENDIAN
+ if (header.elf.data == 1)
+#else
+ if (header.elf.data == 2)
+#endif
+ {
+ header.elf.type = RtlUshortByteSwap( header.elf.type );
+ header.elf.machine = RtlUshortByteSwap( header.elf.machine );
+ }
switch(header.elf.type)
{
case 2: info->type = BINARY_UNIX_EXE; break;
case 3: info->type = BINARY_UNIX_LIB; break;
}
+ switch(header.elf.machine)
+ {
+ case 3: info->arch = IMAGE_FILE_MACHINE_I386; break;
+ case 20: info->arch = IMAGE_FILE_MACHINE_POWERPC; break;
+ case 40: info->arch = IMAGE_FILE_MACHINE_ARMNT; break;
+ case 50: info->arch = IMAGE_FILE_MACHINE_IA64; break;
+ case 62: info->arch = IMAGE_FILE_MACHINE_AMD64; break;
+ case 183: info->arch = IMAGE_FILE_MACHINE_ARM64; break;
+ }
}
/* Mach-o File with Endian set to Big Endian or Little Endian */
else if (header.macho.magic == 0xfeedface || header.macho.magic == 0xcefaedfe)
{
if ((header.macho.cputype >> 24) == 1) info->flags |= BINARY_FLAG_64BIT;
+ if (header.macho.magic == 0xcefaedfe)
+ {
+ 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->arch = IMAGE_FILE_MACHINE_I386; break;
+ case 0x01000007: info->arch = IMAGE_FILE_MACHINE_AMD64; break;
+ case 0x0000000c: info->arch = IMAGE_FILE_MACHINE_ARMNT; break;
+ case 0x0100000c: info->arch = IMAGE_FILE_MACHINE_ARM64; break;
+ case 0x00000012: info->arch = IMAGE_FILE_MACHINE_POWERPC; break;
+ }
}
/* Not ELF, try DOS */
else if (header.mz.e_magic == IMAGE_DOS_SIGNATURE)
@@ -298,6 +328,7 @@ void MODULE_get_binary_info( HANDLE hfile, struct binary_info *info )
* to read or not.
*/
info->type = BINARY_DOS;
+ info->arch = IMAGE_FILE_MACHINE_I386;
if (SetFilePointer( hfile, header.mz.e_lfanew, NULL, SEEK_SET ) == -1) return;
if (!ReadFile( hfile, &ext_header, sizeof(ext_header), &len, NULL ) || len < 4) return;
@@ -309,6 +340,7 @@ void MODULE_get_binary_info( HANDLE hfile, struct binary_info *info )
if (len >= sizeof(ext_header.nt.FileHeader))
{
info->type = BINARY_PE;
+ info->arch = ext_header.nt.FileHeader.Machine;
if (ext_header.nt.FileHeader.Characteristics & IMAGE_FILE_DLL)
info->flags |= BINARY_FLAG_DLL;
if (len < sizeof(ext_header.nt)) /* clear remaining part of header if missing */
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index afbdf72..0bacd60 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -208,6 +208,18 @@ static BOOL get_builtin_path( const WCHAR *libname, const WCHAR *ext, WCHAR *fil
binary_info->flags = flags;
binary_info->res_start = NULL;
binary_info->res_end = NULL;
+ /* assume current arch */
+#if defined(__i386__) || defined(__x86_64__)
+ binary_info->arch = (flags & BINARY_FLAG_64BIT) ? IMAGE_FILE_MACHINE_AMD64 : IMAGE_FILE_MACHINE_I386;
+#elif defined(__powerpc__)
+ binary_info->arch = IMAGE_FILE_MACHINE_POWERPC;
+#elif defined(__arm__) && !defined(__ARMEB__)
+ binary_info->arch = IMAGE_FILE_MACHINE_ARMNT;
+#elif defined(__aarch64__)
+ binary_info->arch = IMAGE_FILE_MACHINE_ARM64;
+#else
+ binary_info->arch = IMAGE_FILE_MACHINE_UNKNOWN;
+#endif
return TRUE;
}
@@ -2286,9 +2298,9 @@ static BOOL create_process_impl( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_A
else switch (binary_info.type)
{
case BINARY_PE:
- TRACE( "starting %s as Win%d binary (%p-%p)\n",
+ TRACE( "starting %s as Win%d binary (%p-%p, arch %04x)\n",
debugstr_w(name), (binary_info.flags & BINARY_FLAG_64BIT) ? 64 : 32,
- binary_info.res_start, binary_info.res_end );
+ binary_info.res_start, binary_info.res_end, binary_info.arch );
retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
inherit, flags, startup_info, info, unixdir, &binary_info, FALSE );
break;
@@ -2431,9 +2443,9 @@ static void exec_process( LPCWSTR name )
switch (binary_info.type)
{
case BINARY_PE:
- TRACE( "starting %s as Win%d binary (%p-%p)\n",
+ TRACE( "starting %s as Win%d binary (%p-%p, arch %04x)\n",
debugstr_w(name), (binary_info.flags & BINARY_FLAG_64BIT) ? 64 : 32,
- binary_info.res_start, binary_info.res_end );
+ binary_info.res_start, binary_info.res_end, binary_info.arch );
create_process( hFile, name, GetCommandLineW(), NULL, NULL, NULL, NULL,
FALSE, 0, &startup_info, &info, NULL, &binary_info, TRUE );
break;
More information about the wine-cvs
mailing list