diff --git a/loader/module.c b/loader/module.c index e291b0d4611..9f409522b5b 100644 --- a/loader/module.c +++ b/loader/module.c @@ -635,15 +635,14 @@ enum binary_type MODULE_GetBinaryType( HANDLE hfile ) */ 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 @@ enum binary_type MODULE_GetBinaryType( HANDLE hfile ) } } /* Couldn't read header, so abort. */ - return BINARY_UNKNOWN; + return BINARY_DOS; } /* Unknown extended header, but this file is nonetheless DOS-executable. */ diff --git a/server/mapping.c b/server/mapping.c index ef1d4ccea55..0c7e4d96fc5 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -211,8 +211,13 @@ static int get_image_params( struct mapping *mapping ) 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 */