[PATCH v2 21/22] ntdll: Use shared loader locking in LdrGetDllFullName().

Paul Gofman pgofman at codeweavers.com
Tue Oct 5 17:49:27 CDT 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/kernel32/tests/loader.c | 19 +++++++++++++++++++
 dlls/ntdll/loader.c          |  2 +-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index ba979a26a32..5a706fadc48 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -4225,11 +4225,13 @@ static void test_loader_lock(void)
     BOOL blocks_on_load_in_progress_module = FALSE;
     BOOL blocks_on_decref_library = FALSE;
     HMODULE hmodule_preloaded, hmodule;
+    WCHAR buffer[MAX_PATH];
     ULONG_PTR magic;
     NTSTATUS status;
     HANDLE thread;
     void *cookie;
     void *proc;
+    DWORD ret;
     BOOL bret;
 
     extract_resource("locking_dll.dll", "TESTDLL", "lock.dll");
@@ -4337,6 +4339,10 @@ static void test_loader_lock(void)
     ok(bret, "GetModuleHandleEx failed, err %u.\n", GetLastError());
     ok(hmodule == hmodule_preloaded, "Got unexpected hmodule %p, expected %p.\n", hmodule, hmodule_preloaded);
 
+    ret = GetModuleFileNameW(hmodule, buffer, ARRAY_SIZE(buffer));
+    check_timeout(FALSE);
+    ok(ret, "Got zero ret.\n");
+
     proc = GetProcAddress(hmodule, "timeGetTime");
     check_timeout(FALSE);
     ok(!!proc, "GetProcAddress failed.\n");
@@ -4371,6 +4377,10 @@ static void test_loader_lock(void)
         check_timeout(blocks_on_decref_library);
         ok(bret, "FreeLibrary failed, err %u.\n", GetLastError());
 
+        ret = GetModuleFileNameW(lock_dll_handle, buffer, ARRAY_SIZE(buffer));
+        check_timeout(FALSE);
+        ok(ret, "Got zero ret.\n");
+
         if (BLOCKING_TESTS_ENABLED)
         {
             ok(!!lock_dll_handle, "Got NULL lock_dll_handle.\n");
@@ -4421,6 +4431,10 @@ static void test_loader_lock(void)
     ok(hmodule == hmodule_preloaded, "Got unexpected hmodule %p, expected %p.\n", hmodule, hmodule_preloaded);
     check_timeout(FALSE);
 
+    ret = GetModuleFileNameW(hmodule, buffer, ARRAY_SIZE(buffer));
+    check_timeout(FALSE);
+    ok(ret, "Got zero ret.\n");
+
     proc = GetProcAddress(hmodule, "timeGetTime");
     ok(!!proc, "GetProcAddress failed.\n");
     check_timeout(FALSE);
@@ -4454,6 +4468,11 @@ static void test_loader_lock(void)
     check_timeout(FALSE);
     ok(status == STATUS_DLL_NOT_FOUND, "Got unexpected status %#x.\n", status);
 
+    ret = GetModuleFileNameW(lock_dll_handle, buffer, ARRAY_SIZE(buffer));
+    check_timeout(FALSE);
+    ok((!blocks_on_load_in_progress_module && ret) || (blocks_on_load_in_progress_module && !ret),
+            "Got unexpected ret %u.\n", ret);
+
     if (BLOCKING_TESTS_ENABLED)
     {
         hmodule = GetModuleHandleW(L"lock.dll");
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index eaca55acf65..65cf618626b 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -3383,7 +3383,7 @@ NTSTATUS WINAPI LdrGetDllFullName( HMODULE module, UNICODE_STRING *name )
 
     if (!module) module = NtCurrentTeb()->Peb->ImageBaseAddress;
 
-    lock_loader_exclusive();
+    lock_loader_shared();
     wm = get_modref( module );
     if (wm)
     {
-- 
2.31.1




More information about the wine-devel mailing list