From 1319515173f5c0ea303a8087904ad72d8698c99f Mon Sep 17 00:00:00 2001 From: Daniel Jelinski Date: Tue, 4 Jun 2013 21:14:56 +0200 Subject: [PATCH] mscoree: Search for COM classes by assembly name if CodeBase not found. --- dlls/mscoree/corruntimehost.c | 47 ++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c index b4ee38b5c3b..76b7d659249 100644 --- a/dlls/mscoree/corruntimehost.c +++ b/dlls/mscoree/corruntimehost.c @@ -1235,6 +1235,7 @@ HRESULT RuntimeHost_Destroy(RuntimeHost *This) HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) { + static const WCHAR wszAssembly[] = {'A','s','s','e','m','b','l','y',0}; static const WCHAR wszCodebase[] = {'C','o','d','e','B','a','s','e',0}; static const WCHAR wszClass[] = {'C','l','a','s','s',0}; static const WCHAR wszFileSlash[] = {'f','i','l','e',':','/','/','/',0}; @@ -1246,11 +1247,12 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) ICLRRuntimeInfo *info = NULL; RuntimeHost *host; HRESULT hr; - HKEY key; + HKEY key, subkey; LONG res; int offset = 0; + DWORD numKeys, keyLength; WCHAR codebase[MAX_PATH + 8]; - WCHAR classname[350]; + WCHAR classname[350], subkeyName[256]; WCHAR filename[MAX_PATH]; DWORD dwBufLen = 350; @@ -1277,18 +1279,39 @@ HRESULT create_monodata(REFIID riid, LPVOID *ppObj ) dwBufLen = MAX_PATH + 8; res = RegGetValueW( key, NULL, wszCodebase, RRF_RT_REG_SZ, NULL, codebase, &dwBufLen); - if(res != ERROR_SUCCESS) + if(res == ERROR_SUCCESS) { - WARN("CodeBase value cannot be found.\n"); - hr = CLASS_E_CLASSNOTAVAILABLE; - goto cleanup; + /* Strip file:/// */ + if(strncmpW(codebase, wszFileSlash, strlenW(wszFileSlash)) == 0) + offset = strlenW(wszFileSlash); + + strcpyW(filename, codebase + offset); + } + else + { + hr = CLASS_E_CLASSNOTAVAILABLE; + WARN("CodeBase value cannot be found, trying Assembly.\n"); + /* get the last subkey of InprocServer32 */ + res = RegQueryInfoKeyW(key, 0, 0, 0, &numKeys, 0, 0, 0, 0, 0, 0, 0); + if (res != ERROR_SUCCESS || numKeys == 0) + goto cleanup; + numKeys--; + keyLength = sizeof(subkeyName) / sizeof(WCHAR); + res = RegEnumKeyExW(key, numKeys, subkeyName, &keyLength, 0, 0, 0, 0); + if (res != ERROR_SUCCESS) + goto cleanup; + res = RegOpenKeyExW(key, subkeyName, 0, KEY_READ, &subkey); + if (res != ERROR_SUCCESS) + goto cleanup; + dwBufLen = MAX_PATH + 8; + res = RegGetValueW(subkey, NULL, wszAssembly, RRF_RT_REG_SZ, NULL, codebase, &dwBufLen); + RegCloseKey(subkey); + if (res != ERROR_SUCCESS) + goto cleanup; + hr = get_file_from_strongname(codebase, filename, MAX_PATH); + if (!SUCCEEDED(hr)) + goto cleanup; } - - /* Strip file:/// */ - if(strncmpW(codebase, wszFileSlash, strlenW(wszFileSlash)) == 0) - offset = strlenW(wszFileSlash); - - strcpyW(filename, codebase + offset); TRACE("codebase (%s)\n", debugstr_w(filename));