Alexandre Julliard : kernel32/tests: Add some tests for invalid image section mappings.
Alexandre Julliard
julliard at winehq.org
Thu Nov 21 14:07:47 CST 2013
Module: wine
Branch: master
Commit: 55eb7e56e8cf8c6bb00d01efa8f39f3cae39a4db
URL: http://source.winehq.org/git/wine.git/?a=commit;h=55eb7e56e8cf8c6bb00d01efa8f39f3cae39a4db
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Nov 21 16:14:11 2013 +0100
kernel32/tests: Add some tests for invalid image section mappings.
---
dlls/kernel32/tests/loader.c | 128 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 128 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index 6698fce..d44c052 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -47,6 +47,8 @@ static LONG *child_failures;
static WORD cb_count;
static DWORD page_size;
+static NTSTATUS (WINAPI *pNtCreateSection)(HANDLE *, ACCESS_MASK, const OBJECT_ATTRIBUTES *,
+ const LARGE_INTEGER *, ULONG, ULONG, HANDLE );
static NTSTATUS (WINAPI *pNtMapViewOfSection)(HANDLE, HANDLE, PVOID *, ULONG, SIZE_T, const LARGE_INTEGER *, SIZE_T *, ULONG, ULONG, ULONG);
static NTSTATUS (WINAPI *pNtUnmapViewOfSection)(HANDLE, PVOID);
static NTSTATUS (WINAPI *pNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
@@ -216,6 +218,33 @@ static DWORD create_test_dll( const IMAGE_DOS_HEADER *dos_header, UINT dos_size,
return size;
}
+/* helper to test image section mapping */
+static NTSTATUS map_image_section( const IMAGE_NT_HEADERS *nt_header )
+{
+ char temp_path[MAX_PATH];
+ char dll_name[MAX_PATH];
+ LARGE_INTEGER size;
+ HANDLE file, map;
+ NTSTATUS status;
+
+ GetTempPathA(MAX_PATH, temp_path);
+ GetTempFileNameA(temp_path, "ldr", 0, dll_name);
+
+ size.u.LowPart = create_test_dll( &dos_header, sizeof(dos_header), nt_header, dll_name );
+ ok( size.u.LowPart, "could not create %s\n", dll_name);
+ size.u.HighPart = 0;
+
+ file = CreateFileA(dll_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
+ ok(file != INVALID_HANDLE_VALUE, "CreateFile error %d\n", GetLastError());
+
+ status = pNtCreateSection(&map, STANDARD_RIGHTS_REQUIRED | SECTION_MAP_READ, NULL, &size,
+ PAGE_READONLY, SEC_IMAGE, file );
+ if (map) CloseHandle( map );
+ CloseHandle( file );
+ DeleteFileA( dll_name );
+ return status;
+}
+
static void test_Loader(void)
{
@@ -351,6 +380,8 @@ static void test_Loader(void)
char dll_name[MAX_PATH];
SIZE_T size;
BOOL ret;
+ NTSTATUS status;
+ WORD orig_machine = nt_header.FileHeader.Machine;
/* prevent displaying of the "Unable to load this DLL" message box */
SetErrorMode(SEM_FAILCRITICALERRORS);
@@ -554,6 +585,102 @@ todo_wine
ret = DeleteFileA(dll_name);
ok(ret, "DeleteFile error %d\n", GetLastError());
}
+
+ nt_header.FileHeader.NumberOfSections = 1;
+ nt_header.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER);
+
+ nt_header.OptionalHeader.SectionAlignment = page_size;
+ nt_header.OptionalHeader.FileAlignment = page_size;
+ nt_header.OptionalHeader.SizeOfHeaders = sizeof(dos_header) + sizeof(nt_header) + sizeof(IMAGE_SECTION_HEADER);
+ nt_header.OptionalHeader.SizeOfImage = nt_header.OptionalHeader.SizeOfImage + page_size;
+
+ status = map_image_section( &nt_header );
+ ok( status == STATUS_SUCCESS, "NtCreateSection error %08x\n", status );
+
+ dos_header.e_magic = 0;
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_NOT_MZ, "NtCreateSection error %08x\n", status );
+
+ dos_header.e_magic = IMAGE_DOS_SIGNATURE;
+ nt_header.Signature = IMAGE_OS2_SIGNATURE;
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_NE_FORMAT, "NtCreateSection error %08x\n", status );
+
+ nt_header.Signature = 0xdeadbeef;
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_PROTECT, "NtCreateSection error %08x\n", status );
+
+ nt_header.Signature = IMAGE_NT_SIGNATURE;
+ nt_header.OptionalHeader.Magic = 0xdead;
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_FORMAT, "NtCreateSection error %08x\n", status );
+
+ nt_header.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
+ nt_header.FileHeader.Machine = 0xdead;
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_FORMAT || broken(status == STATUS_SUCCESS), /* win2k */
+ "NtCreateSection error %08x\n", status );
+
+ nt_header.FileHeader.Machine = IMAGE_FILE_MACHINE_UNKNOWN;
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_FORMAT || broken(status == STATUS_SUCCESS), /* win2k */
+ "NtCreateSection error %08x\n", status );
+
+ switch (orig_machine)
+ {
+ case IMAGE_FILE_MACHINE_I386: nt_header.FileHeader.Machine = IMAGE_FILE_MACHINE_AMD64; break;
+ case IMAGE_FILE_MACHINE_AMD64: nt_header.FileHeader.Machine = IMAGE_FILE_MACHINE_I386; break;
+ case IMAGE_FILE_MACHINE_ARMNT: nt_header.FileHeader.Machine = IMAGE_FILE_MACHINE_ARM64; break;
+ case IMAGE_FILE_MACHINE_ARM64: nt_header.FileHeader.Machine = IMAGE_FILE_MACHINE_ARMNT; break;
+ }
+ status = map_image_section( &nt_header );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_FORMAT || broken(status == STATUS_SUCCESS), /* win2k */
+ "NtCreateSection error %08x\n", status );
+
+ if (nt_header.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
+ {
+ IMAGE_NT_HEADERS64 nt64;
+
+ memset( &nt64, 0, sizeof(nt64) );
+ nt64.Signature = IMAGE_NT_SIGNATURE;
+ nt64.FileHeader.Machine = orig_machine;
+ nt64.FileHeader.NumberOfSections = 1;
+ nt64.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER64);
+ nt64.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
+ nt64.OptionalHeader.MajorLinkerVersion = 1;
+ nt64.OptionalHeader.ImageBase = 0x10000000;
+ nt64.OptionalHeader.MajorOperatingSystemVersion = 4;
+ nt64.OptionalHeader.MajorImageVersion = 1;
+ nt64.OptionalHeader.MajorSubsystemVersion = 4;
+ nt64.OptionalHeader.SizeOfHeaders = sizeof(dos_header) + sizeof(nt64) + sizeof(IMAGE_SECTION_HEADER);
+ nt64.OptionalHeader.SizeOfImage = nt64.OptionalHeader.SizeOfHeaders + 0x1000;
+ nt64.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
+ status = map_image_section( (IMAGE_NT_HEADERS *)&nt64 );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_FORMAT, "NtCreateSection error %08x\n", status );
+ }
+ else
+ {
+ IMAGE_NT_HEADERS32 nt32;
+
+ memset( &nt32, 0, sizeof(nt32) );
+ nt32.Signature = IMAGE_NT_SIGNATURE;
+ nt32.FileHeader.Machine = orig_machine;
+ nt32.FileHeader.NumberOfSections = 1;
+ nt32.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER32);
+ nt32.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR32_MAGIC;
+ nt32.OptionalHeader.MajorLinkerVersion = 1;
+ nt32.OptionalHeader.ImageBase = 0x10000000;
+ nt32.OptionalHeader.MajorOperatingSystemVersion = 4;
+ nt32.OptionalHeader.MajorImageVersion = 1;
+ nt32.OptionalHeader.MajorSubsystemVersion = 4;
+ nt32.OptionalHeader.SizeOfHeaders = sizeof(dos_header) + sizeof(nt32) + sizeof(IMAGE_SECTION_HEADER);
+ nt32.OptionalHeader.SizeOfImage = nt32.OptionalHeader.SizeOfHeaders + 0x1000;
+ nt32.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
+ status = map_image_section( (IMAGE_NT_HEADERS *)&nt32 );
+ todo_wine ok( status == STATUS_INVALID_IMAGE_FORMAT, "NtCreateSection error %08x\n", status );
+ }
+
+ nt_header.FileHeader.Machine = orig_machine; /* restore it for the next tests */
}
/* Verify linking style of import descriptors */
@@ -2496,6 +2623,7 @@ START_TEST(loader)
SYSTEM_INFO si;
ntdll = GetModuleHandleA("ntdll.dll");
+ pNtCreateSection = (void *)GetProcAddress(ntdll, "NtCreateSection");
pNtMapViewOfSection = (void *)GetProcAddress(ntdll, "NtMapViewOfSection");
pNtUnmapViewOfSection = (void *)GetProcAddress(ntdll, "NtUnmapViewOfSection");
pNtTerminateProcess = (void *)GetProcAddress(ntdll, "NtTerminateProcess");
More information about the wine-cvs
mailing list