Module: wine Branch: master Commit: 6a0d678abb0bcf1496a105b3511de113813a73eb URL: https://source.winehq.org/git/wine.git/?a=commit;h=6a0d678abb0bcf1496a105b35...
Author: Esme Povirk esme@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);