Signed-off-by: André Hentschel nerv@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();