//***************************************************************************** // GetMDInternalInterface. // This function will check the metadata section and determine if it should // return an interface which implements ReadOnly or ReadWrite. //***************************************************************************** STDAPI GetMDInternalInterface( LPVOID pData, ULONG cbData, DWORD flags, // [IN] ofRead or ofWrite. REFIID riid, // [in] The interface desired. void **ppIUnk) // [out] Return interface on success. { HRESULT hr = NOERROR; MDInternalRO *pInternalRO = NULL; IMDCommon *pInternalROMDCommon = NULL; MDFileFormat format; BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); if (ppIUnk == NULL) IfFailGo(E_INVALIDARG); // Determine the file format we're trying to read. IfFailGo( CheckFileFormat(pData, cbData, &format) ); // Found a fully-compressed, read-only format. if ( format == MDFormat_ReadOnly ) { pInternalRO = new (nothrow) MDInternalRO; IfNullGo( pInternalRO ); IfFailGo( pInternalRO->Init(const_cast<void*>(pData), cbData) ); #ifdef FEATURE_COMINTEROP IfFailGo(pInternalRO->QueryInterface(IID_IMDCommon, (void**)&pInternalROMDCommon)); IfFailGo( (flags & ofNoTransform) ? S_FALSE : CheckIfWinMDAdapterNeeded(pInternalROMDCommon)); if (hr == S_OK) { IfFailGo(CreateWinMDInternalImportRO(pInternalROMDCommon, riid, (void**)ppIUnk)); } else #endif // FEATURE_COMINTEROP { IfFailGo(pInternalRO->QueryInterface(riid, ppIUnk)); } } else { // Found a not-fully-compressed, ENC format. _ASSERTE( format == MDFormat_ReadWrite ); IfFailGo( GetInternalWithRWFormat( pData, cbData, flags, riid, ppIUnk ) ); } ErrExit: // clean up if ( pInternalRO ) pInternalRO->Release(); if ( pInternalROMDCommon ) pInternalROMDCommon->Release(); END_SO_INTOLERANT_CODE; return hr; } // GetMDInternalInterface
//***************************************************************************** // translating signature from one scope to another scope // // Implements public API code:IMetaDataEmit::TranslateSigWithScope. // Implements internal API code:IMetaDataHelper::TranslateSigWithScope. //***************************************************************************** STDMETHODIMP RegMeta::TranslateSigWithScope( // S_OK or error. IMetaDataAssemblyImport *pAssemImport, // [IN] importing assembly interface const void *pbHashValue, // [IN] Hash Blob for Assembly. ULONG cbHashValue, // [IN] Count of bytes. IMetaDataImport *pImport, // [IN] importing interface PCCOR_SIGNATURE pbSigBlob, // [IN] signature in the importing scope ULONG cbSigBlob, // [IN] count of bytes of signature IMetaDataAssemblyEmit *pAssemEmit,// [IN] emit assembly interface IMetaDataEmit *pEmit, // [IN] emit interface PCOR_SIGNATURE pvTranslatedSig, // [OUT] buffer to hold translated signature ULONG cbTranslatedSigMax, ULONG *pcbTranslatedSig) // [OUT] count of bytes in the translated signature { #ifdef FEATURE_METADATA_EMIT HRESULT hr = S_OK; IMDCommon *pAssemImportMDCommon = NULL; IMDCommon *pImportMDCommon = NULL; BEGIN_ENTRYPOINT_NOTHROW; RegMeta *pRegMetaAssemEmit = static_cast<RegMeta*>(pAssemEmit); RegMeta *pRegMetaEmit = NULL; CQuickBytes qkSigEmit; ULONG cbEmit; pRegMetaEmit = static_cast<RegMeta*>(pEmit); { // This function can cause new TypeRef being introduced. LOCKWRITE(); IfFailGo(m_pStgdb->m_MiniMd.PreUpdate()); _ASSERTE(pvTranslatedSig && pcbTranslatedSig); if (pAssemImport) { IfFailGo(pAssemImport->QueryInterface(IID_IMDCommon, (void**)&pAssemImportMDCommon)); } IMetaModelCommon *pAssemImportMetaModelCommon = pAssemImportMDCommon ? pAssemImportMDCommon->GetMetaModelCommon() : 0; IfFailGo(pImport->QueryInterface(IID_IMDCommon, (void**)&pImportMDCommon)); IMetaModelCommon *pImportMetaModelCommon = pImportMDCommon->GetMetaModelCommon(); IfFailGo( ImportHelper::MergeUpdateTokenInSig( // S_OK or error. pRegMetaAssemEmit ? &(pRegMetaAssemEmit->m_pStgdb->m_MiniMd) : 0, // The assembly emit scope. &(pRegMetaEmit->m_pStgdb->m_MiniMd), // The emit scope. pAssemImportMetaModelCommon, // Assembly where the signature is from. pbHashValue, // Hash value for the import assembly. cbHashValue, // Size in bytes. pImportMetaModelCommon, // The scope where signature is from. pbSigBlob, // signature from the imported scope NULL, // Internal OID mapping structure. &qkSigEmit, // [OUT] translated signature 0, // start from first byte of the signature 0, // don't care how many bytes consumed &cbEmit)); // [OUT] total number of bytes write to pqkSigEmit memcpy(pvTranslatedSig, qkSigEmit.Ptr(), cbEmit > cbTranslatedSigMax ? cbTranslatedSigMax :cbEmit ); *pcbTranslatedSig = cbEmit; if (cbEmit > cbTranslatedSigMax) hr = CLDB_S_TRUNCATION; } ErrExit: END_ENTRYPOINT_NOTHROW; if (pAssemImportMDCommon) pAssemImportMDCommon->Release(); if (pImportMDCommon) pImportMDCommon->Release(); return hr; #else //!FEATURE_METADATA_EMIT return E_NOTIMPL; #endif //!FEATURE_METADATA_EMIT } // RegMeta::TranslateSigWithScope