HRESULT SetZapDir() { HRESULT hr = S_OK; WCHAR szCorVer[MAX_PATH+1]; DWORD cchCorVer=MAX_PATH; if(FAILED(hr = GetCORVersion(szCorVer, &cchCorVer))) goto exit; if( (lstrlen(g_szWindowsDir) + cchCorVer + lstrlen(FUSION_CACHE_DIR_ZAP_SZ) ) > MAX_PATH ) return HRESULT_FROM_WIN32(FUSION_E_INVALID_NAME); StrCpy(g_ZapDir, g_szWindowsDir); StrCat(g_ZapDir, FUSION_CACHE_DIR_ZAP_SZ); StrCat(g_ZapDir, szCorVer); exit : return hr; }
HRESULT WINAPI LoadLibraryShim( LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE * phModDll) { HRESULT ret=S_OK; WCHAR dll_filename[MAX_PATH]; WCHAR version[MAX_PATH]; static const WCHAR default_version[] = {'v','1','.','1','.','4','3','2','2',0}; static const WCHAR slash[] = {'\\',0}; DWORD dummy; TRACE("(%p %s, %p, %p, %p)\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll); if (!szDllName || !phModDll) return E_POINTER; if (!get_install_root(dll_filename)) { ERR("error reading registry key for installroot\n"); dll_filename[0] = 0; } else { if (!szVersion) { ret = GetCORVersion(version, MAX_PATH, &dummy); if (SUCCEEDED(ret)) szVersion = version; else szVersion = default_version; } strcatW(dll_filename, szVersion); strcatW(dll_filename, slash); } strcatW(dll_filename, szDllName); *phModDll = LoadLibraryW(dll_filename); return *phModDll ? S_OK : E_HANDLE; }
// Try to get the CLR 2.0 running - .Net 4+ MetaHost stuff not present. HRESULT LoadClr20(ICorRuntimeHost **ppHost) { HRESULT hr = E_FAIL; HMODULE hMscoree = NULL; hMscoree = LoadLibrary(L"mscoree.dll"); if (hMscoree == 0) { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_LOADMSCOREE, IDS_MSG_FOOTER_ENSURECLR20 ); hr = E_FAIL; } else { // Load the runtime pfnCorBindToRuntimeEx CorBindToRuntimeEx = (pfnCorBindToRuntimeEx)GetProcAddress(hMscoree, "CorBindToRuntimeEx"); if (CorBindToRuntimeEx == 0) { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_NOCORBIND, IDS_MSG_FOOTER_UNEXPECTED ); hr = E_FAIL; } else { // Attempt to load a runtime that is compatible with the release version of .Net 2.0. hr = CorBindToRuntimeEx(L"v2.0.50727", L"wks", NULL, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, (LPVOID*)ppHost); if (FAILED(hr)) { // Could not load the right version // Check whether version 2 is installed if (!DetectFxIsNet20Installed()) { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_NONET20, IDS_MSG_FOOTER_ENSURECLR20, hr); hr = E_FAIL; } else { // Check whether a version is already running if (GetModuleHandle(L"mscorwks") != NULL) { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_OLDVERSION, IDS_MSG_FOOTER_OLDVERSION); hr = E_FAIL; } else { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_CORBINDFAILED, IDS_MSG_FOOTER_ENSURECLR20ANDLOAD, hr); //// Unknown load failure //ShowMessage(IDS_MSG_HEADER_NEEDCLR20, // IDS_MSG_BODY_UNKNOWNLOADFAIL, // IDS_MSG_FOOTER_UNEXPECTED); hr = E_FAIL; } } //hr = E_FAIL; } else { // Check the version that is now loaded ... pfnGetCORVersion GetCORVersion = (pfnGetCORVersion)GetProcAddress(hMscoree, "GetCORVersion"); if (GetCORVersion == 0) { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_NOCORVERSION, IDS_MSG_FOOTER_UNEXPECTED ); hr = E_FAIL; } else { // Display current runtime loaded WCHAR szVersion[MAX_PATH + 1]; DWORD dwLength = MAX_PATH; hr = GetCORVersion(szVersion, dwLength, &dwLength); if (FAILED(hr)) { ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_CORVERSIONFAILED, IDS_MSG_FOOTER_UNEXPECTED, hr); hr = E_FAIL; } else { if ( DetectFxReadMajorVersion(szVersion) < 2 ) { // The version is no good. ShowMessage(IDS_MSG_HEADER_NEEDCLR20, IDS_MSG_BODY_WRONGVERSIONLOADED, IDS_MSG_FOOTER_REVIEWADDINS); hr = E_FAIL; } else { hr = S_OK; } } } } } FreeLibrary(hMscoree); } return hr; }