| 214 | } |
| 215 | |
| 216 | ICorRuntimeHost* loadCLR(bool v4){ |
| 217 | |
| 218 | BOF_LOCAL(OLE32, CoInitializeEx); |
| 219 | BOF_LOCAL(OLE32, CoCreateInstance); |
| 220 | BOF_LOCAL(OLE32, CLSIDFromString); |
| 221 | BOF_LOCAL(KERNEL32, LoadLibraryA); |
| 222 | |
| 223 | GUID IID_RTH, CLSID_RTH, IID_MH, CLSID_MH, CLSID_RH, IID_RH, IID_RHI; |
| 224 | HRESULT hr; |
| 225 | ICorRuntimeHost* result = nullptr; |
| 226 | ICLRMetaHost* pMetaHost = nullptr; |
| 227 | ICLRRuntimeInfo* pRuntimeInfo = nullptr; |
| 228 | ICLRRuntimeHost* pClrRuntimeHost = nullptr; |
| 229 | CLRCreateInstancePtr pCLRCreateInstance = nullptr; |
| 230 | HMODULE hMod = NULL; |
| 231 | |
| 232 | CLSIDFromString(L"{cb2f6722-ab3a-11d2-9c40-00c04fa30a3e}", &IID_RTH); |
| 233 | CLSIDFromString(L"{cb2f6723-ab3a-11d2-9c40-00c04fa30a3e}", &CLSID_RTH); |
| 234 | CLSIDFromString(L"{d332db9e-b9b3-4125-8207-a14884f53216}", &IID_MH); |
| 235 | CLSIDFromString(L"{9280188D-0E8E-4867-B30C-7FA83884E8DE}", &CLSID_MH); |
| 236 | CLSIDFromString(L"{bd39d1d2-ba2f-486a-89b0-b4b0cb466891}", &IID_RHI); |
| 237 | CLSIDFromString(L"{90f1a06e-7712-4762-86b5-7a5eba6bdb02}", &CLSID_RH); |
| 238 | CLSIDFromString(L"{90f1a06c-7712-4762-86b5-7a5eba6bdb02}", &IID_RH); |
| 239 | |
| 240 | if( (hMod = LoadLibraryA("mscoree.dll")) != NULL){ |
| 241 | pCLRCreateInstance = (CLRCreateInstancePtr)GetProcAddress(hMod,"CLRCreateInstance"); |
| 242 | if(pCLRCreateInstance == nullptr){ |
| 243 | log("[=]Failed to get v2 ICorRuntimeHost: 0x%x, will try .NET 2 method", hr); |
| 244 | v4 = false; |
| 245 | } |
| 246 | } |
| 247 | |
| 248 | hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); |
| 249 | |
| 250 | if(v4 && (hr = pCLRCreateInstance(CLSID_MH, IID_MH, (LPVOID*)&pMetaHost) == S_OK)){ |
| 251 | |
| 252 | if((hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_RHI, (LPVOID*)&pRuntimeInfo)) == S_OK){ |
| 253 | if((hr = pRuntimeInfo->GetInterface(CLSID_RH, IID_RH, (LPVOID*)&pClrRuntimeHost)) == S_OK){; |
| 254 | hr = pClrRuntimeHost->Start(); |
| 255 | hr = pRuntimeInfo->GetInterface(CLSID_RTH, IID_RTH, (LPVOID *)&result); |
| 256 | }else{ |
| 257 | log("Failed to get CLR runtime host: 0x%x", hr); |
| 258 | } |
| 259 | }else{ |
| 260 | log("Failed to get v4 runtime info: 0x%x", hr); |
| 261 | } |
| 262 | |
| 263 | }else{ |
| 264 | if( (hr = CoCreateInstance(CLSID_RTH, nullptr, CLSCTX_ALL, IID_RTH,(LPVOID*)&result)) == S_OK){ |
| 265 | hr = result->Start(); |
| 266 | }else{ |
| 267 | log("Failed to get v2 ICorRuntimeHost: 0x%x", hr); |
| 268 | } |
| 269 | } |
| 270 | |
| 271 | return result; |
| 272 | } |
| 273 | |