DWORD load_assembly(BYTE* assemblyData, DWORD assemblySize) { dprintf("[PSH] loading assembly of size %u", assemblySize); HRESULT hr = S_OK; SAFEARRAY* clrByteArray = NULL; SAFEARRAYBOUND bounds[1]; _AssemblyPtr* loadedAssembly = new _AssemblyPtr(); bounds[0].cElements = assemblySize; bounds[0].lLbound = 0; if (gClrAppDomainInterface == NULL) { dprintf("[PSH] Extension wasn't initialised"); return ERROR_INVALID_HANDLE; } do { clrByteArray = SafeArrayCreate(VT_UI1, 1, bounds); if (clrByteArray == NULL) { dprintf("[PSH] Failed to create a usable safe array"); hr = (HRESULT)ERROR_OUTOFMEMORY; break; } dprintf("[PSH] Safe array created"); if (FAILED(hr = SafeArrayLock(clrByteArray))) { dprintf("[PSH] Safe array lock failed 0x%x", hr); break; } dprintf("[PSH] Copying binary data to target"); memcpy(clrByteArray->pvData, assemblyData, assemblySize); SafeArrayUnlock(clrByteArray); if (FAILED(hr = gClrAppDomainInterface->Load_3(clrByteArray, (_Assembly**)loadedAssembly))) { dprintf("[PSH] Failed to load the assembly 0x%x", hr); break; } dprintf("[PSH] Assembly appears to have been loaded successfully"); list_add(gLoadedAssemblies, loadedAssembly); } while (0); if (SUCCEEDED(hr)) { return ERROR_SUCCESS; } else { delete loadedAssembly; } return (DWORD)hr; }
HRESULT LoadLoaderIntoAppDomain(_AppDomainPtr& pAppDomain, _AssemblyPtr& pLoaderAssembly, bool forceFromBytes) { HRESULT hr; if (!forceFromBytes) { // Try regular load first hr = pAppDomain->Load_2(_bstr_t(L"ExcelDna.Loader"), &pLoaderAssembly); } if (forceFromBytes || FAILED(hr) || pLoaderAssembly == NULL) { // Now try from resource bytes HRSRC hResInfoLoader = FindResource(hModuleCurrent, L"EXCELDNA.LOADER", L"ASSEMBLY"); if (hResInfoLoader == NULL) { ShowMessage(IDS_MSG_HEADER_APPDOMAIN, IDS_MSG_BODY_MISSINGEXCELDNALOADER, IDS_MSG_FOOTER_UNEXPECTED, hr); return E_FAIL; } HGLOBAL hLoader = LoadResource(hModuleCurrent, hResInfoLoader); void* pLoader = LockResource(hLoader); ULONG sizeLoader = (ULONG)SizeofResource(hModuleCurrent, hResInfoLoader); SafeByteArray loaderBytes(pLoader, sizeLoader); hr = pAppDomain->Load_3(loaderBytes, &pLoaderAssembly); if (FAILED(hr)) { ShowMessage(IDS_MSG_HEADER_APPDOMAIN, IDS_MSG_BODY_EXCELDNALOADER, IDS_MSG_FOOTER_UNEXPECTED, hr); return E_FAIL; } if (FAILED(hr)) { ShowMessage(IDS_MSG_HEADER_APPDOMAIN, IDS_MSG_BODY_EXCELDNALOADERNAME, IDS_MSG_FOOTER_UNEXPECTED, hr); return E_FAIL; } } return S_OK; }