[v3 1/5] kernel32: Add initial function to handle LIBRARY_SEARCH_* of dll path

Carlos Palminha CARLOS.PALMINHA at synopsys.com
Fri Aug 11 05:39:32 CDT 2017


Function that will take into consideration the LIBRARY_SEARCH_* flags
when building the path for loading dlls.

The unsupported flags cannot be used combined with ALTERED_SEARCH_PATH.

Signed-off-by: Carlos Palminha <palminha at synopsys.com>
---
 v3:
  - no changes

 v2:
  - no changes

 dlls/kernel32/kernel_private.h |  1 +
 dlls/kernel32/module.c         | 40 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index 76611d74fae..076f1470962 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -89,6 +89,7 @@ struct binary_info
 };
 
 /* module.c */
+extern WCHAR *MODULE_get_dll_load_path_flags( DWORD flags ) DECLSPEC_HIDDEN;
 extern WCHAR *MODULE_get_dll_load_path( LPCWSTR module ) DECLSPEC_HIDDEN;
 extern void MODULE_get_binary_info( HANDLE hfile, struct binary_info *info ) DECLSPEC_HIDDEN;
 
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index badfe1d175b..c6696d84918 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -771,6 +771,32 @@ static inline const WCHAR *get_module_path_end(const WCHAR *module)
 }
 
 /******************************************************************
+ *      MODULE_get_dll_load_path_flags
+ *
+ * Compute the load path to use taking into account the LIBRARY_SEARCH_* flags.
+ * Returned pointer must be freed by caller.
+ */
+
+WCHAR *MODULE_get_dll_load_path_flags( DWORD flags ) {
+    if (flags & LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR) {
+        FIXME("unsupported flag used LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR (flags: 0x%08x)\n", flags);
+    }
+
+    if (flags & LOAD_LIBRARY_SEARCH_APPLICATION_DIR || flags & LOAD_LIBRARY_SEARCH_DEFAULT_DIRS) {
+        FIXME("unsupported flag used LOAD_LIBRARY_SEARCH_APPLICATION_DIR (flags: 0x%08x)\n", flags);
+    }
+
+    if (flags & LOAD_LIBRARY_SEARCH_USER_DIRS || flags & LOAD_LIBRARY_SEARCH_DEFAULT_DIRS) {
+        FIXME("unsupported flag used LOAD_LIBRARY_SEARCH_USER_DIRS (flags: 0x%08x)\n", flags);
+    }
+
+    if (flags & LOAD_LIBRARY_SEARCH_SYSTEM32 || flags & LOAD_LIBRARY_SEARCH_DEFAULT_DIRS) {
+        FIXME("unsupported flag used LOAD_LIBRARY_SEARCH_SYSTEM32 (flags: 0x%08x)\n", flags);
+    }
+    return NULL;
+}
+
+/******************************************************************
  *		MODULE_get_dll_load_path
  *
  * Compute the load path to use for a given dll.
@@ -911,17 +937,25 @@ static HMODULE load_library( const UNICODE_STRING *libname, DWORD flags )
         LOAD_IGNORE_CODE_AUTHZ_LEVEL |
         LOAD_LIBRARY_AS_IMAGE_RESOURCE |
         LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE |
-        LOAD_LIBRARY_REQUIRE_SIGNED_TARGET |
-        LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR |
+        LOAD_LIBRARY_REQUIRE_SIGNED_TARGET;
+
+    DWORD lib_search_flags = LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR |
         LOAD_LIBRARY_SEARCH_APPLICATION_DIR |
         LOAD_LIBRARY_SEARCH_USER_DIRS |
         LOAD_LIBRARY_SEARCH_SYSTEM32 |
         LOAD_LIBRARY_SEARCH_DEFAULT_DIRS;
 
+
     if( flags & unsupported_flags)
         FIXME("unsupported flag(s) used (flags: 0x%08x)\n", flags);
 
-    load_path = MODULE_get_dll_load_path( flags & LOAD_WITH_ALTERED_SEARCH_PATH ? libname->Buffer : NULL );
+    /* Check if any search flags (different from ALTERED_SEARCH) is used
+     * if not fallback on default behaviour
+     */
+    if (flags & lib_search_flags)
+        load_path = MODULE_get_dll_load_path_flags( flags);
+    else
+        load_path = MODULE_get_dll_load_path( flags & LOAD_WITH_ALTERED_SEARCH_PATH ? libname->Buffer : NULL );
 
     if (flags & LOAD_LIBRARY_AS_DATAFILE)
     {
-- 
2.11.0




More information about the wine-patches mailing list