Alexandre Julliard : kernel32/tests: Add a test to check some fields in fake dlls.
Alexandre Julliard
julliard at winehq.org
Mon Feb 18 15:43:32 CST 2019
Module: wine
Branch: master
Commit: 3ba4901134492f8f13de1b2661bb0ad7d6d0008c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3ba4901134492f8f13de1b2661bb0ad7d6d0008c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 18 21:11:17 2019 +0100
kernel32/tests: Add a test to check some fields in fake dlls.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45377
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/loader.c | 57 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index 7046afc..b8dc72b 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -78,6 +78,7 @@ static PVOID (WINAPI *pResolveDelayLoadedAPI)(PVOID, PCIMAGE_DELAYLOAD_DESCRI
PDELAYLOAD_FAILURE_SYSTEM_ROUTINE,
PIMAGE_THUNK_DATA ThunkAddress,ULONG);
static PVOID (WINAPI *pRtlImageDirectoryEntryToData)(HMODULE,BOOL,WORD,ULONG *);
+static PIMAGE_NT_HEADERS (WINAPI *pRtlImageNtHeader)(HMODULE);
static DWORD (WINAPI *pFlsAlloc)(PFLS_CALLBACK_FUNCTION);
static BOOL (WINAPI *pFlsSetValue)(DWORD, PVOID);
static PVOID (WINAPI *pFlsGetValue)(DWORD);
@@ -3806,6 +3807,57 @@ static void test_InMemoryOrderModuleList(void)
ok(entry2 == mark2, "expected entry2 == mark2, got %p and %p\n", entry2, mark2);
}
+static void test_dll_file( const char *name )
+{
+ HMODULE module = GetModuleHandleA( name );
+ IMAGE_NT_HEADERS *nt, *nt_file;
+ IMAGE_SECTION_HEADER *sec, *sec_file;
+ char path[MAX_PATH];
+ HANDLE file, mapping;
+ int i = 0;
+ void *ptr;
+
+ GetModuleFileNameA( module, path, MAX_PATH );
+ file = CreateFileA( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
+ ok( file != INVALID_HANDLE_VALUE, "can't open '%s': %u\n", path, GetLastError() );
+
+ mapping = CreateFileMappingA( file, NULL, PAGE_READONLY, 0, 0, NULL );
+ ok( mapping != NULL, "%s: CreateFileMappingW failed err %u\n", name, GetLastError() );
+ ptr = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
+ ok( ptr != NULL, "%s: MapViewOfFile failed err %u\n", name, GetLastError() );
+ CloseHandle( mapping );
+ CloseHandle( file );
+
+ nt = pRtlImageNtHeader( module );
+ nt_file = pRtlImageNtHeader( ptr );
+ ok( nt_file != NULL, "%s: invalid header\n", path );
+#define OK_FIELD(x) ok( nt->x == nt_file->x, "%s:%u: wrong " #x " %x / %x\n", name, i, nt->x, nt_file->x )
+ todo_wine
+ OK_FIELD( FileHeader.NumberOfSections );
+ todo_wine
+ OK_FIELD( OptionalHeader.AddressOfEntryPoint );
+ OK_FIELD( OptionalHeader.NumberOfRvaAndSizes );
+ for (i = 0; i < nt->OptionalHeader.NumberOfRvaAndSizes; i++)
+ {
+ todo_wine_if( i == IMAGE_DIRECTORY_ENTRY_EXPORT ||
+ (i == IMAGE_DIRECTORY_ENTRY_IMPORT && nt->OptionalHeader.DataDirectory[i].Size) ||
+ i == IMAGE_DIRECTORY_ENTRY_RESOURCE ||
+ i == IMAGE_DIRECTORY_ENTRY_BASERELOC )
+ OK_FIELD( OptionalHeader.DataDirectory[i].VirtualAddress );
+ todo_wine_if( i == IMAGE_DIRECTORY_ENTRY_EXPORT ||
+ (i == IMAGE_DIRECTORY_ENTRY_IMPORT && nt->OptionalHeader.DataDirectory[i].Size) ||
+ i == IMAGE_DIRECTORY_ENTRY_BASERELOC )
+ OK_FIELD( OptionalHeader.DataDirectory[i].Size );
+ }
+ sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader + nt->FileHeader.SizeOfOptionalHeader);
+ sec_file = (IMAGE_SECTION_HEADER *)((char *)&nt_file->OptionalHeader + nt_file->FileHeader.SizeOfOptionalHeader);
+ for (i = 0; i < nt->FileHeader.NumberOfSections; i++)
+ todo_wine
+ ok( !memcmp( sec + i, sec_file + i, sizeof(*sec) ), "%s: wrong section %d\n", name, i );
+ UnmapViewOfFile( ptr );
+#undef OK_FIELD
+}
+
START_TEST(loader)
{
int argc;
@@ -3834,6 +3886,7 @@ START_TEST(loader)
pRtlAcquirePebLock = (void *)GetProcAddress(ntdll, "RtlAcquirePebLock");
pRtlReleasePebLock = (void *)GetProcAddress(ntdll, "RtlReleasePebLock");
pRtlImageDirectoryEntryToData = (void *)GetProcAddress(ntdll, "RtlImageDirectoryEntryToData");
+ pRtlImageNtHeader = (void *)GetProcAddress(ntdll, "RtlImageNtHeader");
pFlsAlloc = (void *)GetProcAddress(kernel32, "FlsAlloc");
pFlsSetValue = (void *)GetProcAddress(kernel32, "FlsSetValue");
pFlsGetValue = (void *)GetProcAddress(kernel32, "FlsGetValue");
@@ -3872,6 +3925,10 @@ START_TEST(loader)
test_import_resolution();
test_ExitProcess();
test_InMemoryOrderModuleList();
+ test_dll_file( "ntdll.dll" );
+ test_dll_file( "kernel32.dll" );
+ test_dll_file( "advapi32.dll" );
+ test_dll_file( "user32.dll" );
/* loader test must be last, it can corrupt the internal loader state on Windows */
test_Loader();
}
More information about the wine-cvs
mailing list