[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