Alexandre Julliard : kernelbase: Don't fall back to dll loading for LOAD_LIBRARY_AS_DATAFILE.

Alexandre Julliard julliard at winehq.org
Tue Mar 30 15:19:50 CDT 2021


Module: wine
Branch: master
Commit: f404e309df185e4e0952f0b82d9d3533248cf9bc
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f404e309df185e4e0952f0b82d9d3533248cf9bc

Author: Alexandre Julliard <julliard at 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 at 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;
 }




More information about the wine-cvs mailing list