[PATCH 2/2] kernelbase: Don't use LdrLockLoaderLock() in GetModuleHandleExW().

Paul Gofman pgofman at codeweavers.com
Fri Sep 24 15:19:00 CDT 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/kernelbase/loader.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c
index ac463528e3c..a662305a250 100644
--- a/dlls/kernelbase/loader.c
+++ b/dlls/kernelbase/loader.c
@@ -375,8 +375,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExW( DWORD flags, LPCWSTR name, HMO
 {
     NTSTATUS status = STATUS_SUCCESS;
     HMODULE ret = NULL;
-    ULONG_PTR magic;
-    BOOL lock;
 
     if (!module)
     {
@@ -384,10 +382,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExW( DWORD flags, LPCWSTR name, HMO
         return FALSE;
     }
 
-    /* if we are messing with the refcount, grab the loader lock */
-    lock = (flags & GET_MODULE_HANDLE_EX_FLAG_PIN) || !(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT);
-    if (lock) LdrLockLoaderLock( 0, NULL, &magic );
-
     if (!name)
     {
         ret = NtCurrentTeb()->Peb->ImageBaseAddress;
@@ -400,20 +394,26 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExW( DWORD flags, LPCWSTR name, HMO
     else
     {
         UNICODE_STRING wstr;
+        ULONG ldr_flags = 0;
+
+        if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN)
+            ldr_flags |= LDR_GET_DLL_HANDLE_EX_FLAG_PIN;
+        if (flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT)
+            ldr_flags |= LDR_GET_DLL_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
+
         RtlInitUnicodeString( &wstr, name );
-        status = LdrGetDllHandle( NULL, 0, &wstr, &ret );
+        status = LdrGetDllHandleEx( ldr_flags, NULL, NULL, &wstr, &ret );
+        flags = GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
     }
 
     if (status == STATUS_SUCCESS)
     {
         if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN)
-            LdrAddRefDll( LDR_ADDREF_DLL_PIN, ret );
+            status = LdrAddRefDll( LDR_ADDREF_DLL_PIN, ret );
         else if (!(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))
-            LdrAddRefDll( 0, ret );
+            status = LdrAddRefDll( 0, ret );
     }
 
-    if (lock) LdrUnlockLoaderLock( 0, magic );
-
     *module = ret;
     return set_ntstatus( status );
 }
-- 
2.31.1




More information about the wine-devel mailing list