summaryrefslogtreecommitdiff
path: root/src/vm/peimage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/peimage.cpp')
-rw-r--r--src/vm/peimage.cpp810
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);