Hi,

It wasn't load_aot_module_from_cache, sorry.

Command line:
make[7]: Entering directory `/mono/mcs/class/System'
make all-local
make[8]: Entering directory `/mono/mcs/class/System'
** Warning: System.dll built without parts that depend on: System.Xml.dll
make[8]: Leaving directory `/mono/mcs/class/System'
make[7]: Leaving directory `/mono/mcs/class/System'
make[7]: Entering directory `/mono/mcs/class/System.XML'
make all-local
make[8]: Entering directory `/mono/mcs/class/System.XML'
MONO_PATH="../../class/lib/basic;$MONO_PATH" /mono/mono/runtime/mono-wrapper ../../class/lib/basic/mcs.exe /codepage:65001 /nologo /optimize -d:NET_1_1 -d:ONLY_1_1 -d:BOOTSTRAP_WITH_OLDLIB /debug+ /debug:full /noconfig -r:mscorlib.dll -r:System.dll -nowarn:0162,0618,0612,0642,1595 -target:library -out:System.Xml.dll `echo System.Xml.XPath/Parser.cs Mono.Xml.Xsl/PatternParser.cs Mono.Xml.Xsl/PatternTokenizer.cs | tr '/' '\\\\'` @../../build/deps/basic_System.Xml.dll.response

Call stack:
mono_image_basic_init (MonoReflectionAssemblyBuilder *assemblyb)
-> mono_assembly_invoke_load_hook ((MonoAssembly*)assembly);
-> load_aot_module (MonoAssembly *assembly, gpointer user_data)
-> assembly->aot_module = mono_dl_open (aot_name, MONO_DL_LAZY, &err);

The dynamic image has only file name in assembly->image->name that results in System.Xml.dll from MS.NET being loaded when MS.NET is in PATH.

Kornél

----- Original Message ----- From: "Zoltan Varga" <[EMAIL PROTECTED]>
To: "Kornél Pál" <[EMAIL PROTECTED]>
Cc: "Jonathan Chambers" <[EMAIL PROTECTED]>; <mono-devel-list@lists.ximian.com>
Sent: Saturday, May 03, 2008 4:00 PM
Subject: Re: [Mono-dev] [PATCH] Add mixed-mode assembly support on Windows (now build with cygwin as well)


 I have tracked down the issue. The problem is that
"load_aot_module_from_cache" calls that calls "mono_dl_open" that calls
"LoadLibrary" with just a file name without a full path. This will result in
MS.NET assemblies being loaded when MS.NET is in PATH. I don't know how
load_aot_module_from_cache is supposed to work but I think this is a bug in
load_aot_module_from_cache.


Hi,

load_aot_module_from_cache is only called if the (unsupported) MONO_AOT_CACHE
env var is set. Also, it calls mono_dl_open () using a full path.

Zoltan
Index: mono/mono/metadata/domain.c
===================================================================
--- mono/mono/metadata/domain.c (revision 102399)
+++ mono/mono/metadata/domain.c (working copy)
@@ -1161,12 +1161,9 @@
        if (domain)
                g_assert_not_reached ();

-       /* FIXME: This causes Win32 build to break. */
-#if 0
#if defined(PLATFORM_WIN32) && !defined(_WIN64)
-       mono_load_coree ();
+       mono_load_coree (exe_filename);
#endif
-#endif

        mono_perfcounters_init ();

@@ -1205,6 +1202,11 @@
                 */
                get_runtimes_from_exe (exe_filename, &exe_image, runtimes);
#ifdef PLATFORM_WIN32
+               if (!exe_image) {
+                       exe_image = mono_assembly_open_from_bundle 
(exe_filename, NULL, FALSE);
+                       if (!exe_image)
+                               exe_image = mono_image_open (exe_filename, 
NULL);
+               }
                mono_fixup_exe_image (exe_image);
#endif
        } else if (runtime_version != NULL) {
@@ -1610,8 +1612,7 @@
void
mono_cleanup (void)
{
-       if (exe_image)
-               mono_image_close (exe_image);
+       mono_close_exe_image ();

        mono_loader_cleanup ();
        mono_classes_cleanup ();
@@ -1625,6 +1626,13 @@
        DeleteCriticalSection (&appdomains_mutex);
}

+void
+mono_close_exe_image (void)
+{
+       if (exe_image)
+               mono_image_close (exe_image);
+}
+
/**
 * mono_get_root_domain:
 *
Index: mono/mono/metadata/image.c
===================================================================
--- mono/mono/metadata/image.c  (revision 102399)
+++ mono/mono/metadata/image.c  (working copy)
@@ -24,6 +24,7 @@
#include "metadata-internals.h"
#include "profiler-private.h"
#include "loader.h"
+#include "marshal.h"
#include "coree.h"
#include <mono/io-layer/io-layer.h>
#include <mono/utils/mono-logger.h>
@@ -1077,11 +1078,10 @@
#ifdef PLATFORM_WIN32
/* fname is not duplicated. */
MonoImage*
-mono_image_open_from_module_handle (HMODULE module_handle, const char* fname, 
MonoImageOpenStatus* status)
+mono_image_open_from_module_handle (HMODULE module_handle, char* fname, int 
ref_count, MonoImageOpenStatus* status)
{
        MonoImage* image;
        MonoCLIImageInfo* iinfo;
-       guint16* fname_utf16;

        image = g_new0 (MonoImage, 1);
        image->raw_data = (char*) module_handle;
@@ -1089,10 +1089,10 @@
        iinfo = g_new0 (MonoCLIImageInfo, 1);
        image->image_info = iinfo;
        image->name = fname;
-       image->ref_count = 1;
+       image->ref_count = ref_count;

        image = do_mono_image_load (image, status, TRUE);
-       image = register_image (image);
+       return register_image (image);
}
#endif

@@ -1110,42 +1110,66 @@
        if (!refonly && coree_module_handle) {
                HMODULE module_handle;
                guint16 *fname_utf16;
+               DWORD last_error;

                absfname = mono_path_resolve_symlinks (fname);
+               fname_utf16 = NULL;

                /* There is little overhead because the OS loader lock is held 
by LoadLibrary. */
                mono_images_lock ();
                image = g_hash_table_lookup (loaded_images_hash, absfname);
                if (image) {
+                       g_assert (image->is_module_handle);
+                       if (image->ref_count == 0) {
+                               MonoCLIImageInfo *iinfo = image->image_info;
+
+                               if (iinfo->cli_header.coff.coff_attributes & 
COFF_ATTRIBUTE_LIBRARY_IMAGE) {
+                                       /* Increment reference count on images 
loaded outside of the runtime. */
+                                       fname_utf16 = g_utf8_to_utf16 
(absfname, -1, NULL, NULL, NULL);
+                                       module_handle = LoadLibrary 
(fname_utf16);
+                                       g_assert (module_handle != NULL);
+                               }
+                       }
                        mono_image_addref (image);
                        mono_images_unlock ();
+                       if (fname_utf16)
+                               g_free (fname_utf16);
                        g_free (absfname);
                        return image;
                }

                fname_utf16 = g_utf8_to_utf16 (absfname, -1, NULL, NULL, NULL);
                module_handle = LoadLibrary (fname_utf16);
+               if (status && module_handle == NULL)
+                       last_error = GetLastError ();

                /* mono_image_open_from_module_handle is called by _CorDllMain. 
*/
                image = g_hash_table_lookup (loaded_images_hash, absfname);
+               if (image)
+                       mono_image_addref (image);
                mono_images_unlock ();

                g_free (fname_utf16);

-               if (image) {
-                       /* No mono_image_addref required. */;
+               if (module_handle == NULL) {
+                       g_assert (!image);
                        g_free (absfname);
-                       return image;
+                       if (status) {
+                               if (last_error == ERROR_BAD_EXE_FORMAT || 
last_error == STATUS_INVALID_IMAGE_FORMAT)
+                                       *status = MONO_IMAGE_IMAGE_INVALID;
+                               else
+                                       *status = MONO_IMAGE_ERROR_ERRNO;
+                       }
+                       return NULL;
                }

-               if (module_handle == NULL) {
+               if (image) {
+                       g_assert (image->is_module_handle);
                        g_free (absfname);
-                       if (status)
-                               *status = MONO_IMAGE_ERROR_ERRNO;
-                       return NULL;
+                       return image;
                }

-               return mono_image_open_from_module_handle (module_handle, 
absfname, status);
+               return mono_image_open_from_module_handle (module_handle, 
absfname, 1, status);
        }
#endif

@@ -1331,6 +1355,23 @@
        if (InterlockedDecrement (&image->ref_count) > 0)
                return;

+#ifdef PLATFORM_WIN32
+       if (image->is_module_handle) {
+               MonoCLIImageInfo *iinfo = image->image_info;
+
+               if (iinfo->cli_header.coff.coff_attributes & 
COFF_ATTRIBUTE_LIBRARY_IMAGE) {
+                       mono_images_lock ();
+                       if (image->ref_count == 0) {
+                               /* Image will be closed by _CorDllMain. */
+                               FreeLibrary ((HMODULE) image->raw_data);
+                               mono_images_unlock ();
+                               return;
+                       }
+                       mono_images_unlock ();
+               }
+       }
+#endif
+
        mono_profiler_module_event (image, MONO_PROFILE_START_UNLOAD);

        mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading image %s 
[%p].", image->name, image);
@@ -1364,13 +1405,17 @@
        if (image->assembly_name && (g_hash_table_lookup (loaded_images, 
image->assembly_name) == image))
                g_hash_table_remove (loaded_images, (char *) 
image->assembly_name);  

-       mono_images_unlock ();
+#ifdef PLATFORM_WIN32
+       if (image->is_module_handle) {
+               MonoCLIImageInfo *iinfo = image->image_info;

-#ifdef PLATFORM_WIN32
-       if (image->is_module_handle)
-               FreeLibrary ((HMODULE) image->raw_data);
+               if (!(iinfo->cli_header.coff.coff_attributes & 
COFF_ATTRIBUTE_LIBRARY_IMAGE))
+                       FreeLibrary ((HMODULE) image->raw_data);
+       }
#endif

+       mono_images_unlock ();
+
        if (image->raw_buffer_used) {
                if (image->raw_data != NULL)
                        mono_raw_buffer_free (image->raw_data);
Index: mono/mono/metadata/threads.c
===================================================================
--- mono/mono/metadata/threads.c        (revision 102399)
+++ mono/mono/metadata/threads.c        (working copy)
@@ -186,6 +186,7 @@
static GArray *delayed_free_table = NULL;

static gboolean shutting_down = FALSE;
+static gboolean threads_initialized = FALSE;

guint32
mono_thread_get_tls_key (void)
@@ -2258,6 +2259,8 @@
         * anything up.
         */
        GetCurrentProcess ();
+
+       threads_initialized = TRUE;
}

void mono_thread_cleanup (void)
@@ -2281,6 +2284,7 @@
         * critical sections can be locked when mono_thread_cleanup is
         * called.
         */
+       threads_initialized = FALSE;
        DeleteCriticalSection (&threads_mutex);
        DeleteCriticalSection (&interlocked_mutex);
        DeleteCriticalSection (&contexts_mutex);
@@ -2663,6 +2667,9 @@
{
        gsize self = GetCurrentThreadId ();

+       if (!threads_initialized)
+               return;
+
        mono_threads_lock ();
        THREAD_DEBUG (g_message ("%s: There are %d threads to abort", __func__,
                                 mono_g_hash_table_size (threads));
Index: mono/mono/metadata/coree.c
===================================================================
--- mono/mono/metadata/coree.c  (revision 102399)
+++ mono/mono/metadata/coree.c  (working copy)
@@ -11,12 +11,19 @@

#ifdef PLATFORM_WIN32

+/* Required for ACTCTX. */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0501
+
#include <string.h>
#include <glib.h>
#include <mono/io-layer/io-layer.h>
+#include <mono/utils/mono-path.h>
+#include "cil-coff.h"
#include "metadata-internals.h"
#include "image.h"
#include "assembly.h"
+#include "domain-internals.h"
#include "appdomain.h"
#include "object.h"
#include "loader.h"
@@ -24,18 +31,11 @@
#include "environment.h"
#include "coree.h"

-#define STATUS_SUCCESS 0x00000000L
-#define STATUS_INVALID_IMAGE_FORMAT 0xC000007BL
-
-typedef struct _EXPORT_FIXUP
-{
-       LPCSTR Name;
-       DWORD_PTR ProcAddress;
-} EXPORT_FIXUP;
-
HMODULE mono_module_handle = NULL;
HMODULE coree_module_handle = NULL;

+static gboolean init_from_coree = FALSE;
+
gchar*
mono_get_module_file_name (HMODULE module_handle)
{
@@ -84,8 +84,9 @@
                file_name = mono_get_module_file_name (hInst);

                if (mono_get_root_domain ()) {
-                       image = mono_image_open_from_module_handle (hInst, 
mono_path_resolve_symlinks (file_name), NULL);
+                       image = mono_image_open_from_module_handle (hInst, 
mono_path_resolve_symlinks (file_name), 0, NULL);
                } else {
+                       init_from_coree = TRUE;
                        mono_runtime_load (file_name, NULL);
                        error = (gchar*) mono_check_corlib_version ();
                        if (error) {
@@ -96,6 +97,10 @@
                        }

                        image = mono_image_open (file_name, NULL);
+                       mono_close_exe_image ();
+                       if (image)
+                               /* Decrement reference count to zero. (Image 
will not be closed.) */
+                               mono_image_close (image);
                }

                if (!image) {
@@ -108,18 +113,29 @@
                 * loader trampolines should be used and assembly loading should
                 * probably be delayed until the first call to an exported 
function.
                 */
-               if (image->tables [MONO_TABLE_ASSEMBLY].rows)
+               if (image->tables [MONO_TABLE_ASSEMBLY].rows && ((MonoCLIImageInfo*) 
image->image_info)->cli_cli_header.ch_vtable_fixups.rva)
                        assembly = mono_assembly_open (file_name, NULL);

                g_free (file_name);
                break;
+       case DLL_PROCESS_DETACH:
+               if (lpReserved != NULL)
+                       /* The process is terminating. */
+                       return TRUE;
+               file_name = mono_get_module_file_name (hInst);
+               image = mono_image_loaded (file_name);
+               if (image)
+                       mono_image_close (image);
+
+               g_free (file_name);
+               break;
        }

        return TRUE;
}

/* Called by ntdll.dll reagardless of entry point after _CorValidateImage. */
-__int32 STDMETHODCALLTYPE _CorExeMain()
+__int32 STDMETHODCALLTYPE _CorExeMain(void)
{
        MonoDomain* domain;
        MonoAssembly* assembly;
@@ -134,6 +150,7 @@
        int i;

        file_name = mono_get_module_file_name (GetModuleHandle (NULL));
+       init_from_coree = TRUE;
        domain = mono_runtime_load (file_name, NULL);

        error = (gchar*) mono_check_corlib_version ();
@@ -146,6 +163,7 @@
        }

        assembly = mono_assembly_open (file_name, NULL);
+       mono_close_exe_image ();
        if (!assembly) {
                g_free (file_name);
                MessageBox (NULL, L"Cannot open assembly.", NULL, MB_ICONERROR);
@@ -189,7 +207,7 @@
/* Called by msvcrt.dll when shutting down. */
void STDMETHODCALLTYPE CorExitProcess(int exitCode)
{
-       if (!mono_runtime_is_shutting_down ()) {
+       if (mono_get_root_domain () && !mono_runtime_is_shutting_down ()) {
                mono_runtime_set_shutting_down ();
                mono_thread_suspend_all_other_threads ();
                mono_runtime_quit ();
@@ -203,7 +221,7 @@
        IMAGE_DOS_HEADER* DosHeader;
        IMAGE_NT_HEADERS* NtHeaders;
        DWORD* Address;
-       DWORD dwOldProtect;
+       DWORD OldProtect;

        DosHeader = (IMAGE_DOS_HEADER*)*ImageBase;
        if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
@@ -217,13 +235,13 @@
                return STATUS_INVALID_IMAGE_FORMAT;

        Address = &NtHeaders->OptionalHeader.AddressOfEntryPoint;
-       if (!VirtualProtect(Address, sizeof(DWORD), PAGE_READWRITE, 
&dwOldProtect))
+       if (!VirtualProtect(Address, sizeof(DWORD), PAGE_READWRITE, 
&OldProtect))
                return E_UNEXPECTED;
        if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
                *Address = (DWORD)((DWORD_PTR)&_CorDllMain - 
(DWORD_PTR)DosHeader);
        else
                *Address = (DWORD)((DWORD_PTR)&_CorExeMain - 
(DWORD_PTR)DosHeader);
-       if (!VirtualProtect(Address, sizeof(DWORD), dwOldProtect, 
&dwOldProtect))
+       if (!VirtualProtect(Address, sizeof(DWORD), OldProtect, &OldProtect))
                return E_UNEXPECTED;

        return STATUS_SUCCESS;
@@ -235,11 +253,29 @@
        /* Nothing to do. */
}

+STDAPI CorBindToRuntimeEx(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, DWORD 
startupFlags, REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv)
+{
+       return E_NOTIMPL;
+}
+
+STDAPI CorBindToRuntime(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, REFCLSID 
rclsid, REFIID riid, LPVOID FAR *ppv)
+{
+       return CorBindToRuntimeEx (pwszVersion, pwszBuildFlavor, 0, rclsid, 
riid, ppv);
+}
+
/* Fixup exported functions of mscoree.dll to our implementations. */
STDAPI MonoFixupCorEE(HMODULE ModuleHandle)
{
+       typedef struct _EXPORT_FIXUP
+       {
+               LPCSTR Name;
+               DWORD_PTR ProcAddress;
+       } EXPORT_FIXUP;
+
        /* Has to be binary ordered. */
        const EXPORT_FIXUP ExportFixups[] = {
+               {"CorBindToRuntime", (DWORD_PTR)&CorBindToRuntime},
+               {"CorBindToRuntimeEx", (DWORD_PTR)&CorBindToRuntimeEx},
                {"CorExitProcess", (DWORD_PTR)&CorExitProcess},
                {"_CorDllMain", (DWORD_PTR)&_CorDllMain},
                {"_CorExeMain", (DWORD_PTR)&_CorExeMain},
@@ -257,7 +293,7 @@
        WORD* NameOrdinals;
        EXPORT_FIXUP* ExportFixup;
        DWORD* Address;
-       DWORD dwOldProtect;
+       DWORD OldProtect;
        DWORD_PTR ProcAddress;
        DWORD i;

@@ -295,10 +331,10 @@
                        Address = &Functions[NameOrdinals[i]];
                        ProcAddress = (DWORD_PTR)DosHeader + *Address;
                        if (ProcAddress != ExportFixup->ProcAddress) {
-                               if (!VirtualProtect(Address, sizeof(DWORD), 
PAGE_READWRITE, &dwOldProtect))
+                               if (!VirtualProtect(Address, sizeof(DWORD), 
PAGE_READWRITE, &OldProtect))
                                        return E_UNEXPECTED;
                                *Address = (DWORD)(ExportFixup->ProcAddress - 
(DWORD_PTR)DosHeader);
-                               if (!VirtualProtect(Address, sizeof(DWORD), 
dwOldProtect, &dwOldProtect))
+                               if (!VirtualProtect(Address, sizeof(DWORD), 
OldProtect, &OldProtect))
                                        return E_UNEXPECTED;
                        }
                        ExportFixup++;
@@ -315,7 +351,7 @@
        IMAGE_DOS_HEADER* DosHeader;
        IMAGE_NT_HEADERS* NtHeaders;
        DWORD_PTR* Address;
-       DWORD dwOldProtect;
+       DWORD OldProtect;
        DWORD_PTR BaseDiff;

        DosHeader = (IMAGE_DOS_HEADER*)ModuleHandle;
@@ -332,6 +368,20 @@
        if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
                return S_OK;

+       if (NtHeaders->OptionalHeader.NumberOfRvaAndSizes > 
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR)
+       {
+               IMAGE_DATA_DIRECTORY* CliHeaderDir;
+               MonoCLIHeader* CliHeader;
+
+               CliHeaderDir = 
&NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR];
+               if (CliHeaderDir->VirtualAddress && CliHeaderDir->Size)
+               {
+                       CliHeader = (MonoCLIHeader*)((DWORD_PTR)DosHeader + 
CliHeaderDir->VirtualAddress);
+                       if (CliHeader->ch_flags & CLI_FLAGS_ILONLY)
+                               return S_OK;
+               }
+       }
+
        BaseDiff = (DWORD_PTR)DosHeader - NtHeaders->OptionalHeader.ImageBase;
        if (BaseDiff != 0)
        {
@@ -339,10 +389,10 @@
                        return E_FAIL;

                Address = &NtHeaders->OptionalHeader.ImageBase;
-               if (!VirtualProtect(Address, sizeof(DWORD_PTR), PAGE_READWRITE, 
&dwOldProtect))
+               if (!VirtualProtect(Address, sizeof(DWORD_PTR), PAGE_READWRITE, 
&OldProtect))
                        return E_UNEXPECTED;
                *Address = (DWORD_PTR)DosHeader;
-               if (!VirtualProtect(Address, sizeof(DWORD_PTR), dwOldProtect, 
&dwOldProtect))
+               if (!VirtualProtect(Address, sizeof(DWORD_PTR), OldProtect, 
&OldProtect))
                        return E_UNEXPECTED;

                if (NtHeaders->OptionalHeader.NumberOfRvaAndSizes > 
IMAGE_DIRECTORY_ENTRY_BASERELOC)
@@ -388,10 +438,10 @@
#else
                                                        case 
IMAGE_REL_BASED_HIGHLOW:
#endif
-                                                               if 
(!VirtualProtect(RelocFixup, sizeof(DWORD_PTR), PAGE_EXECUTE_READWRITE, 
&dwOldProtect))
+                                                               if 
(!VirtualProtect(RelocFixup, sizeof(DWORD_PTR), PAGE_EXECUTE_READWRITE, 
&OldProtect))
                                                                        return 
E_UNEXPECTED;
                                                                *RelocFixup += 
BaseDiff;
-                                                               if 
(!VirtualProtect(RelocFixup, sizeof(DWORD_PTR), dwOldProtect, &dwOldProtect))
+                                                               if 
(!VirtualProtect(RelocFixup, sizeof(DWORD_PTR), OldProtect, &OldProtect))
                                                                        return 
E_UNEXPECTED;
                                                                break;

@@ -438,10 +488,10 @@
                                        if (ProcAddress == 0)
                                                return E_FAIL;
                                        Address = 
(DWORD_PTR*)((DWORD_PTR)ImportThunkData - ImportDesc->OriginalFirstThunk + 
ImportDesc->FirstThunk);
-                                       if (!VirtualProtect(Address, 
sizeof(DWORD_PTR), PAGE_READWRITE, &dwOldProtect))
+                                       if (!VirtualProtect(Address, 
sizeof(DWORD_PTR), PAGE_READWRITE, &OldProtect))
                                                return E_UNEXPECTED;
                                        *Address = ProcAddress;
-                                       if (!VirtualProtect(Address, 
sizeof(DWORD_PTR), dwOldProtect, &dwOldProtect))
+                                       if (!VirtualProtect(Address, 
sizeof(DWORD_PTR), OldProtect, &OldProtect))
                                                return E_UNEXPECTED;
                                        ImportThunkData++;
                                }
@@ -454,8 +504,69 @@
        return S_OK;
}

+static void
+mono_set_act_ctx (const char* file_name)
+{
+       typedef HANDLE (WINAPI* CREATEACTCTXW_PROC) (PCACTCTXW pActCtx);
+       typedef BOOL (WINAPI* ACTIVATEACTCTX_PROC) (HANDLE hActCtx, ULONG_PTR* 
lpCookie);
+
+       HMODULE kernel32_handle;
+       CREATEACTCTXW_PROC CreateActCtx_proc;
+       ACTIVATEACTCTX_PROC ActivateActCtx_proc;
+       gchar* full_path;
+       gunichar2* full_path_utf16;
+       gchar* dir_name;
+       gunichar2* dir_name_utf16;
+       gchar* base_name;
+       gunichar2* base_name_utf16;
+       ACTCTX act_ctx;
+       HANDLE handle;
+       ULONG_PTR cookie;
+
+       kernel32_handle = GetModuleHandle (L"kernel32.dll");
+       if (!kernel32_handle)
+               return;
+       CreateActCtx_proc = (CREATEACTCTXW_PROC) GetProcAddress (kernel32_handle, 
"CreateActCtxW");
+       if (!CreateActCtx_proc)
+               return;
+       ActivateActCtx_proc = (ACTIVATEACTCTX_PROC) GetProcAddress (kernel32_handle, 
"ActivateActCtx");
+       if (!ActivateActCtx_proc)
+               return;
+
+       full_path = mono_path_canonicalize (file_name);
+       full_path_utf16 = g_utf8_to_utf16 (full_path, -1, NULL, NULL, NULL);
+       dir_name = g_path_get_dirname (full_path);
+       dir_name_utf16 = g_utf8_to_utf16 (dir_name, -1, NULL, NULL, NULL);
+       base_name = g_path_get_basename (full_path);
+       base_name_utf16 = g_utf8_to_utf16 (base_name, -1, NULL, NULL, NULL);
+       g_free (base_name);
+       g_free (dir_name);
+       g_free (full_path);
+
+       memset (&act_ctx, 0, sizeof (ACTCTX));
+       act_ctx.cbSize = sizeof (ACTCTX);
+       act_ctx.dwFlags = ACTCTX_FLAG_SET_PROCESS_DEFAULT | 
ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID | ACTCTX_FLAG_RESOURCE_NAME_VALID | 
ACTCTX_FLAG_APPLICATION_NAME_VALID;
+       act_ctx.lpSource = full_path_utf16;
+       act_ctx.lpAssemblyDirectory = dir_name_utf16;
+       act_ctx.lpResourceName = MAKEINTRESOURCE 
(CREATEPROCESS_MANIFEST_RESOURCE_ID);
+       act_ctx.lpApplicationName = base_name_utf16;
+
+       handle = CreateActCtx_proc (&act_ctx);
+       if (handle == INVALID_HANDLE_VALUE && GetLastError () == 
ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET) {
+               act_ctx.dwFlags &= ~ACTCTX_FLAG_SET_PROCESS_DEFAULT;
+               handle = CreateActCtx_proc (&act_ctx);
+       }
+
+       g_free (base_name_utf16);
+       g_free (dir_name_utf16);
+       g_free (full_path_utf16);
+
+       if (handle != INVALID_HANDLE_VALUE)
+               ActivateActCtx_proc (handle, &cookie);
+}
+
void
-mono_load_coree ()
+mono_load_coree (const char* exe_file_name)
{
        gunichar2* file_name;
        UINT required_size;
@@ -464,6 +575,9 @@
        if (coree_module_handle)
                return;

+       if (!init_from_coree && exe_file_name)
+               mono_set_act_ctx (exe_file_name);
+
        /* ntdll.dll loads mscoree.dll from the system32 directory. */
        required_size = GetSystemDirectory (NULL, 0);
        file_name = g_new (gunichar2, required_size + 12);
@@ -485,7 +599,7 @@
void
mono_fixup_exe_image (MonoImage* image)
{
-       if (image && image->is_module_handle && (HMODULE) image->raw_data != 
GetModuleHandle (NULL))
+       if (!init_from_coree && image && image->is_module_handle)
                MonoFixupExe ((HMODULE) image->raw_data);
}

Index: mono/mono/metadata/coree.h
===================================================================
--- mono/mono/metadata/coree.h  (revision 102399)
+++ mono/mono/metadata/coree.h  (working copy)
@@ -17,6 +17,9 @@
#include <mono/io-layer/io-layer.h>
#include "image.h"

+#define STATUS_SUCCESS 0x00000000L
+#define STATUS_INVALID_IMAGE_FORMAT 0xC000007BL
+
STDAPI MonoFixupCorEE(HMODULE ModuleHandle);
STDAPI MonoFixupExe(HMODULE ModuleHandle);

@@ -24,11 +27,11 @@
extern HMODULE coree_module_handle;

gchar* mono_get_module_file_name (HMODULE module_handle);
-void mono_load_coree ();
+void mono_load_coree (const char* file_name);
void mono_fixup_exe_image (MonoImage* image);

/* Declared in image.c. */
-MonoImage* mono_image_open_from_module_handle (HMODULE module_handle, const 
char* fname, MonoImageOpenStatus* status);
+MonoImage* mono_image_open_from_module_handle (HMODULE module_handle, char* 
fname, int ref_count, MonoImageOpenStatus* status);

#endif /* PLATFORM_WIN32 */

Index: mono/mono/metadata/domain-internals.h
===================================================================
--- mono/mono/metadata/domain-internals.h       (revision 102399)
+++ mono/mono/metadata/domain-internals.h       (working copy)
@@ -233,6 +233,9 @@
mono_cleanup (void) MONO_INTERNAL;

void
+mono_close_exe_image (void) MONO_INTERNAL;
+
+void
mono_jit_info_table_add    (MonoDomain *domain, MonoJitInfo *ji) MONO_INTERNAL;

void
Index: mono/mono/utils/mono-path.c
===================================================================
--- mono/mono/utils/mono-path.c (revision 102399)
+++ mono/mono/utils/mono-path.c (working copy)
@@ -39,6 +39,9 @@
                g_free (tmpdir);
        }

+#ifdef PLATFORM_WIN32
+       g_strdelimit (abspath, "/", '\\');
+#endif
        abspath = g_strreverse (abspath);

        backc = 0;
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to