[PATCH] kernel32/tests: Test CreateFileMapping with a foreign architecture dll (try 2)
André Hentschel
nerv at dawncrow.de
Wed Jan 10 14:47:52 CST 2018
Signed-off-by: André Hentschel <nerv at dawncrow.de>
---
dlls/kernel32/tests/virtual.c | 92 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 92 insertions(+)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 4a449fd..67ccfcf 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -3774,6 +3774,97 @@ static void test_CreateFileMapping_protection(void)
DeleteFileA(file_name);
}
+static void test_CreateFileMapping_foreign(void)
+{
+ IMAGE_DOS_HEADER *dos;
+ IMAGE_NT_HEADERS *nt;
+ IMAGE_SECTION_HEADER *sec;
+ DWORD lfanew = sizeof(*dos);
+ DWORD size = lfanew + sizeof(*nt) + sizeof(*sec);
+ DWORD written;
+ BYTE *buffer;
+ char path[MAX_PATH], filename[MAX_PATH];
+ HANDLE file, handle;
+
+ GetTempPathA( MAX_PATH, path );
+ GetTempFileNameA( path, "foreign", 0, filename );
+ file = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
+ ok( file != INVALID_HANDLE_VALUE, "CreateFile error %u\n", GetLastError() );
+
+ buffer = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
+
+ dos = (IMAGE_DOS_HEADER *)buffer;
+ dos->e_magic = IMAGE_DOS_SIGNATURE;
+ dos->e_cblp = sizeof(*dos);
+ dos->e_cp = 1;
+ dos->e_cparhdr = lfanew / 16;
+ dos->e_minalloc = 0;
+ dos->e_maxalloc = 0xffff;
+ dos->e_ss = 0x0000;
+ dos->e_sp = 0x00b8;
+ dos->e_lfarlc = lfanew;
+ dos->e_lfanew = lfanew;
+
+ nt = (IMAGE_NT_HEADERS *)(buffer + lfanew);
+ nt->Signature = IMAGE_NT_SIGNATURE;
+#if defined __aarch64__
+ nt->FileHeader.Machine = IMAGE_FILE_MACHINE_AMD64;
+#else
+ nt->FileHeader.Machine = IMAGE_FILE_MACHINE_ARM64;
+#endif
+ nt->FileHeader.NumberOfSections = 1;
+ nt->FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER);
+ nt->FileHeader.Characteristics = IMAGE_FILE_DLL | IMAGE_FILE_EXECUTABLE_IMAGE;
+ nt->OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
+ nt->OptionalHeader.MajorLinkerVersion = 1;
+ nt->OptionalHeader.MinorLinkerVersion = 0;
+ nt->OptionalHeader.ImageBase = 0x10000000;
+ nt->OptionalHeader.SectionAlignment = 0x1000;
+ nt->OptionalHeader.FileAlignment = 0x1000;
+ nt->OptionalHeader.MajorOperatingSystemVersion = 1;
+ nt->OptionalHeader.MinorOperatingSystemVersion = 0;
+ nt->OptionalHeader.MajorImageVersion = 1;
+ nt->OptionalHeader.MinorImageVersion = 0;
+ nt->OptionalHeader.MajorSubsystemVersion = 4;
+ nt->OptionalHeader.MinorSubsystemVersion = 0;
+ nt->OptionalHeader.SizeOfImage = 0x2000;
+ nt->OptionalHeader.SizeOfHeaders = size;
+ nt->OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
+ nt->OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
+
+ sec = (IMAGE_SECTION_HEADER *)(nt + 1);
+ memcpy( sec->Name, ".rodata", sizeof(".rodata") );
+ sec->Misc.VirtualSize = 0x1000;
+ sec->VirtualAddress = 0x1000;
+ sec->SizeOfRawData = 0;
+ sec->PointerToRawData = 0;
+ sec->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
+
+ WriteFile( file, buffer, size, &written, NULL );
+ ok( written == size, "wrong number of bytes written %u\n", written );
+ HeapFree( GetProcessHeap(), 0, buffer );
+ CloseHandle( file );
+
+ file = CreateFileA( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
+
+ /* test mapping a foreign architecture dll as image */
+ SetLastError( 0xdeadbeef );
+ handle = CreateFileMappingA( file, NULL, SEC_IMAGE | PAGE_READONLY, 0, 4096, NULL );
+ ok( !handle, "CreateFileMapping succeeded\n" );
+ ok( GetLastError() == ERROR_BAD_EXE_FORMAT || broken(GetLastError() == ERROR_INVALID_PARAMETER),
+ "wrong error %u\n", GetLastError());
+
+ /* test mapping a foreign architecture dll as no execute image */
+ SetLastError( 0xdeadbeef );
+ handle = CreateFileMappingA( file, NULL, SEC_IMAGE_NO_EXECUTE | PAGE_READONLY, 0, 4096, NULL );
+ ok( !handle, "CreateFileMapping succeeded\n" );
+ ok( GetLastError() == ERROR_BAD_EXE_FORMAT || broken(GetLastError() == ERROR_INVALID_PARAMETER),
+ "wrong error %u\n", GetLastError());
+
+ CloseHandle( file );
+ DeleteFileA( filename );
+}
+
#define ACCESS_READ 0x01
#define ACCESS_WRITE 0x02
#define ACCESS_EXECUTE 0x04
@@ -4400,6 +4491,7 @@ START_TEST(virtual)
test_shared_memory_ro(FALSE, FILE_MAP_COPY|FILE_MAP_WRITE);
test_mappings();
test_CreateFileMapping_protection();
+ test_CreateFileMapping_foreign();
test_VirtualAlloc_protection();
test_VirtualProtect();
test_VirtualAllocEx();
--
2.7.4
More information about the wine-devel
mailing list