[PATCH 15/22] ntdll: Use shared loader locking in LdrGetDllHandleEx().
Paul Gofman
pgofman at codeweavers.com
Fri Oct 1 13:21:00 CDT 2021
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
dlls/ntdll/loader.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 927de8e25f5..99d5c08b002 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -3396,11 +3396,23 @@ NTSTATUS WINAPI LdrGetDllHandleEx( ULONG flags, LPCWSTR load_path, ULONG *dll_ch
if (flags & ~supported_flags) FIXME( "Unsupported flags %#x.\n", flags );
if (dll_characteristics) FIXME( "dll_characteristics unsupported.\n" );
- lock_loader_exclusive();
+ lock_loader_shared();
+retry:
status = find_dll_file( load_path, name->Buffer, L".dll", &nt_name, &wm, &mapping, &image_info, &id );
- if (wm) *base = wm->ldr.DllBase;
+ if (wm)
+ {
+ lock_module_info();
+ if (!is_thread_exclusive() && !wm->ldr.LoadCount)
+ {
+ unlock_module_info();
+ wait_for_exclusive_lock_release();
+ goto retry;
+ }
+ unlock_module_info();
+ *base = wm->ldr.DllBase;
+ }
else
{
if (status == STATUS_SUCCESS) NtClose( mapping );
@@ -3411,9 +3423,9 @@ NTSTATUS WINAPI LdrGetDllHandleEx( ULONG flags, LPCWSTR load_path, ULONG *dll_ch
if (!status)
{
if (flags & LDR_GET_DLL_HANDLE_EX_FLAG_PIN)
- LdrAddRefDll( LDR_ADDREF_DLL_PIN, *base );
+ status = LdrAddRefDll( LDR_ADDREF_DLL_PIN, *base );
else if (!(flags & LDR_GET_DLL_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))
- LdrAddRefDll( 0, *base );
+ status = LdrAddRefDll( 0, *base );
}
unlock_loader();
--
2.31.1
More information about the wine-devel
mailing list