Module: wine Branch: master Commit: 91e33020f05618826a378b540a234f400a660ac8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=91e33020f05618826a378b540a...
Author: Roy Shea royshea@gmail.com Date: Fri Sep 12 13:54:22 2008 -0700
kernel32/test: Test import entries of a core windows DLL.
---
dlls/kernel32/tests/loader.c | 71 +++++++++++++++++++++++++++++++++++++++++- 1 files changed, 70 insertions(+), 1 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index 363c2fd..a08cfdb 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -27,6 +27,13 @@
#define ALIGN_SIZE(size, alignment) (((size) + (alignment - 1)) & ~((alignment - 1)))
+static PVOID RVAToAddr(DWORD_PTR rva, HMODULE module) +{ + if (rva == 0) + return NULL; + return ((char*) module) + rva; +} + static const struct { WORD e_magic; /* 00: MZ Header signature */ @@ -103,7 +110,7 @@ static IMAGE_SECTION_HEADER section = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, /* Characteristics */ };
-START_TEST(loader) +static void test_Loader(void) { static const struct test_data { @@ -480,3 +487,65 @@ endloop: ok(DeleteFile(dll_name), "DeleteFile error %d\n", GetLastError()); } } + +/* Verify linking style of import descriptors */ +static void test_ImportDescriptors(void) +{ + HMODULE kernel32_module = NULL; + PIMAGE_DOS_HEADER d_header; + PIMAGE_NT_HEADERS nt_headers; + DWORD import_dir_size; + DWORD_PTR dir_offset; + PIMAGE_IMPORT_DESCRIPTOR import_chunk; + + /* Load kernel32 module */ + kernel32_module = GetModuleHandleA("kernel32.dll"); + assert( kernel32_module != NULL ); + + /* Get PE header info from module image */ + d_header = (PIMAGE_DOS_HEADER) kernel32_module; + nt_headers = (PIMAGE_NT_HEADERS) (((char*) d_header) + + d_header->e_lfanew); + + /* Get size of import entry directory */ + import_dir_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; + if (!import_dir_size) + { + skip("Unable to continue testing due to missing import directory.\n"); + return; + } + + /* Get address of first import chunk */ + dir_offset = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; + import_chunk = RVAToAddr(dir_offset, kernel32_module); + ok(import_chunk != 0, "Invalid import_chunk: %p\n", import_chunk); + if (!import_chunk) return; + + /* Iterate through import descriptors and verify set name, + * OriginalFirstThunk, and FirstThunk. Core Windows DLLs, such as + * kernel32.dll, don't use Borland-style linking, where the table of + * imported names is stored directly in FirstThunk and overwritten + * by the relocation, instead of being stored in OriginalFirstThunk. + * */ + for (; import_chunk->FirstThunk; import_chunk++) + { + LPCSTR module_name = (LPCSTR) RVAToAddr( + import_chunk->Name, kernel32_module); + PIMAGE_THUNK_DATA name_table = (PIMAGE_THUNK_DATA) RVAToAddr( + import_chunk->OriginalFirstThunk, kernel32_module); + PIMAGE_THUNK_DATA iat = (PIMAGE_THUNK_DATA) RVAToAddr( + import_chunk->FirstThunk, kernel32_module); + ok(module_name != NULL, "Imported module name should not be NULL\n"); + ok(name_table != NULL, + "Name table for imported module %s should not be NULL\n", + module_name); + ok(iat != NULL, "IAT for imported module %s should not be NULL\n", + module_name); + } +} + +START_TEST(loader) +{ + test_Loader(); + test_ImportDescriptors(); +}