Module: wine Branch: master Commit: f404e309df185e4e0952f0b82d9d3533248cf9bc URL: https://source.winehq.org/git/wine.git/?a=commit;h=f404e309df185e4e0952f0b82...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 30 12:26:22 2021 +0200
kernelbase: Don't fall back to dll loading for LOAD_LIBRARY_AS_DATAFILE.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/tests/module.c | 7 +------ dlls/kernelbase/loader.c | 32 ++++++++++++-------------------- 2 files changed, 13 insertions(+), 26 deletions(-)
diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c index 46f5c43b54e..96577989431 100644 --- a/dlls/kernel32/tests/module.c +++ b/dlls/kernel32/tests/module.c @@ -377,11 +377,7 @@ static void testLoadLibraryEx(void) SetLastError(0xdeadbeef); hmodule = LoadLibraryExA("testfile.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); ok(hmodule == 0, "Expected 0, got %p\n", hmodule); - todo_wine - { - ok(GetLastError() == ERROR_FILE_INVALID, - "Expected ERROR_FILE_INVALID, got %d\n", GetLastError()); - } + ok(GetLastError() == ERROR_FILE_INVALID, "Expected ERROR_FILE_INVALID, got %d\n", GetLastError());
DeleteFileA("testfile.dll");
@@ -423,7 +419,6 @@ static void testLoadLibraryEx(void) SetLastError(0xdeadbeef); hmodule = LoadLibraryExA(path, NULL, LOAD_LIBRARY_AS_DATAFILE); ok(hmodule == 0, "Expected 0, got %p\n", hmodule); - todo_wine ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c index fc9b0ce0083..bdc153b1a47 100644 --- a/dlls/kernelbase/loader.c +++ b/dlls/kernelbase/loader.c @@ -95,6 +95,7 @@ static BOOL load_library_as_datafile( LPCWSTR load_path, DWORD flags, LPCWSTR na file = CreateFileW( filenameW, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0 ); } + if (file == INVALID_HANDLE_VALUE) ERR("can't load %s\n", debugstr_w(name)); if (file == INVALID_HANDLE_VALUE) return FALSE;
mapping = CreateFileMappingW( file, NULL, protect, 0, 0, NULL ); @@ -154,31 +155,22 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags )
LdrLockLoaderLock( 0, NULL, &magic ); if (!LdrGetDllHandle( load_path, flags, libname, &module )) - { LdrAddRefDll( 0, module ); - LdrUnlockLoaderLock( 0, magic ); - goto done; - } - if (load_library_as_datafile( load_path, flags, libname->Buffer, &module )) - { - LdrUnlockLoaderLock( 0, magic ); - goto done; - } + else + load_library_as_datafile( load_path, flags, libname->Buffer, &module ); LdrUnlockLoaderLock( 0, magic ); - flags |= DONT_RESOLVE_DLL_REFERENCES; /* Just in case */ - /* Fallback to normal behaviour */ } - - status = LdrLoadDll( load_path, flags, libname, &module ); - if (status != STATUS_SUCCESS) + else { - module = 0; - if (status == STATUS_DLL_NOT_FOUND && (GetVersion() & 0x80000000)) - SetLastError( ERROR_DLL_NOT_FOUND ); - else - SetLastError( RtlNtStatusToDosError( status ) ); + status = LdrLoadDll( load_path, flags, libname, &module ); + if (!set_ntstatus( status )) + { + module = 0; + if (status == STATUS_DLL_NOT_FOUND && (GetVersion() & 0x80000000)) + SetLastError( ERROR_DLL_NOT_FOUND ); + } } -done: + RtlReleasePath( load_path ); return module; }