Commit e41502b4 authored by Vincent Povirk's avatar Vincent Povirk Committed by Alexandre Julliard

mscoree: Add support for config stream in GetRequestedRuntime.

parent 4df6d303
...@@ -650,33 +650,44 @@ static HRESULT parse_config(VARIANT input, parsed_config_file *result) ...@@ -650,33 +650,44 @@ static HRESULT parse_config(VARIANT input, parsed_config_file *result)
return S_OK; return S_OK;
} }
HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result) HRESULT parse_config_stream(IStream *stream, parsed_config_file *result)
{ {
IStream *stream;
VARIANT var; VARIANT var;
HRESULT hr; HRESULT hr;
HRESULT initresult; HRESULT initresult;
init_config(result); init_config(result);
hr = CreateConfigStream(filename, &stream);
if (FAILED(hr))
return hr;
initresult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); initresult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
V_VT(&var) = VT_UNKNOWN; V_VT(&var) = VT_UNKNOWN;
V_UNKNOWN(&var) = (IUnknown*)stream; V_UNKNOWN(&var) = (IUnknown*)stream;
hr = parse_config(var, result); hr = parse_config(var, result);
IStream_Release(stream);
if (SUCCEEDED(initresult)) if (SUCCEEDED(initresult))
CoUninitialize(); CoUninitialize();
return hr; return hr;
} }
HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result)
{
HRESULT hr;
IStream *stream;
init_config(result);
hr = CreateConfigStream(filename, &stream);
if (FAILED(hr))
return hr;
hr = parse_config_stream(stream, result);
IStream_Release(stream);
return hr;
}
void free_parsed_config_file(parsed_config_file *file) void free_parsed_config_file(parsed_config_file *file)
{ {
supported_runtime *cursor, *cursor2; supported_runtime *cursor, *cursor2;
......
...@@ -1296,7 +1296,7 @@ static void CDECL ReallyFixupVTable(struct dll_fixup *fixup) ...@@ -1296,7 +1296,7 @@ static void CDECL ReallyFixupVTable(struct dll_fixup *fixup)
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = get_runtime_info(filename, NULL, NULL, 0, 0, FALSE, &info); hr = get_runtime_info(filename, NULL, NULL, NULL, 0, 0, FALSE, &info);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = ICLRRuntimeInfo_GetRuntimeHost(info, &host); hr = ICLRRuntimeInfo_GetRuntimeHost(info, &host);
...@@ -1469,7 +1469,7 @@ __int32 WINAPI _CorExeMain(void) ...@@ -1469,7 +1469,7 @@ __int32 WINAPI _CorExeMain(void)
FixupVTable(GetModuleHandleW(NULL)); FixupVTable(GetModuleHandleW(NULL));
hr = get_runtime_info(filename, NULL, NULL, 0, 0, FALSE, &info); hr = get_runtime_info(filename, NULL, NULL, NULL, 0, 0, FALSE, &info);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
...@@ -1831,7 +1831,7 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) ...@@ -1831,7 +1831,7 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj )
*ppObj = NULL; *ppObj = NULL;
hr = get_runtime_info(filename, NULL, NULL, 0, 0, FALSE, &info); hr = get_runtime_info(filename, NULL, NULL, NULL, 0, 0, FALSE, &info);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = ICLRRuntimeInfo_GetRuntimeHost(info, &host); hr = ICLRRuntimeInfo_GetRuntimeHost(info, &host);
......
...@@ -1126,11 +1126,10 @@ static HRESULT WINAPI metahostpolicy_GetRequestedRuntime(ICLRMetaHostPolicy *ifa ...@@ -1126,11 +1126,10 @@ static HRESULT WINAPI metahostpolicy_GetRequestedRuntime(ICLRMetaHostPolicy *ifa
pwzVersion, pcchVersion, pwzImageVersion, pcchImageVersion, pdwConfigFlags, pwzVersion, pcchVersion, pwzImageVersion, pcchImageVersion, pdwConfigFlags,
debugstr_guid(riid), ppRuntime); debugstr_guid(riid), ppRuntime);
if (pCfgStream) if (pdwConfigFlags) {
FIXME("ignoring config file stream\n");
if (pdwConfigFlags)
FIXME("ignoring config flags\n"); FIXME("ignoring config flags\n");
*pdwConfigFlags = 0;
}
if(dwPolicyFlags & METAHOST_POLICY_USE_PROCESS_IMAGE_PATH) if(dwPolicyFlags & METAHOST_POLICY_USE_PROCESS_IMAGE_PATH)
{ {
...@@ -1145,7 +1144,7 @@ static HRESULT WINAPI metahostpolicy_GetRequestedRuntime(ICLRMetaHostPolicy *ifa ...@@ -1145,7 +1144,7 @@ static HRESULT WINAPI metahostpolicy_GetRequestedRuntime(ICLRMetaHostPolicy *ifa
if(dwPolicyFlags & METAHOST_POLICY_APPLY_UPGRADE_POLICY) if(dwPolicyFlags & METAHOST_POLICY_APPLY_UPGRADE_POLICY)
flags |= RUNTIME_INFO_UPGRADE_VERSION; flags |= RUNTIME_INFO_UPGRADE_VERSION;
hr = get_runtime_info(path, pwzImageVersion, NULL, 0, flags, FALSE, &result); hr = get_runtime_info(path, pwzImageVersion, NULL, pCfgStream, 0, flags, FALSE, &result);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
if (pwzImageVersion) if (pwzImageVersion)
...@@ -1276,7 +1275,8 @@ static MonoAssembly* CDECL mono_assembly_preload_hook_fn(MonoAssemblyName *aname ...@@ -1276,7 +1275,8 @@ static MonoAssembly* CDECL mono_assembly_preload_hook_fn(MonoAssemblyName *aname
} }
HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file,
DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy, ICLRRuntimeInfo **result) IStream *config_stream, DWORD startup_flags, DWORD runtimeinfo_flags,
BOOL legacy, ICLRRuntimeInfo **result)
{ {
static const WCHAR dotconfig[] = {'.','c','o','n','f','i','g',0}; static const WCHAR dotconfig[] = {'.','c','o','n','f','i','g',0};
static const DWORD supported_startup_flags = 0; static const DWORD supported_startup_flags = 0;
...@@ -1297,7 +1297,7 @@ HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, ...@@ -1297,7 +1297,7 @@ HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file,
if (exefile && !exefile[0]) if (exefile && !exefile[0])
exefile = NULL; exefile = NULL;
if (exefile && !config_file) if (exefile && !config_file && !config_stream)
{ {
strcpyW(local_config_file, exefile); strcpyW(local_config_file, exefile);
strcatW(local_config_file, dotconfig); strcatW(local_config_file, dotconfig);
...@@ -1305,10 +1305,13 @@ HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, ...@@ -1305,10 +1305,13 @@ HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file,
config_file = local_config_file; config_file = local_config_file;
} }
if (config_file) if (config_file || config_stream)
{ {
BOOL found = FALSE; BOOL found = FALSE;
hr = parse_config_file(config_file, &parsed_config); if (config_file)
hr = parse_config_file(config_file, &parsed_config);
else
hr = parse_config_stream(config_stream, &parsed_config);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
......
...@@ -205,7 +205,7 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor ...@@ -205,7 +205,7 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor
*ppv = NULL; *ppv = NULL;
ret = get_runtime_info(NULL, pwszVersion, pwszHostConfigFile, startupFlags, 0, TRUE, &info); ret = get_runtime_info(NULL, pwszVersion, pwszHostConfigFile, NULL, startupFlags, 0, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
...@@ -274,7 +274,7 @@ HRESULT WINAPI GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwL ...@@ -274,7 +274,7 @@ HRESULT WINAPI GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwL
if (!dwLength || !pbuffer) if (!dwLength || !pbuffer)
return E_POINTER; return E_POINTER;
ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); ret = get_runtime_info(NULL, NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
...@@ -297,7 +297,7 @@ HRESULT WINAPI GetCORVersion(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength) ...@@ -297,7 +297,7 @@ HRESULT WINAPI GetCORVersion(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength)
if (!dwLength || !pbuffer) if (!dwLength || !pbuffer)
return E_POINTER; return E_POINTER;
ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); ret = get_runtime_info(NULL, NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
...@@ -336,7 +336,7 @@ HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR pExe, LPCWSTR pwszVersion, LPCWST ...@@ -336,7 +336,7 @@ HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR pExe, LPCWSTR pwszVersion, LPCWST
if (!dwlength) dwlength = &length_dummy; if (!dwlength) dwlength = &length_dummy;
ret = get_runtime_info(pExe, pwszVersion, pConfigurationFile, startupFlags, runtimeInfoFlags, TRUE, &info); ret = get_runtime_info(pExe, pwszVersion, pConfigurationFile, NULL, startupFlags, runtimeInfoFlags, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
...@@ -482,7 +482,7 @@ HRESULT WINAPI CorBindToRuntimeEx(LPWSTR szVersion, LPWSTR szBuildFlavor, DWORD ...@@ -482,7 +482,7 @@ HRESULT WINAPI CorBindToRuntimeEx(LPWSTR szVersion, LPWSTR szBuildFlavor, DWORD
*ppv = NULL; *ppv = NULL;
ret = get_runtime_info(NULL, szVersion, NULL, nflags, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); ret = get_runtime_info(NULL, szVersion, NULL, NULL, nflags, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
...@@ -503,7 +503,7 @@ HRESULT WINAPI CorBindToCurrentRuntime(LPCWSTR filename, REFCLSID rclsid, REFIID ...@@ -503,7 +503,7 @@ HRESULT WINAPI CorBindToCurrentRuntime(LPCWSTR filename, REFCLSID rclsid, REFIID
*ppv = NULL; *ppv = NULL;
ret = get_runtime_info(NULL, NULL, filename, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); ret = get_runtime_info(NULL, NULL, filename, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
...@@ -526,7 +526,7 @@ STDAPI ClrCreateManagedInstance(LPCWSTR pTypeName, REFIID riid, void **ppObject) ...@@ -526,7 +526,7 @@ STDAPI ClrCreateManagedInstance(LPCWSTR pTypeName, REFIID riid, void **ppObject)
TRACE("(%s,%s,%p)\n", debugstr_w(pTypeName), debugstr_guid(riid), ppObject); TRACE("(%s,%s,%p)\n", debugstr_w(pTypeName), debugstr_guid(riid), ppObject);
/* FIXME: How to determine which runtime version to use? */ /* FIXME: How to determine which runtime version to use? */
ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); ret = get_runtime_info(NULL, NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info);
if (SUCCEEDED(ret)) if (SUCCEEDED(ret))
{ {
......
...@@ -103,7 +103,8 @@ typedef struct CorDebug ...@@ -103,7 +103,8 @@ typedef struct CorDebug
} CorDebug; } CorDebug;
extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file,
DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy, ICLRRuntimeInfo **result) DECLSPEC_HIDDEN; IStream *config_stream, DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy,
ICLRRuntimeInfo **result) DECLSPEC_HIDDEN;
extern HRESULT ICLRRuntimeInfo_GetRuntimeHost(ICLRRuntimeInfo *iface, RuntimeHost **result) DECLSPEC_HIDDEN; extern HRESULT ICLRRuntimeInfo_GetRuntimeHost(ICLRRuntimeInfo *iface, RuntimeHost **result) DECLSPEC_HIDDEN;
...@@ -122,6 +123,8 @@ typedef struct supported_runtime ...@@ -122,6 +123,8 @@ typedef struct supported_runtime
extern HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result) DECLSPEC_HIDDEN; extern HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result) DECLSPEC_HIDDEN;
extern HRESULT parse_config_stream(IStream *stream, parsed_config_file *result) DECLSPEC_HIDDEN;
extern void free_parsed_config_file(parsed_config_file *file) DECLSPEC_HIDDEN; extern void free_parsed_config_file(parsed_config_file *file) DECLSPEC_HIDDEN;
typedef enum { typedef enum {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment