Module: wine Branch: master Commit: 8530cb0aecaef8f6e925c39a6c2c111f908c5509 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8530cb0aecaef8f6e925c39a6c...
Author: Alexandre Julliard julliard@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());