HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR pExe, LPCWSTR pwszVersion, LPCWSTR pConfigurationFile, DWORD startupFlags, DWORD runtimeInfoFlags, LPWSTR pDirectory, DWORD dwDirectory, DWORD *dwDirectoryLength, LPWSTR pVersion, DWORD cchBuffer, DWORD *dwlength) { HRESULT ret; ICLRRuntimeInfo *info; DWORD length_dummy; TRACE("(%s, %s, %s, 0x%08x, 0x%08x, %p, 0x%08x, %p, %p, 0x%08x, %p)\n", debugstr_w(pExe), debugstr_w(pwszVersion), debugstr_w(pConfigurationFile), startupFlags, runtimeInfoFlags, pDirectory, dwDirectory, dwDirectoryLength, pVersion, cchBuffer, dwlength); if (!dwDirectoryLength) dwDirectoryLength = &length_dummy; if (!dwlength) dwlength = &length_dummy; ret = get_runtime_info(pExe, pwszVersion, pConfigurationFile, startupFlags, runtimeInfoFlags, TRUE, &info); if (SUCCEEDED(ret)) { *dwlength = cchBuffer; ret = ICLRRuntimeInfo_GetVersionString(info, pVersion, dwlength); if (SUCCEEDED(ret)) { *dwDirectoryLength = dwDirectory; ret = ICLRRuntimeInfo_GetRuntimeDirectory(info, pDirectory, dwDirectoryLength); } ICLRRuntimeInfo_Release(info); } return ret; }
HRESULT WINAPI GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength) { ICLRRuntimeInfo *info; HRESULT ret; TRACE("(%p, %d, %p)!\n", pbuffer, cchBuffer, dwLength); if (!dwLength || !pbuffer) return E_POINTER; ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); if (SUCCEEDED(ret)) { *dwLength = cchBuffer; ret = ICLRRuntimeInfo_GetRuntimeDirectory(info, pbuffer, dwLength); ICLRRuntimeInfo_Release(info); } return ret; }
static HRESULT RuntimeHost_GetDefaultDomain(RuntimeHost *This, const WCHAR *config_path, MonoDomain **result) { WCHAR config_dir[MAX_PATH]; WCHAR base_dir[MAX_PATH]; char *base_dirA, *config_pathA, *slash; HRESULT res=S_OK; EnterCriticalSection(&This->lock); if (This->default_domain) goto end; res = RuntimeHost_AddDefaultDomain(This, &This->default_domain); if (!config_path) { DWORD len = ARRAY_SIZE(config_dir); static const WCHAR machine_configW[] = {'\\','C','O','N','F','I','G','\\','m','a','c','h','i','n','e','.','c','o','n','f','i','g',0}; res = ICLRRuntimeInfo_GetRuntimeDirectory(&This->version->ICLRRuntimeInfo_iface, config_dir, &len); if (FAILED(res)) goto end; lstrcatW(config_dir, machine_configW); config_path = config_dir; } config_pathA = WtoA(config_path); if (!config_pathA) { res = E_OUTOFMEMORY; goto end; } GetModuleFileNameW(NULL, base_dir, ARRAY_SIZE(base_dir)); base_dirA = WtoA(base_dir); if (!base_dirA) { HeapFree(GetProcessHeap(), 0, config_pathA); res = E_OUTOFMEMORY; goto end; } slash = strrchr(base_dirA, '\\'); if (slash) *(slash + 1) = 0; TRACE("setting base_dir: %s, config_path: %s\n", base_dirA, config_pathA); mono_domain_set_config(This->default_domain, base_dirA, config_pathA); HeapFree(GetProcessHeap(), 0, config_pathA); HeapFree(GetProcessHeap(), 0, base_dirA); end: *result = This->default_domain; LeaveCriticalSection(&This->lock); return res; }