Paul Gofman : kernelbase: Don't use LdrLockLoaderLock() in GetModuleHandleExW().
Alexandre Julliard
julliard at winehq.org
Mon Sep 27 15:21:45 CDT 2021
Module: wine
Branch: master
Commit: 4e50b6179f8f8d4c2f9eda395d479f81f7199bed
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4e50b6179f8f8d4c2f9eda395d479f81f7199bed
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Mon Sep 27 13:50:03 2021 +0300
kernelbase: Don't use LdrLockLoaderLock() in GetModuleHandleExW().
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/loader.c | 47 +++++++++++++++++++++--------------------------
1 file changed, 21 insertions(+), 26 deletions(-)
diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c
index 9aff460c955..da139e91176 100644
--- a/dlls/kernelbase/loader.c
+++ b/dlls/kernelbase/loader.c
@@ -373,10 +373,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExA( DWORD flags, LPCSTR name, HMOD
*/
BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExW( DWORD flags, LPCWSTR name, HMODULE *module )
{
- NTSTATUS status = STATUS_SUCCESS;
HMODULE ret = NULL;
- ULONG_PTR magic;
- BOOL lock;
+ NTSTATUS status;
+ void *dummy;
if (!module)
{
@@ -394,35 +393,31 @@ 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;
- }
- else if (flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
- {
- void *dummy;
- if (!(ret = RtlPcToFileHeader( (void *)name, &dummy ))) status = STATUS_DLL_NOT_FOUND;
- }
- else
+ if (name && !(flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS))
{
UNICODE_STRING wstr;
- RtlInitUnicodeString( &wstr, name );
- status = LdrGetDllHandle( NULL, 0, &wstr, &ret );
- }
+ ULONG ldr_flags = 0;
- if (status == STATUS_SUCCESS)
- {
if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN)
- LdrAddRefDll( LDR_ADDREF_DLL_PIN, ret );
- else if (!(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))
- LdrAddRefDll( 0, ret );
+ 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 = LdrGetDllHandleEx( ldr_flags, NULL, NULL, &wstr, &ret );
}
+ else
+ {
+ ret = name ? RtlPcToFileHeader( (void *)name, &dummy ) : NtCurrentTeb()->Peb->ImageBaseAddress;
- if (lock) LdrUnlockLoaderLock( 0, magic );
+ if (ret)
+ {
+ if (!(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))
+ status = LdrAddRefDll( flags & GET_MODULE_HANDLE_EX_FLAG_PIN ? LDR_ADDREF_DLL_PIN : 0, ret );
+ else
+ status = STATUS_SUCCESS;
+ } else status = STATUS_DLL_NOT_FOUND;
+ }
*module = ret;
return set_ntstatus( status );
More information about the wine-cvs
mailing list