Alexandre Julliard : ntdll: Improve the error reporting for invalid PE file architectures.
Alexandre Julliard
julliard at winehq.org
Mon Feb 21 10:56:57 CST 2011
Module: wine
Branch: master
Commit: 9eba2de390907870dcc516d4fe5ea28fcdea7360
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9eba2de390907870dcc516d4fe5ea28fcdea7360
Author: Alexandre Julliard <julliard at winehq.org>
Date: Sat Feb 19 14:10:58 2011 +0100
ntdll: Improve the error reporting for invalid PE file architectures.
---
dlls/ntdll/virtual.c | 88 +++++++++++++++++++++++++++++++-------------------
1 files changed, 55 insertions(+), 33 deletions(-)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index c22455d..0913b71 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1030,6 +1030,60 @@ static NTSTATUS allocate_dos_memory( struct file_view **view, unsigned int vprot
/***********************************************************************
+ * check_architecture
+ *
+ * Check the architecture of a PE binary.
+ */
+static NTSTATUS check_architecture( const IMAGE_NT_HEADERS *nt )
+{
+ static const char *arch;
+
+#ifdef __i386__
+ if (nt->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) return STATUS_SUCCESS;
+ if (nt->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64)
+ {
+ if (nt->FileHeader.Characteristics & IMAGE_FILE_DLL) /* don't warn for a 64-bit exe */
+ WARN( "loading amd64 dll in 32-bit mode will fail\n" );
+ return STATUS_INVALID_IMAGE_FORMAT;
+ }
+#elif defined(__x86_64__)
+ if (nt->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) return STATUS_SUCCESS;
+ if (nt->FileHeader.Machine == IMAGE_FILE_MACHINE_I386)
+ {
+ if (nt->FileHeader.Characteristics & IMAGE_FILE_DLL) /* don't warn for a 32-bit exe */
+ WARN( "loading 32-bit dll in 64-bit mode will fail\n" );
+ return STATUS_INVALID_IMAGE_FORMAT;
+ }
+#elif defined(__ARMEL__)
+ if (nt->FileHeader.Machine == IMAGE_FILE_MACHINE_ARM ||
+ nt->FileHeader.Machine == IMAGE_FILE_MACHINE_THUMB)
+ return STATUS_SUCCESS;
+#endif
+
+ switch (nt->FileHeader.Machine)
+ {
+ case IMAGE_FILE_MACHINE_UNKNOWN: arch = "Unknown"; break;
+ case IMAGE_FILE_MACHINE_I860: arch = "I860"; break;
+ case IMAGE_FILE_MACHINE_I386: arch = "I386"; break;
+ case IMAGE_FILE_MACHINE_R3000: arch = "R3000"; break;
+ case IMAGE_FILE_MACHINE_R4000: arch = "R4000"; break;
+ case IMAGE_FILE_MACHINE_R10000: arch = "R10000"; break;
+ case IMAGE_FILE_MACHINE_ALPHA: arch = "Alpha"; break;
+ case IMAGE_FILE_MACHINE_POWERPC: arch = "PowerPC"; break;
+ case IMAGE_FILE_MACHINE_IA64: arch = "IA-64"; break;
+ case IMAGE_FILE_MACHINE_ALPHA64: arch = "Alpha-64"; break;
+ case IMAGE_FILE_MACHINE_AMD64: arch = "AMD-64"; break;
+ case IMAGE_FILE_MACHINE_ARM: arch = "ARM"; break;
+ case IMAGE_FILE_MACHINE_THUMB: arch = "ARM Thumb"; break;
+ case IMAGE_FILE_MACHINE_SPARC: arch = "SPARC"; break;
+ default: arch = wine_dbg_sprintf( "Unknown-%04x", nt->FileHeader.Machine ); break;
+ }
+ ERR( "Trying to load PE image for unsupported architecture %s\n", arch );
+ return STATUS_INVALID_IMAGE_FORMAT;
+}
+
+
+/***********************************************************************
* stat_mapping_file
*
* Stat the underlying file for a memory view.
@@ -1110,39 +1164,7 @@ static NTSTATUS map_image( HANDLE hmapping, int fd, char *base, SIZE_T total_siz
imports = nt->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_IMPORT;
if (!imports->Size || !imports->VirtualAddress) imports = NULL;
- /* check the architecture */
-
-#ifdef __x86_64__
- if (nt->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64)
-#elif defined(__ARMEL__)
- if (nt->FileHeader.Machine != IMAGE_FILE_MACHINE_ARM &&
- nt->FileHeader.Machine != IMAGE_FILE_MACHINE_THUMB)
-#else
- if (nt->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
-#endif
- {
- MESSAGE("Trying to load PE image for unsupported architecture (");
- switch (nt->FileHeader.Machine)
- {
- case IMAGE_FILE_MACHINE_UNKNOWN: MESSAGE("Unknown"); break;
- case IMAGE_FILE_MACHINE_I860: MESSAGE("I860"); break;
- case IMAGE_FILE_MACHINE_I386: MESSAGE("I386"); break;
- case IMAGE_FILE_MACHINE_R3000: MESSAGE("R3000"); break;
- case IMAGE_FILE_MACHINE_R4000: MESSAGE("R4000"); break;
- case IMAGE_FILE_MACHINE_R10000: MESSAGE("R10000"); break;
- case IMAGE_FILE_MACHINE_ALPHA: MESSAGE("Alpha"); break;
- case IMAGE_FILE_MACHINE_POWERPC: MESSAGE("PowerPC"); break;
- case IMAGE_FILE_MACHINE_IA64: MESSAGE("IA-64"); break;
- case IMAGE_FILE_MACHINE_ALPHA64: MESSAGE("Alpha-64"); break;
- case IMAGE_FILE_MACHINE_AMD64: MESSAGE("AMD-64"); break;
- case IMAGE_FILE_MACHINE_ARM: MESSAGE("ARM"); break;
- case IMAGE_FILE_MACHINE_THUMB: MESSAGE("ARM Thumb"); break;
- case IMAGE_FILE_MACHINE_SPARC: MESSAGE("SPARC"); break;
- default: MESSAGE("Unknown-%04x", nt->FileHeader.Machine); break;
- }
- MESSAGE(")\n");
- goto error;
- }
+ if (check_architecture( nt )) goto error;
/* check for non page-aligned binary */
More information about the wine-cvs
mailing list