diff options
Diffstat (limited to 'src/vm/peimage.cpp')
-rw-r--r-- | src/vm/peimage.cpp | 810 |
1 files changed, 1 insertions, 809 deletions
diff --git a/src/vm/peimage.cpp b/src/vm/peimage.cpp index 583c5e3144..39b71ff62f 100644 --- a/src/vm/peimage.cpp +++ b/src/vm/peimage.cpp @@ -28,10 +28,6 @@ CrstStatic PEImage::s_hashLock; PtrHashMap *PEImage::s_Images = NULL; -#ifdef FEATURE_MIXEDMODE -CrstStatic PEImage::s_ijwHashLock; -PtrHashMap *PEImage::s_ijwFixupDataHash; -#endif extern LocaleID g_lcid; // fusion path comparison lcid @@ -58,20 +54,12 @@ void PEImage::Startup() LockOwner lock = { &s_hashLock, IsOwnerOfCrst }; s_Images = ::new PtrHashMap; s_Images->Init(CompareImage, FALSE, &lock); -#ifdef FEATURE_MIXEDMODE - s_ijwHashLock.Init(CrstIJWHash, CRST_REENTRANCY); - LockOwner ijwLock = { &s_ijwHashLock, IsOwnerOfCrst }; - s_ijwFixupDataHash = ::new PtrHashMap; - s_ijwFixupDataHash->Init(CompareIJWDataBase, FALSE, &ijwLock); -#endif PEImageLayout::Startup(); -#ifndef FEATURE_FUSION #ifdef FEATURE_USE_LCID g_lcid = MAKELCID(LOCALE_INVARIANT, SORT_DEFAULT); #else // FEATURE_USE_LCID g_lcid = NULL; // invariant #endif //FEATURE_USE_LCID -#endif END_SO_INTOLERANT_CODE; RETURN; @@ -226,27 +214,8 @@ PEImage::~PEImage() m_pMDTracker->Deactivate(); #endif // METADATATRACKER_ENABLED -#ifdef FEATURE_FUSION - delete m_pILFingerprint; -#endif // FEATURE_FUSION } -#ifdef FEATURE_MIXEDMODE -/* static */ -BOOL PEImage::CompareIJWDataBase(UPTR base, UPTR mapping) -{ - CONTRACTL { - PRECONDITION(CheckStartup()); - PRECONDITION(CheckPointer((BYTE *) (base<<1))); - PRECONDITION(CheckPointer((IJWFixupData *)mapping)); - NOTHROW; - GC_NOTRIGGER; - MODE_ANY; - } CONTRACTL_END; - - return ((BYTE *) (base<<1) == ((IJWFixupData*)mapping)->GetBase()); -} -#endif // FEATURE_MIXEDMODE // Thread stress #if 0 @@ -444,12 +413,6 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2) // This is the value stored in the table PEImage *pImage = (PEImage *) u2; -#ifdef FEATURE_FUSION - if (pLocator->m_fIsIStream) - { - return pImage->m_fIsIStream && (pLocator->m_StreamAsmId == pImage->m_StreamAsmId) && (pLocator->m_dwStreamModuleId == pImage->m_dwStreamModuleId); - } -#endif BOOL ret = FALSE; HRESULT hr; @@ -475,103 +438,13 @@ BOOL PEImage::Equals(PEImage *pImage) } CONTRACTL_END; -#ifdef FEATURE_CORECLR // PEImage is always unique on CoreCLR so a simple pointer check is sufficient _ASSERTE(m_bInHashMap || GetPath().IsEmpty()); _ASSERTE(pImage->m_bInHashMap || pImage->GetPath().IsEmpty()); return dac_cast<TADDR>(pImage) == dac_cast<TADDR>(this); -#else // FEATURE_CORECLR - if (pImage == this) - return TRUE; - - if (GetPath().IsEmpty()) - { -#ifdef FEATURE_FUSION - if (m_fIsIStream && pImage->m_fIsIStream) - { - return (m_StreamAsmId == pImage->m_StreamAsmId) && (m_dwStreamModuleId == pImage->m_dwStreamModuleId); - } -#endif - - return FALSE; - } - else - { - BOOL ret = FALSE; - HRESULT hr; - EX_TRY - { - if (PathEquals(GetPath(), pImage->GetPath())) - ret = TRUE; - } - EX_CATCH_HRESULT(hr); //<TODO>ignores failure!</TODO> - return ret; - } -#endif // FEATURE_CORECLR -} - -#ifndef FEATURE_CORECLR -void PEImage::ComputeHash(ALG_ID algorithm, SBuffer &result) -{ - CONTRACTL - { - INSTANCE_CHECK; - PRECONDITION(CheckStartup()); - PRECONDITION(CheckValue(result)); - THROWS; - GC_TRIGGERS; - MODE_ANY; - INJECT_FAULT(COMPlusThrowOM();); - } - CONTRACTL_END; - - PEImageLayoutHolder pview(GetLayout(PEImageLayout::LAYOUT_FLAT,PEImage::LAYOUT_CREATEIFNEEDED)); - - if (algorithm == CALG_SHA1) - { - SHA1Hash hasher; - hasher.AddData((BYTE *) pview->GetBase(), pview->GetSize()); - result.Set(hasher.GetHash(), SHA1_HASH_SIZE); - return; - } - - DWORD size = 0; - if(!StrongNameHashSize(algorithm, &size)) - { - ThrowHR(StrongNameErrorInfo()); - } - - BYTE *buffer = result.OpenRawBuffer(size); - - DWORD hashSize; - IfFailThrow(GetHashFromBlob((BYTE *) pview->GetBase(), pview->GetSize(), &algorithm, buffer, size, &hashSize)); - - _ASSERTE(size == hashSize); - - result.CloseRawBuffer(hashSize); } -CHECK PEImage::CheckHash(ALG_ID algorithm, const void *pbHash, COUNT_T cbHash) -{ - CONTRACT_CHECK - { - INSTANCE_CHECK; - PRECONDITION(CheckStartup()); - INSTANCE_CHECK; - GC_TRIGGERS; - MODE_ANY; - } - CONTRACT_CHECK_END; - - StackSBuffer hash; - ComputeHash(algorithm, hash); - - CHECK(hash.Equals((const BYTE *) pbHash, cbHash)); - - CHECK_OK; -} -#endif // FEATURE_CORECLR IMDInternalImport* PEImage::GetMDImport() { @@ -833,481 +706,9 @@ void DECLSPEC_NORETURN PEImage::ThrowFormat(HRESULT hrError) EEFileLoadException::Throw(m_path, hrError); } -#ifdef FEATURE_FUSION -// -------------------------------------------------------------------------------- -// Exports for the metadata APIs for fusion. -// -------------------------------------------------------------------------------- - -HRESULT STDMETHODCALLTYPE RuntimeOpenImage(LPCWSTR pszFileName, HCORMODULE* hHandle) -{ - WRAPPER_NO_CONTRACT; - return RuntimeOpenImageInternal(pszFileName, hHandle, NULL, MDInternalImport_Default); -} - -HRESULT STDMETHODCALLTYPE RuntimeOpenImageInternal(LPCWSTR pszFileName, HCORMODULE* hHandle, DWORD *pdwLength, MDInternalImportFlags flags, HANDLE hFile) -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_SO_INTOLERANT; - HRESULT hr = S_OK; - ETWOnStartup (LoaderCatchCall_V1,LoaderCatchCallEnd_V1); - EX_TRY - { - PEImage::Startup(); - PEImageHolder pFile(PEImage::OpenImage(pszFileName, flags)); - if (hFile != INVALID_HANDLE_VALUE) - { - pFile->SetFileHandle(hFile); - } - if (pdwLength) - { - PEImageLayoutHolder pLayout(pFile->GetLayout(PEImageLayout::LAYOUT_MAPPED,PEImage::LAYOUT_CREATEIFNEEDED)); - pFile->CachePEKindAndMachine(); - *pdwLength = pLayout->GetSize(); - } - *hHandle = (HCORMODULE)pFile.Extract(); - } - EX_CATCH_HRESULT(hr); - return hr; -} - -HRESULT STDMETHODCALLTYPE RuntimeOpenImageByStream(IStream* pIStream, UINT64 AssemblyId, - DWORD dwModuleId, - HCORMODULE* hHandle, DWORD *pdwLength, MDInternalImportFlags flags) -{ - STATIC_CONTRACT_NOTHROW; - HRESULT hr = S_OK; - - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - EX_TRY - { - PEImage::Startup(); - - PEImageHolder pFile(PEImage::OpenImage(pIStream, AssemblyId, dwModuleId, FALSE, flags)); - *hHandle = (HCORMODULE) pFile.Extract(); - if (pdwLength) - { - PEImageLayoutHolder pImage(pFile->GetLayout(PEImageLayout::LAYOUT_ANY,0)); - pFile->CachePEKindAndMachine(); - *pdwLength = pImage->GetSize(); - } - } - EX_CATCH_HRESULT(hr); - END_SO_INTOLERANT_CODE; - - return hr; -} - -HRESULT STDMETHODCALLTYPE RuntimeReleaseHandle(HCORMODULE hHandle) -{ - STATIC_CONTRACT_NOTHROW; - HRESULT hr = S_OK; - - PEImage *pImage = (PEImage*)hHandle; - - if (pImage != NULL) - pImage->Release(); - - return hr; -} - -void RuntimeAddRefHandle(HCORMODULE hHandle) -{ - STATIC_CONTRACT_NOTHROW; - - PEImage *pImage = (PEImage*)hHandle; - - if (pImage != NULL) - pImage->AddRef(); -} - -HRESULT STDMETHODCALLTYPE RuntimeGetMDInternalImport(HCORMODULE hHandle, MDInternalImportFlags flags, IMDInternalImport** ppMDImport) -{ - CONTRACTL - { - NOTHROW; - GC_TRIGGERS; - MODE_ANY; - SO_TOLERANT; - } - CONTRACTL_END; - PEImage* pImage=(PEImage*)hHandle; - HRESULT hr=S_OK; - - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - EX_TRY - { - if (!pImage->HasNTHeaders() || !pImage->HasCorHeader()) - hr=HRESULT_FROM_WIN32(ERROR_FILE_INVALID); - else - { -#ifdef FEATURE_PREJIT - if (pImage->HasNativeHeader()) - { - if (!pImage->CheckNativeFormat()) - hr=COR_E_BADIMAGEFORMAT; - else - { - if (flags & MDInternalImport_ILMetaData) - goto OPEN_IL_METADATA; - - *ppMDImport=pImage->GetNativeMDImport(); - if (*ppMDImport) - (*ppMDImport)->AddRef(); - else - hr=COR_E_BADIMAGEFORMAT; - } - } - else -#endif //FEATURE_PREJIT - { - if (!pImage->CheckILFormat()) - hr=COR_E_BADIMAGEFORMAT; - else - { -#ifdef FEATURE_PREJIT - OPEN_IL_METADATA: -#endif - *ppMDImport=pImage->GetMDImport(); - if (*ppMDImport) - (*ppMDImport)->AddRef(); - else - hr=COR_E_BADIMAGEFORMAT; - } - } - } - } - EX_CATCH_HRESULT(hr); - END_SO_INTOLERANT_CODE; - - return hr; -} - -HRESULT STDMETHODCALLTYPE RuntimeGetImageBase(HCORMODULE hHandle,LPVOID* base, BOOL bMapped, COUNT_T* dwSize) -{ - CONTRACTL - { - NOTHROW; - GC_TRIGGERS; - MODE_ANY; - SO_TOLERANT; - } - CONTRACTL_END; - HRESULT hr=S_FALSE; - - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - EX_TRY - { - PEImage* pImage=(PEImage*)hHandle; - *base=NULL; - if (!pImage->HasLoadedLayout()) - { - PEImageLayoutHolder pLayout(pImage->GetLayout(bMapped - ?PEImageLayout::LAYOUT_MAPPED - :PEImageLayout::LAYOUT_FLAT,0)); - if (pLayout!=NULL) - { - if(dwSize) - *dwSize=pLayout->GetSize(); - *base=pLayout->GetBase(); - hr=S_OK; - } - } - - if (hr==S_FALSE && pImage->HasLoadedLayout()) - { - BOOL bIsMapped=pImage->GetLoadedLayout()->IsMapped(); - if ((bIsMapped && bMapped) || (!bIsMapped && !bMapped)) - { - //the one we want - *base=pImage->GetLoadedLayout()->GetBase(); - if (dwSize) - *dwSize=pImage->GetLoadedLayout()->GetSize(); - hr=S_OK; - } - } - } - EX_CATCH_HRESULT(hr); - END_SO_INTOLERANT_CODE; - - return hr; -} - -HRESULT STDMETHODCALLTYPE RuntimeGetImageKind(HCORMODULE hHandle,DWORD* pdwKind, DWORD* pdwMachine) -{ - CONTRACTL - { - NOTHROW; - GC_TRIGGERS; - MODE_ANY; - SO_TOLERANT; - } - CONTRACTL_END; - HRESULT hr=S_FALSE; - - PEImage* pImage=(PEImage*)hHandle; - - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - EX_TRY - { - pImage->GetPEKindAndMachine(pdwKind, pdwMachine); - hr = S_OK; - } - EX_CATCH_HRESULT(hr); - END_SO_INTOLERANT_CODE; - return hr; -} - -HRESULT STDMETHODCALLTYPE RuntimeOSHandle(HCORMODULE hHandle, HMODULE* hModule) -{ - LIMITED_METHOD_CONTRACT; - if(hHandle==NULL || hModule == NULL) - return E_POINTER; - PEImage* pImage= (PEImage*) hHandle; - if (!pImage->HasLoadedLayout()) - return HRESULT_FROM_WIN32(ERROR_NOT_FOUND); - *hModule=(HMODULE)pImage->GetLoadedLayout()->GetBase(); - return S_OK; -} -HRESULT RuntimeGetAssemblyStrongNameHashForModule(HCORMODULE hModule, - IMetaDataImport * pMDImport, - BYTE *pbSNHash, - DWORD *pcbSNHash) -{ - STATIC_CONTRACT_NOTHROW; - HRESULT hr = S_OK; - PEImage* pImage = (PEImage*)hModule; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - EX_TRY - { - - if (pImage->HasStrongNameSignature()) - { - if (pImage->IsStrongNameSigned()) - { - SBuffer signature; - pImage->GetHashedStrongNameSignature(signature); - *pcbSNHash = min(signature.GetSize(), *pcbSNHash); - signature.Copy(pbSNHash, signature.Begin(), *pcbSNHash); - } - else - { - // This assembly is delay signed (in this limited scenario). - // We'll use the assembly MVID as the hash and leave assembly verification - // up to the loader to determine if delay signed assemblies are allowed. - // This allows us to fix the perf degrade observed with the hashing code and - // detailed in BUG 126760. - - // <TODO>@TODO:workaround: This is a workaround because Fusion is expecting at least 20 bytes of data.</TODO> - if (max(sizeof(GUID), 20) <= *pcbSNHash) - { - memset(pbSNHash, 0, *pcbSNHash); - hr = pMDImport->GetScopeProps(NULL, 0, NULL, (GUID *) pbSNHash); - } - else - hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - - *pcbSNHash = max(sizeof(GUID), 20); - } - } - else - { - hr = CORSEC_E_MISSING_STRONGNAME; - } - } - EX_CATCH_HRESULT(hr); - END_SO_INTOLERANT_CODE; - - return hr; -} - -#endif // FEATURE_FUSION - - -#if defined(FEATURE_MIXEDMODE) && !defined(CROSSGEN_COMPILE) - -//may outlive PEImage -PEImage::IJWFixupData::IJWFixupData(void *pBase) - : m_lock(CrstIJWFixupData), - m_base(pBase), m_flags(0),m_DllThunkHeap(NULL),m_iNextFixup(0),m_iNextMethod(0) -{ - WRAPPER_NO_CONTRACT; -} - -PEImage::IJWFixupData::~IJWFixupData() -{ - WRAPPER_NO_CONTRACT; - if (m_DllThunkHeap) - delete m_DllThunkHeap; -} - - -// Self-initializing accessor for m_DllThunkHeap -LoaderHeap *PEImage::IJWFixupData::GetThunkHeap() -{ - CONTRACT (LoaderHeap *) - { - INSTANCE_CHECK; - THROWS; - GC_NOTRIGGER; - MODE_ANY; - INJECT_FAULT(COMPlusThrowOM()); - POSTCONDITION(CheckPointer(RETVAL)); - } - CONTRACT_END - - if (!m_DllThunkHeap) - { - size_t * pPrivatePCLBytes = NULL; - size_t * pGlobalPCLBytes = NULL; - -#ifdef PROFILING_SUPPORTED - pPrivatePCLBytes = &(GetPerfCounters().m_Loading.cbLoaderHeapSize); -#endif - - LoaderHeap *pNewHeap = new LoaderHeap(VIRTUAL_ALLOC_RESERVE_GRANULARITY, // DWORD dwReserveBlockSize - 0, // DWORD dwCommitBlockSize - pPrivatePCLBytes, - ThunkHeapStubManager::g_pManager->GetRangeList(), - TRUE); // BOOL fMakeExecutable - - if (FastInterlockCompareExchangePointer((PVOID*)&m_DllThunkHeap, (VOID*)pNewHeap, (VOID*)0) != 0) - { - delete pNewHeap; - } - } - - RETURN m_DllThunkHeap; -} - -void PEImage::IJWFixupData::MarkMethodFixedUp(COUNT_T iFixup, COUNT_T iMethod) -{ - LIMITED_METHOD_CONTRACT; - // supports only sequential fixup/method - _ASSERTE( (iFixup == m_iNextFixup+1 && iMethod ==0) || //first method of the next fixup or - (iFixup == m_iNextFixup && iMethod == m_iNextMethod) ); //the method that was next to fixup - - m_iNextFixup = iFixup; - m_iNextMethod = iMethod+1; -} - -BOOL PEImage::IJWFixupData::IsMethodFixedUp(COUNT_T iFixup, COUNT_T iMethod) -{ - LIMITED_METHOD_CONTRACT; - if (iFixup < m_iNextFixup) - return TRUE; - if (iFixup > m_iNextFixup) - return FALSE; - if (iMethod < m_iNextMethod) - return TRUE; - - return FALSE; -} - -/*static */ -PTR_LoaderHeap PEImage::GetDllThunkHeap(void *pBase) -{ - CONTRACTL - { - THROWS; - GC_TRIGGERS; - MODE_ANY; - } - CONTRACTL_END; - return GetIJWData(pBase)->GetThunkHeap(); -} - -/* static */ -PEImage::IJWFixupData *PEImage::GetIJWData(void *pBase) -{ - CONTRACTL { - THROWS; - GC_TRIGGERS; - MODE_ANY; - INJECT_FAULT(COMPlusThrowOM();); - } CONTRACTL_END - - // Take the IJW hash lock - CrstHolder hashLockHolder(&s_ijwHashLock); - - // Try to find the data - IJWFixupData *pData = (IJWFixupData *)s_ijwFixupDataHash->LookupValue((UPTR) pBase, pBase); - - // No data, must create - if ((UPTR)pData == (UPTR)INVALIDENTRY) - { - pData = new IJWFixupData(pBase); - s_ijwFixupDataHash->InsertValue((UPTR) pBase, pData); - } - - // Return the new data - return (pData); -} - -/* static */ -void PEImage::UnloadIJWModule(void *pBase) -{ - CONTRACTL { - NOTHROW; - GC_TRIGGERS; - MODE_ANY; - } CONTRACTL_END - - // Take the IJW hash lock - CrstHolder hashLockHolder(&s_ijwHashLock); - - // Try to delete the hash entry - IJWFixupData *pData = (IJWFixupData *)s_ijwFixupDataHash->DeleteValue((UPTR) pBase, pBase); - - // Now delete the data - if ((UPTR)pData != (UPTR)INVALIDENTRY) - delete pData; - -} - -#endif // FEATURE_MIXEDMODE && !CROSSGEN_COMPILE - -#ifdef FEATURE_FUSION -void PEImage::Init(IStream* pIStream, UINT64 uAsmStreamId, - DWORD dwModuleId, BOOL resourceFile) -{ - CONTRACT_VOID - { - CONSTRUCTOR_CHECK; - PRECONDITION(CheckStartup()); - STANDARD_VM_CHECK; - } - CONTRACT_END; - - m_StreamAsmId = uAsmStreamId; - m_dwStreamModuleId = dwModuleId; - m_fIsIStream = TRUE; - - LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat stream\n")); - - if (!pIStream) - ThrowHR(COR_E_FILELOAD); - - // Just copy bytes. - - PEImageLayoutHolder pFlatLayout(PEImageLayout::CreateFromStream(pIStream, this)); - - if (!resourceFile) { - if (!pFlatLayout->CheckCORFormat()) - ThrowFormat(COR_E_BADIMAGEFORMAT); - - if (!CheckLayoutFormat(pFlatLayout)) - ThrowHR(COR_E_NOTSUPPORTED); - } - - pFlatLayout.SuppressRelease(); - SetLayout(IMAGE_FLAT, pFlatLayout); - - RETURN; -} -#endif // FEATURE_FUSION #endif // #ifndef DACCESS_COMPILE @@ -1407,7 +808,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags) m_pLayouts[IMAGE_MAPPED]->EnumMemoryRegions(flags); if (m_pLayouts[IMAGE_LOADED].IsValid() && m_pLayouts[IMAGE_LOADED]!=NULL) m_pLayouts[IMAGE_LOADED]->EnumMemoryRegions(flags); - if (m_pLayouts[IMAGE_LOADED_FOR_INTROSPECTION].IsValid() && m_pLayouts[IMAGE_LOADED]!=NULL) + if (m_pLayouts[IMAGE_LOADED_FOR_INTROSPECTION].IsValid() && m_pLayouts[IMAGE_LOADED_FOR_INTROSPECTION]!=NULL) m_pLayouts[IMAGE_LOADED_FOR_INTROSPECTION]->EnumMemoryRegions(flags); } @@ -1419,34 +820,20 @@ PEImage::PEImage(): m_bIsTrustedNativeImage(FALSE), m_bIsNativeImageInstall(FALSE), m_bPassiveDomainOnly(FALSE), -#ifndef FEATURE_CORECLR - m_fReportedToUsageLog(FALSE), -#endif // !FEATURE_CORECLR m_bInHashMap(FALSE), #ifdef METADATATRACKER_DATA m_pMDTracker(NULL), #endif // METADATATRACKER_DATA m_pMDImport(NULL), m_pNativeMDImport(NULL), -#ifdef FEATURE_FUSION - m_StreamAsmId(0), - m_dwStreamModuleId(0), - m_fIsIStream(FALSE), -#endif m_hFile(INVALID_HANDLE_VALUE), m_bOwnHandle(true), m_bSignatureInfoCached(FALSE), m_hrSignatureInfoStatus(E_UNEXPECTED), m_dwSignatureInfo(0), -#ifdef FEATURE_FUSION - m_pILFingerprint(NULL), -#endif //FEATURE_FUSION m_dwPEKind(0), m_dwMachine(0), m_fCachedKindAndMachine(FALSE) -#ifdef FEATURE_APTCA - , m_fMayBeConditionalAptca(TRUE) -#endif // FEATURE_APTCA #ifdef FEATURE_LAZY_COW_PAGES ,m_bAllocatedLazyCOWPages(FALSE) #endif // FEATURE_LAZY_COW_PAGES @@ -1526,34 +913,12 @@ PTR_PEImageLayout PEImage::GetLayoutInternal(DWORD imageLayoutMask,DWORD flags) { PEImageLayout * pLoadLayout = NULL; -#ifdef FEATURE_CORECLR if (m_bIsTrustedNativeImage || IsFile()) { // For CoreCLR, try to load all files via LoadLibrary first. If LoadLibrary did not work, retry using // regular mapping - but not for native images. pLoadLayout = PEImageLayout::Load(this, TRUE /* bNTSafeLoad */, m_bIsTrustedNativeImage /* bThrowOnError */); } -#else - if (m_bIsTrustedNativeImage) - { - pLoadLayout = PEImageLayout::Load(this, FALSE); - } - else if (m_bIsNativeImageInstall) - { - // When ESB (extended secure boot) is enabled, a native image that is being installed can - // only be loaded flat. - PEImageLayout* pFlatLayout=PEImageLayout::LoadFlat(GetFileHandle(),this); - SetLayout(IMAGE_FLAT,pFlatLayout); - pLoadLayout = new ConvertedImageLayout(pFlatLayout); - } -#ifdef FEATURE_READYTORUN - else if (ReadyToRunInfo::IsReadyToRunEnabled() && IsFile()) - { - pLoadLayout = PEImageLayout::Load(this, FALSE, FALSE); - } -#endif // FEATURE_READYTORUN - -#endif // FEATURE_CORECLR if (pLoadLayout != NULL) { @@ -1572,46 +937,9 @@ PTR_PEImageLayout PEImage::GetLayoutInternal(DWORD imageLayoutMask,DWORD flags) // since LoadLibrary is needed if we are to actually load code. if (pLayout->HasCorHeader() && pLayout->IsILOnly()) { -#ifdef FEATURE_CORECLR // For CoreCLR, IL only images will always be mapped. We also dont bother doing the conversion of PE header on 64bit, // as done below for the desktop case, as there is no appcompat burden for CoreCLR on 64bit to have that conversion done. fMarkAnyCpuImageAsLoaded = true; -#else // !FEATURE_CORECLR - -#ifdef _WIN64 - // When attempting to load an assembly using LoadLibrary on x64, - // the execution will go via the shell-shim that will try to determine - // if the assembly is ILOnly with Pe32 header (i.e. built as anycpu). If it is, - // it will convert the in-memory PEheader of the image to be PE32+ (i.e. mark it as 64bit image). - // - // Since we are trying to avoid mapping twice for ILOnly images by simply memory mapping them, - // we should emulate the shell-shim behaviour for 64bit. This will allow inproc-components (e.g. ASP.NET), - // which check for Pe32+ header, to continue working as expected. - // - // If we fail for some reason to change the header, in retail build, we will simply fallback to the double-loading behaviour without - // any functional problems. - if (pLayout->Has32BitNTHeaders()) - { - fMarkAnyCpuImageAsLoaded = pLayout->ConvertILOnlyPE32ToPE64(); - } - else - { - // Before assuming that PE32+ file can be loaded, confirm that - // it is the expected machine type. This will ensure AMD64 does not load ARM64 or IA64 assemblies (and likewise). - // If the machine type does not match, the Loader will fail the load at a later point. - if (pLayout->GetMachine() == IMAGE_FILE_MACHINE_NATIVE) - { - fMarkAnyCpuImageAsLoaded = true; // PE32+ (aka native 64bit) binaries dont require any extra processing. - } - } -#else // !_WIN64 - // Why can we not blindly assume that on 32bit OS, image should always be loaded? This is because it is possible to load - // PE32+ image and map it to the 32bit process in WOW64. - if (pLayout->Has32BitNTHeaders()) - fMarkAnyCpuImageAsLoaded = true; -#endif // _WIN64 - -#endif // FEATURE_CORECLR } pLayout.SuppressRelease(); @@ -1636,9 +964,6 @@ PTR_PEImageLayout PEImage::GetLayoutInternal(DWORD imageLayoutMask,DWORD flags) else if (imageLayoutMask&PEImageLayout::LAYOUT_FLAT) { -#ifdef FEATURE_FUSION - _ASSERTE(!m_fIsIStream); //images created from streams should always have this one -#endif pRetVal=PEImageLayout::LoadFlat(GetFileHandle(),this); m_pLayouts[IMAGE_FLAT]=pRetVal; } @@ -1720,36 +1045,8 @@ void PEImage::Load() } else { -#ifdef FEATURE_CORECLR if(m_pLayouts[IMAGE_LOADED]==NULL) SetLayout(IMAGE_LOADED,PEImageLayout::Load(this,TRUE)); -#else - - //as part of Load() call we may initialize loaded image in DllMain - //so we have to leave the lock and be prepared that when PEImageLayout::Load returns - //m_pLayouts[IMAGE_LOADED] is set to something else - lock.Release(); - - FileHandleHolder pProtect=GetProtectingFileHandle(FALSE); - - // if the image is IL-only, try to load it in the safe manner - - // using the Internal function here because we are under the writer lock - PEImageLayoutHolder pLayout=GetLayoutInternal(PEImageLayout::LAYOUT_ANY,0); - BOOL bPreferSafeLoad=(pLayout && pLayout->IsILOnly()); - - // Always use safe load during NGen to avoid running unmanaged code in IJW assemblies - if (IsCompilationProcess()) - bPreferSafeLoad = TRUE; - - PEImageLayoutHolder pLoaded(PEImageLayout::Load(this,bPreferSafeLoad)); - - lock.Acquire(); - - if(m_pLayouts[IMAGE_LOADED]==NULL) - SetLayout(IMAGE_LOADED,pLoaded.Extract()); - -#endif // FEATURE_CORECLR } } @@ -1867,38 +1164,6 @@ LPCWSTR PEImage::GetPathForErrorMessages() return m_path; } -#ifdef FEATURE_FUSION -PEKIND PEImage::GetFusionProcessorArchitecture() -{ - CONTRACTL - { - THROWS; - GC_TRIGGERS; - MODE_ANY; - } - CONTRACTL_END; - - DWORD dwPEKind, dwMachine; - GetPEKindAndMachine(&dwPEKind, &dwMachine); - - DWORD dwAssemblyFlags = 0; - - IfFailThrow(m_pMDImport->GetAssemblyProps(TokenFromRid(1, mdtAssembly), - NULL, NULL, NULL, - NULL, NULL, &dwAssemblyFlags)); - - PEKIND retval; - if (FAILED(TranslatePEToArchitectureType( - (CorPEKind)dwPEKind, - dwMachine, - dwAssemblyFlags, - &retval))) - { - return peInvalid; - } - return retval; -} -#endif //FEATURE_FUSION HANDLE PEImage::GetFileHandle() { @@ -2040,67 +1305,6 @@ BOOL PEImage::IsPtrInImage(PTR_CVOID data) return FALSE; } -#ifdef FEATURE_FUSION -#ifndef DACCESS_COMPILE -HRESULT PEImage::GetILFingerprint(IILFingerprint **ppFingerprint) -{ - CONTRACTL - { - NOTHROW; - GC_TRIGGERS; - } - CONTRACTL_END; - *ppFingerprint = NULL; - if (m_pILFingerprint == NULL) - { - HRESULT hr = S_OK; - NewHolder<PEFingerprint> pNewFingerprint; - EX_TRY - { - pNewFingerprint = PEFingerprint::CreatePEFingerprint(this); - hr = S_OK; - } - EX_CATCH_HRESULT(hr); - if (FAILED(hr)) - { - return hr; - } - - if (InterlockedCompareExchangeT(&m_pILFingerprint, (PEFingerprint*)(pNewFingerprint.GetValue()), NULL) == NULL) - { - pNewFingerprint.SuppressRelease(); // Won the race - } - } - - *ppFingerprint = m_pILFingerprint; - (*ppFingerprint)->AddRef(); - return S_OK; -} - -// NOTE: Performance critical codepaths should cache the result of this function. -HRESULT RuntimeGetILFingerprintForPath(LPCWSTR path, IILFingerprint **ppFingerprint) -{ - CONTRACTL - { - NOTHROW; - GC_TRIGGERS; - } - CONTRACTL_END; - - HRESULT hr; - HCORMODULE hCorModule; - IfFailGo(RuntimeOpenImageInternal(path, &hCorModule, NULL, MDInternalImport_NoCache)); - { - ReleaseHolder<PEImage> peImage((PEImage*)hCorModule); - IfFailGo(peImage->GetILFingerprint(ppFingerprint)); - } - hr = S_OK; - ErrExit: - return hr; -} - -#endif //!DACCESS_COMPILE -#endif //FEATURE_FUSION #if !defined(DACCESS_COMPILE) PEImage * PEImage::OpenImage( @@ -2136,18 +1340,6 @@ PEImage * PEImage::OpenImage( pPEImage = PEImage::LoadImage(hMod); } #endif // !FEATURE_PAL -#ifdef FEATURE_FUSION - else if (iidResource == __uuidof(ICLRPrivResourceStream)) - { - ReleaseHolder<ICLRPrivResourceStream> pIResourceStream; - IfFailThrow(pIResource->QueryInterface(__uuidof(ICLRPrivResourceStream), (LPVOID*)&pIResourceStream)); - ReleaseHolder<IStream> pStream; - IfFailThrow(pIResourceStream->GetStream(__uuidof(IStream), (LPVOID*)&pStream)); - UINT64 i64AssemblyId = static_cast<UINT64>(reinterpret_cast<UINT_PTR>(reinterpret_cast<ICLRPrivAssembly*>(pIResource))); - DWORD dwModuleId = static_cast<DWORD>(i64AssemblyId); - pPEImage = PEImage::OpenImage(pStream, i64AssemblyId, FALSE, dwModuleId, flags); - } -#endif else { ThrowHR(COR_E_BADIMAGEFORMAT); |