Alexandre Julliard : kernel32: Implement SetDefaultDllDirectories.

Alexandre Julliard julliard at winehq.org
Mon Aug 28 14:05:17 CDT 2017


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug 28 13:29:09 2017 +0200

kernel32: Implement SetDefaultDllDirectories.

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

---

 dlls/kernel32/module.c       | 30 ++++++++++++++++----
 dlls/kernel32/path.c         | 10 -------
 dlls/kernel32/tests/module.c | 67 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 91 insertions(+), 16 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 97d815c..8abf195 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -48,6 +48,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(module);
 #define NE_FFLAGS_LIBMODULE 0x8000
 
 static WCHAR *dll_directory;  /* extra path for SetDllDirectoryW */
+static DWORD default_search_flags;  /* default flags set by SetDefaultDllDirectories */
 
 static CRITICAL_SECTION dlldir_section;
 static CRITICAL_SECTION_DEBUG critsect_debug =
@@ -58,6 +59,10 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
 };
 static CRITICAL_SECTION dlldir_section = { &critsect_debug, -1, 0, 0, 0, 0 };
 
+static const DWORD load_library_search_flags = (LOAD_LIBRARY_SEARCH_APPLICATION_DIR |
+                                                LOAD_LIBRARY_SEARCH_USER_DIRS |
+                                                LOAD_LIBRARY_SEARCH_SYSTEM32 |
+                                                LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
 
 /****************************************************************************
  *              GetDllDirectoryA   (KERNEL32.@)
@@ -148,6 +153,21 @@ BOOL WINAPI SetDllDirectoryW( LPCWSTR dir )
 }
 
 
+/*************************************************************************
+ *           SetDefaultDllDirectories   (KERNEL32.@)
+ */
+BOOL WINAPI SetDefaultDllDirectories( DWORD flags )
+{
+    if (!flags || (flags & ~load_library_search_flags))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    default_search_flags = flags;
+    return TRUE;
+}
+
+
 /****************************************************************************
  *              DisableThreadLibraryCalls (KERNEL32.@)
  *
@@ -964,16 +984,14 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags )
     NTSTATUS nts;
     HMODULE hModule;
     WCHAR *load_path;
-    static const DWORD unsupported_flags = 
+    static const DWORD unsupported_flags = load_library_search_flags |
         LOAD_IGNORE_CODE_AUTHZ_LEVEL |
         LOAD_LIBRARY_AS_IMAGE_RESOURCE |
         LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
         LOAD_LIBRARY_REQUIRE_SIGNED_TARGET |
-        LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR |
-        LOAD_LIBRARY_SEARCH_APPLICATION_DIR |
-        LOAD_LIBRARY_SEARCH_USER_DIRS |
-        LOAD_LIBRARY_SEARCH_SYSTEM32 |
-        LOAD_LIBRARY_SEARCH_DEFAULT_DIRS;
+        LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR;
+
+    if (!(flags & load_library_search_flags)) flags |= default_search_flags;
 
     if( flags & unsupported_flags)
         FIXME("unsupported flag(s) used (flags: 0x%08x)\n", flags);
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index c746693..ec7c53b 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -2081,13 +2081,3 @@ BOOL WINAPI SetSearchPathMode(DWORD flags)
     SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
     return FALSE;
 }
-
-/*************************************************************************
- *           SetDefaultDllDirectories   (KERNEL32.@)
- */
-BOOL WINAPI SetDefaultDllDirectories(DWORD flags)
-{
-    FIXME("(%x): stub\n", flags);
-    SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
-    return FALSE;
-}
diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c
index bb22c24..6b178c8 100644
--- a/dlls/kernel32/tests/module.c
+++ b/dlls/kernel32/tests/module.c
@@ -25,6 +25,7 @@
 static DWORD (WINAPI *pGetDllDirectoryA)(DWORD,LPSTR);
 static DWORD (WINAPI *pGetDllDirectoryW)(DWORD,LPWSTR);
 static BOOL (WINAPI *pSetDllDirectoryA)(LPCSTR);
+static BOOL (WINAPI *pSetDefaultDllDirectories)(DWORD);
 static BOOL (WINAPI *pGetModuleHandleExA)(DWORD,LPCSTR,HMODULE*);
 static BOOL (WINAPI *pGetModuleHandleExW)(DWORD,LPCWSTR,HMODULE*);
 static BOOL (WINAPI *pK32GetModuleInformation)(HANDLE process, HMODULE module,
@@ -515,6 +516,7 @@ static void init_pointers(void)
     MAKEFUNC(GetDllDirectoryA);
     MAKEFUNC(GetDllDirectoryW);
     MAKEFUNC(SetDllDirectoryA);
+    MAKEFUNC(SetDefaultDllDirectories);
     MAKEFUNC(GetModuleHandleExA);
     MAKEFUNC(GetModuleHandleExW);
     MAKEFUNC(K32GetModuleInformation);
@@ -739,6 +741,70 @@ static void testK32GetModuleInformation(void)
     ok(info.EntryPoint != NULL, "Expected nonzero entrypoint\n");
 }
 
+static void test_SetDefaultDllDirectories(void)
+{
+    HMODULE mod;
+    BOOL ret;
+
+    if (!pSetDefaultDllDirectories)
+    {
+        win_skip( "SetDefaultDllDirectories not available\n" );
+        return;
+    }
+
+    mod = LoadLibraryA( "authz.dll" );
+    ok( mod != NULL, "loading authz failed\n" );
+    FreeLibrary( mod );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_USER_DIRS );
+    ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() );
+    mod = LoadLibraryA( "authz.dll" );
+    todo_wine ok( !mod, "loading authz succeeded\n" );
+    FreeLibrary( mod );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_SYSTEM32 );
+    ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() );
+    mod = LoadLibraryA( "authz.dll" );
+    ok( mod != NULL, "loading authz failed\n" );
+    FreeLibrary( mod );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_APPLICATION_DIR );
+    ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() );
+    mod = LoadLibraryA( "authz.dll" );
+    todo_wine ok( !mod, "loading authz succeeded\n" );
+    FreeLibrary( mod );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DEFAULT_DIRS );
+    ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() );
+    mod = LoadLibraryA( "authz.dll" );
+    ok( mod != NULL, "loading authz failed\n" );
+    FreeLibrary( mod );
+
+    SetLastError( 0xdeadbeef );
+    ret = pSetDefaultDllDirectories( 0 );
+    ok( !ret, "SetDefaultDllDirectories succeeded\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    ret = pSetDefaultDllDirectories( 3 );
+    ok( !ret, "SetDefaultDllDirectories succeeded\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_APPLICATION_DIR | 0x8000 );
+    ok( !ret, "SetDefaultDllDirectories succeeded\n" );
+    ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR );
+    ok( !ret || broken(ret) /* win7 */, "SetDefaultDllDirectories succeeded\n" );
+    if (!ret) ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_USER_DIRS );
+    ok( !ret || broken(ret) /* win7 */, "SetDefaultDllDirectories succeeded\n" );
+    if (!ret) ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
+
+    /* restore some sane defaults */
+    pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DEFAULT_DIRS );
+}
+
 START_TEST(module)
 {
     WCHAR filenameW[MAX_PATH];
@@ -768,4 +834,5 @@ START_TEST(module)
     testLoadLibraryEx();
     testGetModuleHandleEx();
     testK32GetModuleInformation();
+    test_SetDefaultDllDirectories();
 }




More information about the wine-cvs mailing list