kernel32: Implement SetDefaultDllDirectories.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2017-08-28 13:29:09 +02:00
parent 66e302f80b
commit e99811aee2
3 changed files with 91 additions and 16 deletions

View file

@ -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);

View file

@ -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;
}

View file

@ -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();
}