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