Alexandre Julliard : kernel32: Check for already loaded module also for LOAD_LIBRARY_AS_DATAFILE.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 17 06:42:23 CDT 2007


Module: wine
Branch: master
Commit: 8530cb0aecaef8f6e925c39a6c2c111f908c5509
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8530cb0aecaef8f6e925c39a6c2c111f908c5509

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed May 16 16:58:51 2007 +0200

kernel32: Check for already loaded module also for LOAD_LIBRARY_AS_DATAFILE.

---

 dlls/kernel32/module.c       |   19 ++++++++++++++++---
 dlls/kernel32/tests/loader.c |    4 ++--
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 1c61e7e..996abf3 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -844,24 +844,37 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags )
     HMODULE hModule;
     WCHAR *load_path;
 
+    load_path = MODULE_get_dll_load_path( flags & LOAD_WITH_ALTERED_SEARCH_PATH ? libname->Buffer : NULL );
+
     if (flags & LOAD_LIBRARY_AS_DATAFILE)
     {
+        ULONG magic;
+
+        LdrLockLoaderLock( 0, NULL, &magic );
+        if (!(nts = LdrGetDllHandle( load_path, flags, libname, &hModule )))
+        {
+            LdrAddRefDll( 0, hModule );
+            LdrUnlockLoaderLock( 0, magic );
+            goto done;
+        }
+        LdrUnlockLoaderLock( 0, magic );
+
         /* The method in load_library_as_datafile allows searching for the
          * 'native' libraries only
          */
-        if (load_library_as_datafile( libname->Buffer, &hModule )) return hModule;
+        if (load_library_as_datafile( libname->Buffer, &hModule )) goto done;
         flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */
         /* Fallback to normal behaviour */
     }
 
-    load_path = MODULE_get_dll_load_path( flags & LOAD_WITH_ALTERED_SEARCH_PATH ? libname->Buffer : NULL );
     nts = LdrLoadDll( load_path, flags, libname, &hModule );
-    HeapFree( GetProcessHeap(), 0, load_path );
     if (nts != STATUS_SUCCESS)
     {
         hModule = 0;
         SetLastError( RtlNtStatusToDosError( nts ) );
     }
+done:
+    HeapFree( GetProcessHeap(), 0, load_path );
     return hModule;
 }
 
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index b67b81d..7b297a2 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -424,14 +424,14 @@ START_TEST(loader)
             SetLastError(0xdeadbeef);
             hlib_as_data_file = LoadLibraryEx(dll_name, 0, LOAD_LIBRARY_AS_DATAFILE);
             ok(hlib_as_data_file != 0, "LoadLibraryEx error %u\n", GetLastError());
-todo_wine   ok(hlib_as_data_file == hlib, "hlib_as_file and hlib are different\n");
+            ok(hlib_as_data_file == hlib, "hlib_as_file and hlib are different\n");
 
             SetLastError(0xdeadbeef);
             ok(FreeLibrary(hlib), "FreeLibrary error %d\n", GetLastError());
 
             SetLastError(0xdeadbeef);
             hlib = GetModuleHandle(dll_name);
-todo_wine   ok(hlib != 0, "GetModuleHandle error %u\n", GetLastError());
+            ok(hlib != 0, "GetModuleHandle error %u\n", GetLastError());
 
             SetLastError(0xdeadbeef);
             ok(FreeLibrary(hlib_as_data_file), "FreeLibrary error %d\n", GetLastError());




More information about the wine-cvs mailing list