Esme Povirk : mscoree: Add an override option for skipping the AppDomain search path.

Alexandre Julliard julliard at winehq.org
Tue Mar 1 15:45:33 CST 2022


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

Author: Esme Povirk <esme at codeweavers.com>
Date:   Mon Feb 28 14:49:16 2022 -0600

mscoree: Add an override option for skipping the AppDomain search path.

Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mscoree/metahost.c        | 36 +++++++++++++++++++++++++++++++++---
 dlls/mscoree/mscoree_private.h |  2 ++
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c
index 8e28ad2f8db..c72f510c8ac 100644
--- a/dlls/mscoree/metahost.c
+++ b/dlls/mscoree/metahost.c
@@ -130,10 +130,12 @@ MonoThread* (CDECL *mono_thread_attach)(MonoDomain *domain);
 void (CDECL *mono_thread_manage)(void);
 void (CDECL *mono_trace_set_print_handler)(MonoPrintCallback callback);
 void (CDECL *mono_trace_set_printerr_handler)(MonoPrintCallback callback);
+static void (CDECL *wine_mono_install_assembly_preload_hook)(WineMonoAssemblyPreLoadFunc func, void *user_data);
 
 static BOOL find_mono_dll(LPCWSTR path, LPWSTR dll_path);
 
 static MonoAssembly* CDECL mono_assembly_preload_hook_fn(MonoAssemblyName *aname, char **assemblies_path, void *user_data);
+static MonoAssembly* CDECL wine_mono_assembly_preload_hook_fn(MonoAssemblyName *aname, char **assemblies_path, int *search_path, void *user_data);
 
 static void CDECL mono_shutdown_callback_fn(MonoProfiler *prof);
 
@@ -249,6 +251,7 @@ static HRESULT load_mono(LPCWSTR mono_path)
         LOAD_OPT_MONO_FUNCTION(mono_set_crash_chaining, set_crash_chaining_dummy);
         LOAD_OPT_MONO_FUNCTION(mono_trace_set_print_handler, set_print_handler_dummy);
         LOAD_OPT_MONO_FUNCTION(mono_trace_set_printerr_handler, set_print_handler_dummy);
+        LOAD_OPT_MONO_FUNCTION(wine_mono_install_assembly_preload_hook, NULL);
 
 #undef LOAD_OPT_MONO_FUNCTION
 
@@ -279,7 +282,10 @@ static HRESULT load_mono(LPCWSTR mono_path)
 
         mono_config_parse(NULL);
 
-        mono_install_assembly_preload_hook(mono_assembly_preload_hook_fn, NULL);
+        if (wine_mono_install_assembly_preload_hook)
+            wine_mono_install_assembly_preload_hook(wine_mono_assembly_preload_hook_fn, NULL);
+        else
+            mono_install_assembly_preload_hook(mono_assembly_preload_hook_fn, NULL);
 
         aot_size = GetEnvironmentVariableA("WINE_MONO_AOT", aot_setting, sizeof(aot_setting));
 
@@ -1366,6 +1372,9 @@ HRESULT CLRMetaHostPolicy_CreateInstance(REFIID riid, void **ppobj)
  * WINE_MONO_OVERRIDES=*,Gac=n
  *  Never search the GAC for libraries.
  *
+ * WINE_MONO_OVERRIDES=*,PrivatePath=n
+ *  Never search the AppDomain search path for libraries.
+ *
  * WINE_MONO_OVERRIDES=Microsoft.Xna.Framework,Gac=n
  *  Never search the GAC for Microsoft.Xna.Framework
  *
@@ -1377,7 +1386,8 @@ HRESULT CLRMetaHostPolicy_CreateInstance(REFIID riid, void **ppobj)
 /* assembly search override flags */
 #define ASSEMBLY_SEARCH_GAC 1
 #define ASSEMBLY_SEARCH_UNDEFINED 2
-#define ASSEMBLY_SEARCH_DEFAULT ASSEMBLY_SEARCH_GAC
+#define ASSEMBLY_SEARCH_PRIVATEPATH 4
+#define ASSEMBLY_SEARCH_DEFAULT (ASSEMBLY_SEARCH_GAC|ASSEMBLY_SEARCH_PRIVATEPATH)
 
 typedef struct override_entry {
     char *name;
@@ -1426,6 +1436,14 @@ static void parse_override_entry(override_entry *entry, const char *string, int
                         entry->flags &= ~ASSEMBLY_SEARCH_GAC;
                 }
                 break;
+            case 11:
+                if (!_strnicmp(string, "privatepath", 11)) {
+                    if (IS_OPTION_TRUE(*value))
+                        entry->flags |= ASSEMBLY_SEARCH_PRIVATEPATH;
+                    else if (IS_OPTION_FALSE(*value))
+                        entry->flags &= ~ASSEMBLY_SEARCH_PRIVATEPATH;
+                }
+                break;
             default:
                 break;
             }
@@ -1688,6 +1706,12 @@ static MonoAssembly* mono_assembly_try_load(WCHAR *path)
 }
 
 static MonoAssembly* CDECL mono_assembly_preload_hook_fn(MonoAssemblyName *aname, char **assemblies_path, void *user_data)
+{
+    int dummy;
+    return wine_mono_assembly_preload_hook_fn(aname, assemblies_path, &dummy, user_data);
+}
+
+static MonoAssembly* CDECL wine_mono_assembly_preload_hook_fn(MonoAssemblyName *aname, char **assemblies_path, int *halt_search, void *user_data)
 {
     HRESULT hr;
     MonoAssembly *result=NULL;
@@ -1720,7 +1744,7 @@ static MonoAssembly* CDECL mono_assembly_preload_hook_fn(MonoAssemblyName *aname
     if (!stringname || !assemblyname) return NULL;
 
     search_flags = get_assembly_search_flags(aname);
-    if (private_path)
+    if (private_path && (search_flags & ASSEMBLY_SEARCH_PRIVATEPATH) != 0)
     {
         stringnameW_size = MultiByteToWideChar(CP_UTF8, 0, assemblyname, -1, NULL, 0);
         stringnameW = HeapAlloc(GetProcessHeap(), 0, stringnameW_size * sizeof(WCHAR));
@@ -1798,6 +1822,12 @@ static MonoAssembly* CDECL mono_assembly_preload_hook_fn(MonoAssemblyName *aname
     else
         TRACE("skipping Windows GAC search due to override setting\n");
 
+    if ((search_flags & ASSEMBLY_SEARCH_PRIVATEPATH) == 0)
+    {
+        TRACE("skipping AppDomain search path due to override setting\n");
+        *halt_search = 1;
+    }
+
 done:
     HeapFree(GetProcessHeap(), 0, cultureW);
     mono_free(stringname);
diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h
index 67b37482c5a..8f3441cd84e 100644
--- a/dlls/mscoree/mscoree_private.h
+++ b/dlls/mscoree/mscoree_private.h
@@ -143,6 +143,8 @@ typedef enum {
 
 typedef MonoAssembly* (CDECL *MonoAssemblyPreLoadFunc)(MonoAssemblyName *aname, char **assemblies_path, void *user_data);
 
+typedef MonoAssembly* (CDECL *WineMonoAssemblyPreLoadFunc)(MonoAssemblyName *aname, char **assemblies_path, int *halt_search, void *user_data);
+
 typedef void (CDECL *MonoProfileFunc)(MonoProfiler *prof);
 
 typedef void (CDECL *MonoPrintCallback) (const char *string, INT is_stdout);




More information about the wine-cvs mailing list