server: Implement the ImageContainsCode flag for image mappings.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2018-01-30 11:03:09 +01:00
parent 41275cbabf
commit 0810e6a688
2 changed files with 16 additions and 9 deletions

View File

@ -49,6 +49,7 @@ struct PROCESS_BASIC_INFORMATION_PRIVATE
static LONG *child_failures;
static WORD cb_count;
static DWORD page_size;
static BOOL is_win64 = sizeof(void *) > sizeof(int);
static BOOL is_wow64;
static NTSTATUS (WINAPI *pNtCreateSection)(HANDLE *, ACCESS_MASK, const OBJECT_ATTRIBUTES *,
@ -267,7 +268,7 @@ static BOOL query_image_section( int id, const char *dll_name, const IMAGE_NT_HE
status = pNtQuerySection( mapping, SectionImageInformation, &image, sizeof(image), &info_size );
ok( !status, "%u: NtQuerySection failed err %x\n", id, status );
ok( info_size == sizeof(image), "%u: NtQuerySection wrong size %lu\n", id, info_size );
if (nt_header->OptionalHeader.Magic == (sizeof(void *) > sizeof(int) ? IMAGE_NT_OPTIONAL_HDR64_MAGIC
if (nt_header->OptionalHeader.Magic == (is_win64 ? IMAGE_NT_OPTIONAL_HDR64_MAGIC
: IMAGE_NT_OPTIONAL_HDR32_MAGIC))
{
max_stack = nt_header->OptionalHeader.SizeOfStackReserve;
@ -327,13 +328,11 @@ static BOOL query_image_section( int id, const char *dll_name, const IMAGE_NT_HE
ok( image.CheckSum == nt_header->OptionalHeader.CheckSum, "%u: CheckSum wrong %08x / %08x\n", id,
image.CheckSum, nt_header->OptionalHeader.CheckSum );
if (nt_header->OptionalHeader.SizeOfCode || nt_header->OptionalHeader.AddressOfEntryPoint)
todo_wine
ok( image.ImageContainsCode == TRUE, "%u: ImageContainsCode wrong %u\n", id,
image.ImageContainsCode );
else if ((nt_header->OptionalHeader.SectionAlignment % page_size) ||
(nt_header->FileHeader.NumberOfSections == 1 &&
(section.Characteristics & IMAGE_SCN_MEM_EXECUTE)))
todo_wine
ok( image.ImageContainsCode == TRUE || broken(!image.ImageContainsCode), /* <= win8 */
"%u: ImageContainsCode wrong %u\n", id, image.ImageContainsCode );
else
@ -416,7 +415,7 @@ static NTSTATUS map_image_section( const IMAGE_NT_HEADERS *nt_header, int line )
info.Size.u.HighPart, info.Size.u.LowPart, file_size );
has_code = query_image_section( line, dll_name, nt_header );
/* test loading dll of wrong 32/64 bitness */
if (nt_header->OptionalHeader.Magic == (sizeof(void *) > sizeof(int) ? IMAGE_NT_OPTIONAL_HDR32_MAGIC
if (nt_header->OptionalHeader.Magic == (is_win64 ? IMAGE_NT_OPTIONAL_HDR32_MAGIC
: IMAGE_NT_OPTIONAL_HDR64_MAGIC))
{
SetLastError( 0xdeadbeef );
@ -425,7 +424,7 @@ static NTSTATUS map_image_section( const IMAGE_NT_HEADERS *nt_header, int line )
{
ok( mod != NULL, "%u: loading failed err %u\n", line, GetLastError() );
}
else todo_wine_if (is_wow64)
else todo_wine_if (is_win64 || is_wow64)
{
ok( !mod, "%u: loading succeeded\n", line );
ok( GetLastError() == ERROR_BAD_EXE_FORMAT, "%u: wrong error %u\n", line, GetLastError() );

View File

@ -539,7 +539,7 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
} nt;
off_t pos;
int size;
unsigned int cpu_mask = get_supported_cpu_mask();
unsigned int i, cpu_mask = get_supported_cpu_mask();
/* load the headers */
@ -587,6 +587,9 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
mapping->image.subsystem_low = nt.opt.hdr32.MinorSubsystemVersion;
mapping->image.subsystem_high = nt.opt.hdr32.MajorSubsystemVersion;
mapping->image.dll_charact = nt.opt.hdr32.DllCharacteristics;
mapping->image.contains_code = (nt.opt.hdr32.SizeOfCode ||
nt.opt.hdr32.AddressOfEntryPoint ||
nt.opt.hdr32.SectionAlignment & page_mask);
mapping->image.loader_flags = nt.opt.hdr32.LoaderFlags;
mapping->image.header_size = nt.opt.hdr32.SizeOfHeaders;
mapping->image.checksum = nt.opt.hdr32.CheckSum;
@ -614,6 +617,9 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
mapping->image.subsystem_low = nt.opt.hdr64.MinorSubsystemVersion;
mapping->image.subsystem_high = nt.opt.hdr64.MajorSubsystemVersion;
mapping->image.dll_charact = nt.opt.hdr64.DllCharacteristics;
mapping->image.contains_code = (nt.opt.hdr64.SizeOfCode ||
nt.opt.hdr64.AddressOfEntryPoint ||
nt.opt.hdr64.SectionAlignment & page_mask);
mapping->image.loader_flags = nt.opt.hdr64.LoaderFlags;
mapping->image.header_size = nt.opt.hdr64.SizeOfHeaders;
mapping->image.checksum = nt.opt.hdr64.CheckSum;
@ -627,7 +633,6 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
mapping->image.machine = nt.FileHeader.Machine;
mapping->image.zerobits = 0; /* FIXME */
mapping->image.gp = 0; /* FIXME */
mapping->image.contains_code = 0; /* FIXME */
mapping->image.image_flags = 0; /* FIXME */
mapping->image.file_size = file_size;
@ -642,6 +647,9 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
if (!(sec = malloc( size ))) goto error;
if (pread( unix_fd, sec, size, pos ) != size) goto error;
for (i = 0; i < nt.FileHeader.NumberOfSections && !mapping->image.contains_code; i++)
if (sec[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) mapping->image.contains_code = 1;
if (!build_shared_mapping( mapping, unix_fd, sec, nt.FileHeader.NumberOfSections )) goto error;
free( sec );