52 0, 0, { (
DWORD_PTR)(__FILE__
": runtime_list_cs") }
56#define NUM_ABI_VERSIONS 2
71 static const WCHAR pathW[] = {
'P',
'A',
'T',
'H',0};
76 path_env[
len++] =
';';
90 WINE_MESSAGE((msg)); \
91 ShellMessageBoxA(NULL, NULL, (msg), "Wine Mono", MB_OK | MB_ICONSTOP); \
100 if (
This->major == 1)
101 MESSAGE(
"wine: Install Mono 2.6 for Windows to run .NET 1.1 applications.\n");
102 else if (
This->major == 2)
103 MESSAGE(
"wine: Install Mono for Windows to run .NET 2.0 applications.\n");
104 else if (
This->major == 4)
105 MESSAGE(
"wine: Install Mono 2.8 or greater for Windows to run .NET 4.0 applications.\n");
110 static const WCHAR bin[] = {
'\\',
'b',
'i',
'n',0};
111 static const WCHAR lib[] = {
'\\',
'l',
'i',
'b',0};
112 static const WCHAR etc[] = {
'\\',
'e',
't',
'c',0};
113 static const WCHAR glibdll[] = {
'l',
'i',
'b',
'g',
'l',
'i',
'b',
'-',
'2',
'.',
'0',
'-',
'0',
'.',
'd',
'l',
'l',0};
118 char trace_setting[256];
128 if ((*result)->is_shutdown)
130 ERR(
"Cannot load Mono after it has been shut down.\n");
135 if (!(*result)->mono_handle)
153 if (!(*result)->mono_handle)
goto fail;
155#define LOAD_MONO_FUNCTION(x) do { \
156 (*result)->x = (void*)GetProcAddress((*result)->mono_handle, #x); \
157 if (!(*result)->x) { \
190 if (
This->mono_abi_version == 1)
193 if (!(*result)->glib_handle)
goto fail;
195 (*result)->mono_free = (
void*)
GetProcAddress((*result)->glib_handle,
"g_free");
196 if (!(*result)->mono_free)
goto fail;
203#undef LOAD_MONO_FUNCTION
205#define LOAD_OPT_VOID_MONO_FUNCTION(x) do { \
206 (*result)->x = (void*)GetProcAddress((*result)->mono_handle, #x); \
207 if (!(*result)->x) { \
208 (*result)->x = do_nothing; \
217#undef LOAD_OPT_VOID_MONO_FUNCTION
221 (*result)->mono_set_dirs(mono_lib_path_a, mono_etc_path_a);
223 (*result)->mono_config_parse(
NULL);
231 (*result)->mono_jit_set_trace_options(trace_setting);
238 ERR(
"Could not load Mono into this process\n");
241 (*result)->mono_handle =
NULL;
242 (*result)->glib_handle =
NULL;
258 if (
This->loaded_runtime)
289 mono->mono_threads_set_shutting_down();
290 mono->mono_runtime_set_shutting_down();
291 mono->mono_thread_pool_cleanup();
292 mono->mono_thread_suspend_all_other_threads();
293 mono->mono_runtime_quit();
311 ERR(
"Process exited with a Mono runtime loaded.\n");
339 ICLRRuntimeInfo_AddRef( iface );
363 TRACE(
"%p %p %p\n", iface, pwzBuffer, pcchBuffer);
384 const WCHAR dotnet_key[] = {
'S',
'O',
'F',
'T',
'W',
'A',
'R',
'E',
'\\',
'M',
'i',
'c',
'r',
'o',
's',
'o',
'f',
't',
'\\',
'.',
'N',
'E',
'T',
'F',
'r',
'a',
'm',
'e',
'w',
'o',
'r',
'k',
'\\',0};
385 const WCHAR install_root[] = {
'I',
'n',
's',
't',
'a',
'l',
'l',
'R',
'o',
'o',
't',0};
407 static const WCHAR slash[] = {
'\\',0};
414 TRACE(
"%p %p %p\n", iface, pwzBuffer, pcchBuffer);
418 ERR(
"error reading registry key for installroot\n");
424 ICLRRuntimeInfo_GetVersionString(iface,
version, &version_size);
446 FIXME(
"%p %p %p\n", iface, hndProcess, pbLoaded);
454 FIXME(
"%p %u %p %p %x\n", iface, iResourceID, pwzBuffer, pcchBuffer, iLocaleid);
503 FIXME(
"%p %p\n", iface, pbLoadable);
511 FIXME(
"%p %x %s\n", iface, dwStartupFlags,
debugstr_w(pwzHostConfigFile));
517 DWORD *pdwStartupFlags,
LPWSTR pwzHostConfigFile,
DWORD *pcchHostConfigFile)
519 FIXME(
"%p %p %p %p\n", iface, pdwStartupFlags, pwzHostConfigFile, pcchHostConfigFile);
526 FIXME(
"%p\n", iface);
534 FIXME(
"%p %p %p\n", iface, pbStarted, pdwStartupFlags);
567static const WCHAR libmono2_arch_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'l',
'i',
'b',
'm',
'o',
'n',
'o',
'-',
'2',
'.',
'0',
'-',
'x',
'8',
'6',
'.',
'd',
'l',
'l',0};
568#elif defined(__x86_64__)
569static const WCHAR libmono2_arch_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'l',
'i',
'b',
'm',
'o',
'n',
'o',
'-',
'2',
'.',
'0',
'-',
'x',
'8',
'6',
'_',
'6',
'4',
'.',
'd',
'l',
'l',0};
571static const WCHAR libmono2_arch_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'l',
'i',
'b',
'm',
'o',
'n',
'o',
'-',
'2',
'.',
'0',
'.',
'd',
'l',
'l',0};
576 static const WCHAR mono_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'm',
'o',
'n',
'o',
'.',
'd',
'l',
'l',0};
577 static const WCHAR libmono_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'l',
'i',
'b',
'm',
'o',
'n',
'o',
'.',
'd',
'l',
'l',0};
578 static const WCHAR mono2_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'm',
'o',
'n',
'o',
'-',
'2',
'.',
'0',
'.',
'd',
'l',
'l',0};
579 static const WCHAR libmono2_dll[] = {
'\\',
'b',
'i',
'n',
'\\',
'l',
'i',
'b',
'm',
'o',
'n',
'o',
'-',
'2',
'.',
'0',
'.',
'd',
'l',
'l',0};
582 if (abi_version == 1)
591 strcatW(dll_path, libmono_dll);
595 else if (abi_version == 2)
611 strcatW(dll_path, libmono2_dll);
621 static const WCHAR mono_key[] = {
'S',
'o',
'f',
't',
'w',
'a',
'r',
'e',
'\\',
'N',
'o',
'v',
'e',
'l',
'l',
'\\',
'M',
'o',
'n',
'o',0};
622 static const WCHAR defaul_clr[] = {
'D',
'e',
'f',
'a',
'u',
'l',
't',
'C',
'L',
'R',0};
623 static const WCHAR install_root[] = {
'S',
'd',
'k',
'I',
'n',
's',
't',
'a',
'l',
'l',
'R',
'o',
'o',
't',0};
624 static const WCHAR slash[] = {
'\\',0};
662 static const WCHAR mono_one_dot_zero[] = {
'\\',
'm',
'o',
'n',
'o',
'-',
'1',
'.',
'0', 0};
663 static const WCHAR mono_two_dot_zero[] = {
'\\',
'm',
'o',
'n',
'o',
'-',
'2',
'.',
'0', 0};
669 if (abi_version == 1)
671 else if (abi_version == 2)
681 static const WCHAR subdir_mono[] = {
'\\',
'm',
'o',
'n',
'o',0};
682 static const WCHAR sibling_mono[] = {
'\\',
'.',
'.',
'\\',
'm',
'o',
'n',
'o',0};
684 const char *unix_data_dir;
691 strcatW(base_path, subdir_mono);
716 strcpyW(base_path, dos_data_dir);
734 static const WCHAR libmono[] = {
'\\',
'l',
'i',
'b',
'\\',
'm',
'o',
'n',
'o',
'\\',0};
735 static const WCHAR mscorlib[] = {
'\\',
'm',
's',
'c',
'o',
'r',
'l',
'i',
'b',
'.',
'd',
'l',
'l',0};
761 runtimes[
i].mono_abi_version = abi_version;
766 any_runtimes_found =
TRUE;
772 if (!any_runtimes_found)
816 IEnumUnknown_AddRef( iface );
826 TRACE(
"(%p) refcount=%u\n", iface,
ref);
836 TRACE(
"(%p) refcount=%u\n", iface,
ref);
854 TRACE(
"(%p,%u,%p,%p)\n", iface, celt, rgelt, pceltFetched);
856 while (num_fetched < celt)
866 IUnknown_AddRef(
item);
867 rgelt[num_fetched] =
item;
874 *pceltFetched = num_fetched;
885 TRACE(
"(%p,%u)\n", iface, celt);
887 while (num_fetched < celt)
908 TRACE(
"(%p)\n", iface);
920 TRACE(
"(%p)\n", iface);
969 ICLRMetaHost_AddRef( iface );
1015 *build = *build * 10 + (*
version++ -
'0');
1048 return ICLRRuntimeInfo_QueryInterface(&
runtimes[
i].ICLRRuntimeInfo_iface, iid,
1102 TRACE(
"%p\n", ppEnumerator);
1122 FIXME(
"%p %p\n", hndProcess, ppEnumerator);
1130 FIXME(
"%p\n", pCallbackFunction);
1145 FIXME(
"%i: stub\n", iExitCode);
1178 char *stringname=
NULL;
1180 int stringnameW_size;
1186 static WCHAR fusiondll[] = {
'f',
'u',
's',
'i',
'o',
'n',0};
1194 if (!stringname)
return NULL;
1198 if (!pCreateAssemblyCache)
1204 pCreateAssemblyCache = (
void*)
GetProcAddress(hfusion,
"CreateAssemblyCache");
1205 if (!pCreateAssemblyCache)
1211 hr = pCreateAssemblyCache(&asmcache, 0);
1225 info.cbAssemblyInfo =
sizeof(
info);
1226 info.pszCurrentAssemblyPathBuf =
path;
1230 hr = IAssemblyCache_QueryAssemblyInfo(asmcache, 0, stringnameW, &
info);
1235 IAssemblyCache_Release(asmcache);
1255 mono->mono_free(stringname);
1263 static const WCHAR dotconfig[] = {
'.',
'c',
'o',
'n',
'f',
'i',
'g',0};
1264 static const DWORD supported_startup_flags = 0;
1273 if (startup_flags & ~supported_startup_flags)
1274 FIXME(
"unsupported startup flags %x\n", startup_flags & ~supported_startup_flags);
1276 if (runtimeinfo_flags & ~supported_runtime_flags)
1277 FIXME(
"unsupported runtimeinfo flags %x\n", runtimeinfo_flags & ~supported_runtime_flags);
1279 if (exefile && !config_file)
1281 strcpyW(local_config_file, exefile);
1282 strcatW(local_config_file, dotconfig);
1284 config_file = local_config_file;
1307 WARN(
"failed to parse config file %s, hr=%x\n",
debugstr_w(config_file),
hr);
1358 return ICLRRuntimeInfo_QueryInterface(&
runtimes[
i].ICLRRuntimeInfo_iface,
1359 &IID_ICLRRuntimeInfo, (
void **)
result);
#define InterlockedIncrement
#define InterlockedDecrement
#define RegCloseKey(hKey)
#define CLR_E_SHIM_RUNTIME
HRESULT RuntimeHost_GetInterface(RuntimeHost *This, REFCLSID clsid, REFIID riid, void **ppv)
HRESULT RuntimeHost_Destroy(RuntimeHost *This)
HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version, loaded_mono *loaded_mono, RuntimeHost **result)
#define ERROR_INSUFFICIENT_BUFFER
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
#define GetEnvironmentVariableW(x, y, z)
#define GetProcAddress(x, y)
#define HeapFree(x, y, z)
#define wine_get_dos_file_name(__x)
#define WideCharToMultiByte
#define GetEnvironmentVariableA(x, y, z)
#define MultiByteToWideChar
static const WCHAR version[]
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableW(IN LPCWSTR lpName, IN LPCWSTR lpValue)
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
VOID WINAPI ExitProcess(IN UINT uExitCode)
HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result)
void free_parsed_config_file(parsed_config_file *file)
HRESULT assembly_release(ASSEMBLY *assembly)
HRESULT assembly_get_runtime_version(ASSEMBLY *assembly, LPSTR *version)
HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
const char * wine_get_build_dir(void)
const char * wine_get_data_dir(void)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
static struct _PeImage bin
@ RUNTIME_INFO_UPGRADE_VERSION
char * WtoA(LPCWSTR wstr)
HRESULT WINAPI LoadLibraryShim(LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE *phModDll)
struct _MonoProfiler MonoProfiler
struct _MonoAssemblyName MonoAssemblyName
struct _MonoAssembly MonoAssembly
const GUID IID_IEnumUnknown
#define IsEqualGUID(rguid1, rguid2)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
int ShellMessageBoxA(HINSTANCE hInstance, HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType,...)
wchar_t const *const size_t const buffer_size
WCHAR mscorlib_path[MAX_PATH]
struct RuntimeHost * loaded_runtime
WCHAR mono_path[MAX_PATH]
ICLRRuntimeInfo ICLRRuntimeInfo_iface
IEnumUnknown IEnumUnknown_iface
LIST_ENTRY ProcessLocksList
char *CDECL * mono_stringify_assembly_name(MonoAssemblyName *aname)
MonoAssembly *CDECL * mono_assembly_open(const char *filename, MonoImageOpenStatus *status)
struct list supported_runtimes
void build_tree(deflate_state *s, tree_desc *desc)
#define CONTAINING_RECORD(address, type, field)
#define INVALID_FILE_ATTRIBUTES
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define HKEY_LOCAL_MACHINE