Alexandre Julliard : kernel32/tests: Add tests for the LOAD_LIBRARY_SEARCH_* flags.

Alexandre Julliard julliard at winehq.org
Tue Aug 29 14:48:24 CDT 2017


Module: wine
Branch: master
Commit: 934cb440e0b8f07316aa6e9d0bf31e35ebdcc86f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=934cb440e0b8f07316aa6e9d0bf31e35ebdcc86f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Aug 29 10:50:17 2017 +0200

kernel32/tests: Add tests for the LOAD_LIBRARY_SEARCH_* flags.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/module.c | 214 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 214 insertions(+)

diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c
index 560a147..bfe94b9 100644
--- a/dlls/kernel32/tests/module.c
+++ b/dlls/kernel32/tests/module.c
@@ -20,6 +20,7 @@
 
 #include "wine/test.h"
 #include <windows.h>
+#include <stdio.h>
 #include <psapi.h>
 
 static DWORD (WINAPI *pGetDllDirectoryA)(DWORD,LPSTR);
@@ -45,6 +46,89 @@ static BOOL cmpStrAW(const char* a, const WCHAR* b, DWORD lenA, DWORD lenB)
     return memcmp(aw, b, len * sizeof(WCHAR)) == 0;
 }
 
+static const struct
+{
+    IMAGE_DOS_HEADER dos;
+    IMAGE_NT_HEADERS nt;
+    IMAGE_SECTION_HEADER section;
+} dll_image =
+{
+    { IMAGE_DOS_SIGNATURE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 }, 0, 0, { 0 },
+      sizeof(IMAGE_DOS_HEADER) },
+    {
+        IMAGE_NT_SIGNATURE, /* Signature */
+        {
+#if defined __i386__
+            IMAGE_FILE_MACHINE_I386, /* Machine */
+#elif defined __x86_64__
+            IMAGE_FILE_MACHINE_AMD64, /* Machine */
+#elif defined __powerpc__
+            IMAGE_FILE_MACHINE_POWERPC, /* Machine */
+#elif defined __arm__
+            IMAGE_FILE_MACHINE_ARMNT, /* Machine */
+#elif defined __aarch64__
+            IMAGE_FILE_MACHINE_ARM64, /* Machine */
+#else
+# error You must specify the machine type
+#endif
+            1, /* NumberOfSections */
+            0, /* TimeDateStamp */
+            0, /* PointerToSymbolTable */
+            0, /* NumberOfSymbols */
+            sizeof(IMAGE_OPTIONAL_HEADER), /* SizeOfOptionalHeader */
+            IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_DLL /* Characteristics */
+        },
+        { IMAGE_NT_OPTIONAL_HDR_MAGIC, /* Magic */
+          1, /* MajorLinkerVersion */
+          0, /* MinorLinkerVersion */
+          0, /* SizeOfCode */
+          0, /* SizeOfInitializedData */
+          0, /* SizeOfUninitializedData */
+          0, /* AddressOfEntryPoint */
+          0x1000, /* BaseOfCode */
+#ifndef _WIN64
+          0, /* BaseOfData */
+#endif
+          0x10000000, /* ImageBase */
+          0x1000, /* SectionAlignment */
+          0x1000, /* FileAlignment */
+          4, /* MajorOperatingSystemVersion */
+          0, /* MinorOperatingSystemVersion */
+          1, /* MajorImageVersion */
+          0, /* MinorImageVersion */
+          4, /* MajorSubsystemVersion */
+          0, /* MinorSubsystemVersion */
+          0, /* Win32VersionValue */
+          0x2000, /* SizeOfImage */
+          sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS), /* SizeOfHeaders */
+          0, /* CheckSum */
+          IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */
+          0, /* DllCharacteristics */
+          0, /* SizeOfStackReserve */
+          0, /* SizeOfStackCommit */
+          0, /* SizeOfHeapReserve */
+          0, /* SizeOfHeapCommit */
+          0, /* LoaderFlags */
+          0, /* NumberOfRvaAndSizes */
+          { { 0 } } /* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */
+        }
+    },
+    { ".rodata", { 0 }, 0x1000, 0x1000, 0, 0, 0, 0, 0,
+      IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }
+};
+
+static void create_test_dll( const char *name )
+{
+    DWORD dummy;
+    HANDLE handle = CreateFileA( name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, 0 );
+
+    ok( handle != INVALID_HANDLE_VALUE, "failed to create file err %u\n", GetLastError() );
+    WriteFile( handle, &dll_image, sizeof(dll_image), &dummy, NULL );
+    SetFilePointer( handle, dll_image.nt.OptionalHeader.SizeOfImage, NULL, FILE_BEGIN );
+    SetEndOfFile( handle );
+    CloseHandle( handle );
+}
+
 static void testGetModuleFileName(const char* name)
 {
     HMODULE     hMod;
@@ -410,6 +494,132 @@ static void testLoadLibraryEx(void)
     FreeLibrary(hmodule);
 }
 
+static void test_LoadLibraryEx_search_flags(void)
+{
+    static const struct
+    {
+        int add_dirs[4];
+        int dll_dir;
+        int expect;
+    } tests[] =
+    {
+        { { 1, 2, 3 }, 4, 3 }, /* 0 */
+        { { 1, 3, 2 }, 4, 2 },
+        { { 3, 1 },    4, 1 },
+        { { 5, 6 },    4, 4 },
+        { { 5, 2 },    4, 2 },
+        { { 0 },       4, 4 }, /* 5 */
+        { { 0 },       0, 0 },
+        { { 6, 5 },    5, 0 },
+        { { 1, 1, 2 }, 0, 2 },
+    };
+    char *p, path[MAX_PATH], buf[MAX_PATH];
+    WCHAR bufW[MAX_PATH];
+    DLL_DIRECTORY_COOKIE cookies[4];
+    unsigned int i, j, k;
+    BOOL ret;
+    HMODULE mod;
+
+    if (!pAddDllDirectory || !pSetDllDirectoryA) return;
+
+    GetTempPathA( sizeof(path), path );
+    GetTempFileNameA( path, "tmp", 0, buf );
+    DeleteFileA( buf );
+    ret = CreateDirectoryA( buf, NULL );
+    ok( ret, "CreateDirectory failed err %u\n", GetLastError() );
+    p = buf + strlen( buf );
+    for (i = 1; i <= 6; i++)
+    {
+        sprintf( p, "\\%u", i );
+        ret = CreateDirectoryA( buf, NULL );
+        ok( ret, "CreateDirectory failed err %u\n", GetLastError() );
+        if (i >= 5) continue;  /* dirs 5 and 6 are left empty */
+        sprintf( p, "\\%u\\winetestdll.dll", i );
+        create_test_dll( buf );
+    }
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_APPLICATION_DIR );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_USER_DIRS );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_MOD_NOT_FOUND || broken(GetLastError() == ERROR_NOT_ENOUGH_MEMORY),
+        "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_SYSTEM32 );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32 );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "foo\\winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    mod = LoadLibraryExA( "\\windows\\winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR );
+    ok( !mod, "LoadLibrary succeeded\n" );
+    ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() );
+
+    for (j = 0; j < sizeof(tests) / sizeof(tests[0]); j++)
+    {
+        for (k = 0; tests[j].add_dirs[k]; k++)
+        {
+            sprintf( p, "\\%u", tests[j].add_dirs[k] );
+            MultiByteToWideChar( CP_ACP, 0, buf, -1, bufW, MAX_PATH );
+            cookies[k] = pAddDllDirectory( bufW );
+            ok( cookies[k] != NULL, "failed to add %s\n", buf );
+        }
+        if (tests[j].dll_dir)
+        {
+            sprintf( p, "\\%u", tests[j].dll_dir );
+            pSetDllDirectoryA( buf );
+        }
+        else pSetDllDirectoryA( NULL );
+
+        SetLastError( 0xdeadbeef );
+        mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_USER_DIRS );
+        if (tests[j].expect)
+        {
+            ok( mod != NULL, "%u: LoadLibrary failed err %u\n", j, GetLastError() );
+            GetModuleFileNameA( mod, path, MAX_PATH );
+            sprintf( p, "\\%u\\winetestdll.dll", tests[j].expect );
+            ok( !lstrcmpiA( path, buf ), "%u: wrong module %s expected %s\n", j, path, buf );
+        }
+        else
+        {
+            ok( !mod, "%u: LoadLibrary succeeded\n", j );
+            ok( GetLastError() == ERROR_MOD_NOT_FOUND || broken(GetLastError() == ERROR_NOT_ENOUGH_MEMORY),
+                "%u: wrong error %u\n", j, GetLastError() );
+        }
+        FreeLibrary( mod );
+
+        for (k = 0; tests[j].add_dirs[k]; k++) pRemoveDllDirectory( cookies[k] );
+    }
+
+    for (i = 1; i <= 6; i++)
+    {
+        sprintf( p, "\\%u\\winetestdll.dll", i );
+        DeleteFileA( buf );
+        sprintf( p, "\\%u", i );
+        RemoveDirectoryA( buf );
+    }
+    *p = 0;
+    RemoveDirectoryA( buf );
+}
+
 static void testGetDllDirectory(void)
 {
     CHAR bufferA[MAX_PATH];
@@ -814,6 +1024,9 @@ static void test_SetDefaultDllDirectories(void)
     mod = LoadLibraryA( "authz.dll" );
     ok( mod != NULL, "loading authz failed\n" );
     FreeLibrary( mod );
+    mod = LoadLibraryExA( "authz.dll", 0, LOAD_LIBRARY_SEARCH_APPLICATION_DIR );
+    todo_wine ok( !mod, "loading authz succeeded\n" );
+    FreeLibrary( mod );
     ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_APPLICATION_DIR );
     ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() );
     mod = LoadLibraryA( "authz.dll" );
@@ -881,6 +1094,7 @@ START_TEST(module)
     testLoadLibraryA_Wrong();
     testGetProcAddress_Wrong();
     testLoadLibraryEx();
+    test_LoadLibraryEx_search_flags();
     testGetModuleHandleEx();
     testK32GetModuleInformation();
     test_AddDllDirectory();




More information about the wine-cvs mailing list