Module: wine Branch: master Commit: aee405e2cb045458a0c23fad90a5721e282c23a7 URL: https://source.winehq.org/git/wine.git/?a=commit;h=aee405e2cb045458a0c23fad9...
Author: Paul Gofman pgofman@codeweavers.com Date: Mon Dec 20 18:07:33 2021 +0300
ntdll: Always try searching apiset DLLs in the default directories.
This is a temporary workaround until we have a correct apisets implementation.
Signed-off-by: Paul Gofman pgofman@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/tests/module.c | 23 +++++++++++++++++++++++ dlls/ntdll/loader.c | 12 ++++++++++++ 2 files changed, 35 insertions(+)
diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c index 2ee23595f55..8ec3a5433ee 100644 --- a/dlls/kernel32/tests/module.c +++ b/dlls/kernel32/tests/module.c @@ -466,6 +466,7 @@ static void testLoadLibraryEx(void)
static void test_LoadLibraryEx_search_flags(void) { + static const char apiset_dll[] = "api-ms-win-shcore-obsolete-l1-1-0.dll"; static const struct { int add_dirs[4]; @@ -684,6 +685,28 @@ static void test_LoadLibraryEx_search_flags(void) for (k = 0; tests[j].add_dirs[k]; k++) pRemoveDllDirectory( cookies[k] ); }
+ mod = GetModuleHandleA( apiset_dll ); + if (mod) + { + win_skip( "%s already referenced, skipping test.\n", apiset_dll ); + } + else + { + mod = LoadLibraryA( apiset_dll ); + if (mod) + { + FreeLibrary(mod); + mod = LoadLibraryExA( apiset_dll, NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR ); + ok( !!mod, "Got NULL module, error %u.\n", GetLastError() ); + ok( !!GetModuleHandleA( apiset_dll ), "Got NULL handle.\n" ); + ret = FreeLibrary( mod ); + ok( ret, "FreeLibrary failed, error %u.\n", GetLastError() ); + } + else + { + win_skip( "%s not found, skipping test.\n", apiset_dll ); + } + } done: for (i = 1; i <= 6; i++) { diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index c8f3d83947f..362e1c66be5 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2905,6 +2905,16 @@ done: return status; }
+/*********************************************************************** + * is_apiset_dll_name + * + */ +static BOOL is_apiset_dll_name( const WCHAR *name ) +{ + static const WCHAR name_prefix[] = L"api-ms-win-"; + + return !wcsnicmp( name, name_prefix, ARRAY_SIZE(name_prefix) - 1 ); +}
/*********************************************************************** * find_dll_file @@ -2948,6 +2958,8 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, UNI if (RtlDetermineDosPathNameType_U( libname ) == RELATIVE_PATH) { status = search_dll_file( load_path, libname, nt_name, pwm, mapping, image_info, id ); + if (status == STATUS_DLL_NOT_FOUND && load_path && is_apiset_dll_name( libname )) + status = search_dll_file( NULL, libname, nt_name, pwm, mapping, image_info, id ); if (status == STATUS_DLL_NOT_FOUND) status = find_builtin_without_file( libname, nt_name, pwm, mapping, image_info, id ); }