diff options
Diffstat (limited to 'src/vm/pefile.cpp')
-rw-r--r-- | src/vm/pefile.cpp | 402 |
1 files changed, 0 insertions, 402 deletions
diff --git a/src/vm/pefile.cpp b/src/vm/pefile.cpp index e322b26ddb..16c66b516d 100644 --- a/src/vm/pefile.cpp +++ b/src/vm/pefile.cpp @@ -1891,18 +1891,7 @@ BOOL PEFile::GetResource(LPCSTR szName, DWORD *cbResource, return TRUE; } -#ifdef FEATURE_MULTIMODULE_ASSEMBLIES - // The resource is either linked or embedded in a non-manifest-containing file - if (pDomainAssembly == NULL) - return FALSE; - - return pDomainAssembly->GetModuleResource(mdLinkRef, szName, cbResource, - pbInMemoryResource, szFileName, - dwLocation, IsMrPublic(dwResourceFlags), - pStackMark, fSkipSecurityCheck); -#else return FALSE; -#endif // FEATURE_MULTIMODULE_ASSEMBLIES default: ThrowHR(COR_E_BADIMAGEFORMAT, BFA_INVALID_TOKEN_IN_MANIFESTRES); @@ -2733,383 +2722,6 @@ HRESULT PEFile::GetVersion(USHORT *pMajor, USHORT *pMinor, USHORT *pBuild, USHOR return hr; } -#ifdef FEATURE_MULTIMODULE_ASSEMBLIES -// ================================================================================ -// PEModule class - a PEFile which represents a satellite module -// ================================================================================ - -PEModule::PEModule(PEImage *image, PEAssembly *assembly, mdFile token, IMetaDataEmit *pEmit) - : PEFile(image), - m_assembly(NULL), - m_token(token), - m_bIsResource(-1) -{ - CONTRACTL - { - PRECONDITION(CheckPointer(image, NULL_OK)); - PRECONDITION(CheckPointer(assembly)); - PRECONDITION(!IsNilToken(token)); - PRECONDITION(CheckPointer(pEmit, NULL_OK)); - PRECONDITION(image != NULL || pEmit != NULL); - CONSTRUCTOR_CHECK; - STANDARD_VM_CHECK; - } - CONTRACTL_END; - - DWORD flags; - - // get only the data which is required, here - flags - // this helps avoid unnecessary memory touches - IfFailThrow(assembly->GetPersistentMDImport()->GetFileProps(token, NULL, NULL, NULL, &flags)); - - if (image != NULL) - { - if (IsFfContainsMetaData(flags) && !image->CheckILFormat()) - ThrowHR(COR_E_BADIMAGEFORMAT); - - if (assembly->IsIStream()) - { - m_flags |= PEFILE_ISTREAM; -#ifdef FEATURE_PREJIT - m_fCanUseNativeImage = FALSE; -#endif - } - } - - assembly->AddRef(); - - m_assembly = assembly; - - m_flags |= PEFILE_MODULE; - if (assembly->IsSystem()) - { - m_flags |= PEFILE_SYSTEM; - } - else - { - if (assembly->IsIntrospectionOnly()) - { - m_flags |= PEFILE_INTROSPECTIONONLY; -#ifdef FEATURE_PREJIT - SetCannotUseNativeImage(); -#endif - } - } - - - // Verify module format. Note that some things have already happened: - // - Fusion has verified the name matches the metadata - // - PEimage has performed PE file format validation - - if (assembly->NeedsModuleHashChecks()) - { - ULONG size; - const void *hash; - IfFailThrow(assembly->GetPersistentMDImport()->GetFileProps(token, NULL, &hash, &size, NULL)); - - if (!CheckHash(assembly->GetHashAlgId(), hash, size)) - ThrowHR(COR_E_MODULE_HASH_CHECK_FAILED); - } - -#if defined(FEATURE_PREJIT) && !defined(CROSSGEN_COMPILE) - // Find the native image - if (IsFfContainsMetaData(flags) - && m_fCanUseNativeImage - && assembly->HasNativeImage() - && assembly->GetFusionAssembly() != NULL) - { - IAssemblyLocation *pIAssemblyLocation = assembly->GetNativeAssemblyLocation(); - - WCHAR wzPath[MAX_LONGPATH]; - WCHAR *pwzTemp = NULL; - DWORD dwCCPath = MAX_LONGPATH; - SString path; - SString moduleName(SString::Utf8, GetSimpleName()); - - // Compute the module path from the manifest module path - IfFailThrow(pIAssemblyLocation->GetPath(wzPath, &dwCCPath)); - pwzTemp = PathFindFileName(wzPath); - *pwzTemp = (WCHAR) 0x00; - - // <TODO>@todo: GetAppDomain????</TODO> - path.Set(wzPath); - path.Append((LPCWSTR) moduleName); - - SetNativeImage(path); - } -#endif // FEATURE_PREJIT && !CROSSGEN_COMPILE - -#if _DEBUG - GetCodeBaseOrName(m_debugName); - m_pDebugName = m_debugName; -#endif - - if (IsFfContainsMetaData(flags)) - { - if (image != NULL) - { - OpenMDImport_Unsafe(); //constructor. cannot race with anything - } - else - { - _ASSERTE(!m_bHasPersistentMDImport); - IfFailThrow(GetMetaDataInternalInterfaceFromPublic(pEmit, IID_IMDInternalImport, - (void **)&m_pMDImport)); - m_pEmitter = pEmit; - pEmit->AddRef(); - m_bHasPersistentMDImport=TRUE; - m_MDImportIsRW_Debugger_Use_Only = TRUE; - } - - // Fusion probably checks this, but we need to check this ourselves if - // this file didn't come from Fusion - if (!m_pMDImport->IsValidToken(m_pMDImport->GetModuleFromScope())) - COMPlusThrowHR(COR_E_BADIMAGEFORMAT); - } - else - { - // Go ahead and "load" image since it is essentially a noop, but will enable - // more operations on the module earlier in the loading process. - LoadLibrary(); - } -#ifdef FEATURE_PREJIT - if (IsResource() || IsDynamic()) - m_fCanUseNativeImage = FALSE; -#endif -} - -PEModule::~PEModule() -{ - CONTRACTL - { - DESTRUCTOR_CHECK; - NOTHROW; - MODE_ANY; - } - CONTRACTL_END; - - m_assembly->Release(); -} - -/* static */ -PEModule *PEModule::Open(PEAssembly *assembly, mdFile token, - const SString &fileName) -{ - STANDARD_VM_CONTRACT; - - PEModule *result = NULL; - - EX_TRY - { - result = DoOpen(assembly, token, fileName); - } - EX_HOOK - { - Exception *ex = GET_EXCEPTION(); - - // Rethrow non-transient exceptions as file load exceptions with proper - // context - - if (!ex->IsTransient()) - EEFileLoadException::Throw(fileName, ex->GetHR(), ex); - } - EX_END_HOOK; - - return result; -} -// Thread stress -class DoOpenPathStress : APIThreadStress -{ -public: - PEAssembly *assembly; - mdFile token; - const SString &fileName; - DoOpenPathStress(PEAssembly *assembly, mdFile token, - const SString &fileName) - : assembly(assembly), token(token), fileName(fileName) - { - WRAPPER_NO_CONTRACT; - fileName.Normalize(); - } - void Invoke() - { - WRAPPER_NO_CONTRACT; - PEModuleHolder result(PEModule::Open(assembly, token, fileName)); - } -}; - -/* static */ -PEModule *PEModule::DoOpen(PEAssembly *assembly, mdFile token, - const SString &fileName) -{ - CONTRACT(PEModule *) - { - PRECONDITION(CheckPointer(assembly)); - PRECONDITION(CheckValue(fileName)); - PRECONDITION(!IsNilToken(token)); - PRECONDITION(!fileName.IsEmpty()); - POSTCONDITION(CheckPointer(RETVAL)); - STANDARD_VM_CHECK; - } - CONTRACT_END; - - DoOpenPathStress ts(assembly, token, fileName); - - // If this is a resource module, we must explicitly request a flat mapping - DWORD flags; - IfFailThrow(assembly->GetPersistentMDImport()->GetFileProps(token, NULL, NULL, NULL, &flags)); - - PEImageHolder image; - { - image = PEImage::OpenImage(fileName); - } - - if (flags & ffContainsNoMetaData) - image->LoadNoMetaData(assembly->IsIntrospectionOnly()); - - PEModuleHolder module(new PEModule(image, assembly, token, NULL)); - - RETURN module.Extract(); -} - -/* static */ -PEModule *PEModule::OpenMemory(PEAssembly *assembly, mdFile token, - const void *flat, COUNT_T size) -{ - STANDARD_VM_CONTRACT; - - PEModule *result = NULL; - - EX_TRY - { - result = DoOpenMemory(assembly, token, flat, size); - } - EX_HOOK - { - Exception *ex = GET_EXCEPTION(); - - // Rethrow non-transient exceptions as file load exceptions with proper - // context - if (!ex->IsTransient()) - EEFileLoadException::Throw(assembly, flat, size, ex->GetHR(), ex); - } - EX_END_HOOK; - return result; -} - -// Thread stress -class DoOpenTokenStress : APIThreadStress -{ -public: - PEAssembly *assembly; - mdFile token; - const void *flat; - COUNT_T size; - DoOpenTokenStress(PEAssembly *assembly, mdFile token, - const void *flat, COUNT_T size) - : assembly(assembly), token(token), flat(flat), size(size) {LIMITED_METHOD_CONTRACT;} - void Invoke() - { - WRAPPER_NO_CONTRACT; - PEModuleHolder result(PEModule::OpenMemory(assembly, token, flat, size)); - } -}; - -// REVIEW: do we need to know the creator module which emitted the module (separately -// from the assembly parent) for security reasons? -/* static */ -PEModule *PEModule::DoOpenMemory(PEAssembly *assembly, mdFile token, - const void *flat, COUNT_T size) -{ - CONTRACT(PEModule *) - { - PRECONDITION(CheckPointer(assembly)); - PRECONDITION(!IsNilToken(token)); - PRECONDITION(CheckPointer(flat)); - POSTCONDITION(CheckPointer(RETVAL)); - THROWS; - GC_TRIGGERS; - MODE_ANY; - INJECT_FAULT(COMPlusThrowOM();); - } - CONTRACT_END; - - DoOpenTokenStress ts(assembly, token, flat, size); - - PEImageHolder image(PEImage::LoadFlat(flat, size)); - - RETURN new PEModule(image, assembly, token, NULL); -} - -/* static */ -PEModule *PEModule::Create(PEAssembly *assembly, mdFile token, IMetaDataEmit *pEmit) -{ - CONTRACT(PEModule *) - { - PRECONDITION(CheckPointer(assembly)); - PRECONDITION(!IsNilToken(token)); - STANDARD_VM_CHECK; - POSTCONDITION(CheckPointer(RETVAL)); - } - CONTRACT_END; - - RETURN new PEModule(NULL, assembly, token, pEmit); -} - -// ------------------------------------------------------------ -// Logging -// ------------------------------------------------------------ -#ifdef FEATURE_PREJIT -void PEModule::ExternalVLog(DWORD facility, DWORD level, const WCHAR *fmt, va_list args) -{ - CONTRACT_VOID - { - THROWS; - GC_TRIGGERS; - } - CONTRACT_END; - - m_assembly->ExternalVLog(facility, level, fmt, args); - - RETURN; -} - -void PEModule::FlushExternalLog() -{ - CONTRACT_VOID - { - THROWS; - GC_TRIGGERS; - } - CONTRACT_END; - - m_assembly->FlushExternalLog(); - - RETURN; -} - -// ------------------------------------------------------------ -// Loader support routines -// ------------------------------------------------------------ -void PEModule::SetNativeImage(const SString &fullPath) -{ - CONTRACTL - { - INSTANCE_CHECK; - PRECONDITION(CheckValue(fullPath)); - PRECONDITION(!fullPath.IsEmpty()); - STANDARD_VM_CHECK; - } - CONTRACTL_END; - - PEImageHolder image(PEImage::OpenImage(fullPath)); - image->Load(); - - PEFile::SetNativeImage(image); -} -#endif // FEATURE_PREJIT - -#endif // FEATURE_MULTIMODULE_ASSEMBLIES void PEFile::EnsureImageOpened() @@ -3174,20 +2786,6 @@ PEAssembly::EnumMemoryRegions(CLRDataEnumMemoryFlags flags) } } -#ifdef FEATURE_MULTIMODULE_ASSEMBLIES -void -PEModule::EnumMemoryRegions(CLRDataEnumMemoryFlags flags) -{ - WRAPPER_NO_CONTRACT; - - PEFile::EnumMemoryRegions(flags); - - if (m_assembly.IsValid()) - { - m_assembly->EnumMemoryRegions(flags); - } -} -#endif // FEATURE_MULTIMODULE_ASSEMBLIES #endif // #ifdef DACCESS_COMPILE |