kernel32: Implement SetDefaultDllDirectories.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
66e302f80b
commit
e99811aee2
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue