From: Paul Gofman <pgofman@codeweavers.com> --- dlls/kernelbase/loader.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c index 35edbd1922b..34767ab4a7b 100644 --- a/dlls/kernelbase/loader.c +++ b/dlls/kernelbase/loader.c @@ -152,25 +152,29 @@ failed: static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags ) { const DWORD unsupported_flags = LOAD_IGNORE_CODE_AUTHZ_LEVEL | LOAD_LIBRARY_REQUIRE_SIGNED_TARGET; + const ULONG load_library_search_flags = LOAD_WITH_ALTERED_SEARCH_PATH | 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; NTSTATUS status; HMODULE module; WCHAR *load_path, *dummy; - DWORD load_flags = 0; + DWORD load_flags = 0, search_flags; if (flags & unsupported_flags) FIXME( "unsupported flag(s) used %#08lx\n", flags ); - if (!set_ntstatus( LdrGetDllPath( libname->Buffer, flags, &load_path, &dummy ))) return 0; - if (flags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)) { + if (!set_ntstatus( LdrGetDllPath( libname->Buffer, flags, &load_path, &dummy ))) return 0; if (LdrGetDllHandleEx( 0, load_path, NULL, libname, &module )) load_library_as_datafile( load_path, flags, libname->Buffer, &module ); + RtlReleasePath( load_path ); } else { + search_flags = flags & load_library_search_flags; if (flags & DONT_RESOLVE_DLL_REFERENCES) load_flags |= LDR_DONT_RESOLVE_REFS; - status = LdrLoadDll( load_path, &load_flags, libname, &module ); + status = LdrLoadDll( (void *)((ULONG_PTR)search_flags | 1), &load_flags, libname, &module ); if (!set_ntstatus( status )) { module = 0; @@ -178,8 +182,6 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags ) SetLastError( ERROR_DLL_NOT_FOUND ); } } - - RtlReleasePath( load_path ); return module; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9888