//******************************************************************************* // Helper: Set the specified attributes on the given ManifestResource token. //******************************************************************************* HRESULT RegMeta::_SetManifestResourceProps(// S_OK or error. mdManifestResource mr, // [IN] ManifestResource token. mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the resource. DWORD dwOffset, // [IN] Offset to the beginning of the resource within the file. DWORD dwResourceFlags) // [IN] Flags. { ManifestResourceRec *pRecord = NULL; HRESULT hr = S_OK; IfFailGo(m_pStgdb->m_MiniMd.GetManifestResourceRecord(RidFromToken(mr), &pRecord)); // Set the attributes. if (tkImplementation != mdTokenNil) IfFailGo(m_pStgdb->m_MiniMd.PutToken(TBL_ManifestResource, ManifestResourceRec::COL_Implementation, pRecord, tkImplementation)); if (dwOffset != ULONG_MAX) pRecord->SetOffset(dwOffset); if (dwResourceFlags != ULONG_MAX) pRecord->SetFlags(dwResourceFlags); IfFailGo(UpdateENCLog(mr)); ErrExit: return hr; } // RegMeta::_SetManifestResourceProps
//******************************************************************************* // Helper: Set the specified attributes on the given ExportedType token. //******************************************************************************* HRESULT RegMeta::_SetExportedTypeProps( // S_OK or error. mdExportedType ct, // [IN] ExportedType token. mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the ExportedType. mdTypeDef tkTypeDef, // [IN] TypeDef token within the file. DWORD dwExportedTypeFlags) // [IN] Flags. { ExportedTypeRec *pRecord; HRESULT hr = S_OK; IfFailGo(m_pStgdb->m_MiniMd.GetExportedTypeRecord(RidFromToken(ct), &pRecord)); if(! IsNilToken(tkImplementation)) IfFailGo(m_pStgdb->m_MiniMd.PutToken(TBL_ExportedType, ExportedTypeRec::COL_Implementation, pRecord, tkImplementation)); if (! IsNilToken(tkTypeDef)) { _ASSERTE(TypeFromToken(tkTypeDef) == mdtTypeDef); pRecord->SetTypeDefId(tkTypeDef); } if (dwExportedTypeFlags != ULONG_MAX) pRecord->SetFlags(dwExportedTypeFlags); IfFailGo(UpdateENCLog(ct)); ErrExit: return hr; } // RegMeta::_SetExportedTypeProps
//******************************************************************************* // Helper: Set the specified attributes on the given AssemblyRef token. //******************************************************************************* HRESULT RegMeta::_SetAssemblyRefProps( // S_OK or error. mdAssemblyRef ar, // [IN] AssemblyRefToken. const void *pbPublicKeyOrToken, // [IN] Public key or token of the assembly. ULONG cbPublicKeyOrToken, // [IN] Count of bytes in the public key or token. LPCWSTR szName, // [IN] Name of the assembly being referenced. const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData. const void *pbHashValue, // [IN] Hash Blob. ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob. DWORD dwAssemblyRefFlags) // [IN] Flags. { AssemblyRefRec *pRecord; HRESULT hr = S_OK; IfFailGo(m_pStgdb->m_MiniMd.GetAssemblyRefRecord(RidFromToken(ar), &pRecord)); if (pbPublicKeyOrToken) IfFailGo(m_pStgdb->m_MiniMd.PutBlob(TBL_AssemblyRef, AssemblyRefRec::COL_PublicKeyOrToken, pRecord, pbPublicKeyOrToken, cbPublicKeyOrToken)); if (szName) IfFailGo(m_pStgdb->m_MiniMd.PutStringW(TBL_AssemblyRef, AssemblyRefRec::COL_Name, pRecord, szName)); if (pMetaData) { if (pMetaData->usMajorVersion != USHRT_MAX) pRecord->SetMajorVersion(pMetaData->usMajorVersion); if (pMetaData->usMinorVersion != USHRT_MAX) pRecord->SetMinorVersion(pMetaData->usMinorVersion); if (pMetaData->usBuildNumber != USHRT_MAX) pRecord->SetBuildNumber(pMetaData->usBuildNumber); if (pMetaData->usRevisionNumber != USHRT_MAX) pRecord->SetRevisionNumber(pMetaData->usRevisionNumber); if (pMetaData->szLocale) IfFailGo(m_pStgdb->m_MiniMd.PutStringW(TBL_AssemblyRef, AssemblyRefRec::COL_Locale, pRecord, pMetaData->szLocale)); } if (pbHashValue) IfFailGo(m_pStgdb->m_MiniMd.PutBlob(TBL_AssemblyRef, AssemblyRefRec::COL_HashValue, pRecord, pbHashValue, cbHashValue)); if (dwAssemblyRefFlags != ULONG_MAX) pRecord->SetFlags(PrepareForSaving(dwAssemblyRefFlags)); IfFailGo(UpdateENCLog(ar)); ErrExit: return hr; } // RegMeta::_SetAssemblyRefProps
//******************************************************************************* // Helper: Set the specified attributes on the given Assembly token. //******************************************************************************* HRESULT RegMeta::_SetAssemblyProps( // S_OK or error. mdAssembly ma, // [IN] Assembly token. const void *pbPublicKey, // [IN] Originator of the assembly. ULONG cbPublicKey, // [IN] Count of bytes in the Originator blob. ULONG ulHashAlgId, // [IN] Hash Algorithm. LPCWSTR szName, // [IN] Name of the assembly. const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData. DWORD dwAssemblyFlags) // [IN] Flags. { AssemblyRec *pRecord = NULL; // The assembly record. HRESULT hr = S_OK; IfFailGo(m_pStgdb->m_MiniMd.GetAssemblyRecord(RidFromToken(ma), &pRecord)); // Set the data. if (pbPublicKey) IfFailGo(m_pStgdb->m_MiniMd.PutBlob(TBL_Assembly, AssemblyRec::COL_PublicKey, pRecord, pbPublicKey, cbPublicKey)); if (ulHashAlgId != ULONG_MAX) pRecord->SetHashAlgId(ulHashAlgId); IfFailGo(m_pStgdb->m_MiniMd.PutStringW(TBL_Assembly, AssemblyRec::COL_Name, pRecord, szName)); if (pMetaData->usMajorVersion != USHRT_MAX) pRecord->SetMajorVersion(pMetaData->usMajorVersion); if (pMetaData->usMinorVersion != USHRT_MAX) pRecord->SetMinorVersion(pMetaData->usMinorVersion); if (pMetaData->usBuildNumber != USHRT_MAX) pRecord->SetBuildNumber(pMetaData->usBuildNumber); if (pMetaData->usRevisionNumber != USHRT_MAX) pRecord->SetRevisionNumber(pMetaData->usRevisionNumber); if (pMetaData->szLocale) IfFailGo(m_pStgdb->m_MiniMd.PutStringW(TBL_Assembly, AssemblyRec::COL_Locale, pRecord, pMetaData->szLocale)); dwAssemblyFlags = (dwAssemblyFlags & ~afPublicKey) | (cbPublicKey ? afPublicKey : 0); pRecord->SetFlags(dwAssemblyFlags); IfFailGo(UpdateENCLog(ma)); ErrExit: return hr; } // HRESULT RegMeta::_SetAssemblyProps()
//******************************************************************************* // Helper: Set the specified attributes on the given File token. //******************************************************************************* HRESULT RegMeta::_SetFileProps( // S_OK or error. mdFile file, // [IN] File token. const void *pbHashValue, // [IN] Hash Blob. ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob. DWORD dwFileFlags) // [IN] Flags. { FileRec *pRecord; HRESULT hr = S_OK; IfFailGo(m_pStgdb->m_MiniMd.GetFileRecord(RidFromToken(file), &pRecord)); if (pbHashValue) IfFailGo(m_pStgdb->m_MiniMd.PutBlob(TBL_File, FileRec::COL_HashValue, pRecord, pbHashValue, cbHashValue)); if (dwFileFlags != ULONG_MAX) pRecord->SetFlags(dwFileFlags); IfFailGo(UpdateENCLog(file)); ErrExit: return hr; } // RegMeta::_SetFileProps
//******************************************************************************* // helper to add a declarative security blob to a class or method // // Implements internal API code:IMetaDataEmitHelper::AddDeclarativeSecurityHelper. //******************************************************************************* STDMETHODIMP RegMeta::AddDeclarativeSecurityHelper( mdToken tk, // [IN] Parent token (typedef/methoddef) DWORD dwAction, // [IN] Security action (CorDeclSecurity) void const *pValue, // [IN] Permission set blob DWORD cbValue, // [IN] Byte count of permission set blob mdPermission*pmdPermission) // [OUT] Output permission token { HRESULT hr = S_OK; DeclSecurityRec *pDeclSec = NULL; RID iDeclSec; short sAction = static_cast<short>(dwAction); mdPermission tkPerm; LOG((LOGMD, "MD RegMeta::AddDeclarativeSecurityHelper(0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n", tk, dwAction, pValue, cbValue, pmdPermission)); LOCKWRITE(); IfFailGo(m_pStgdb->m_MiniMd.PreUpdate()); _ASSERTE(TypeFromToken(tk) == mdtTypeDef || TypeFromToken(tk) == mdtMethodDef || TypeFromToken(tk) == mdtAssembly); // Check for valid Action. if (sAction == 0 || sAction > dclMaximumValue) IfFailGo(E_INVALIDARG); if (CheckDups(MDDupPermission)) { hr = ImportHelper::FindPermission(&(m_pStgdb->m_MiniMd), tk, sAction, &tkPerm); if (SUCCEEDED(hr)) { // Set output parameter. if (pmdPermission) *pmdPermission = tkPerm; if (IsENCOn()) IfFailGo(m_pStgdb->m_MiniMd.GetDeclSecurityRecord(RidFromToken(tkPerm), &pDeclSec)); else { hr = META_S_DUPLICATE; goto ErrExit; } } else if (hr != CLDB_E_RECORD_NOTFOUND) IfFailGo(hr); } // Create a new record. if (!pDeclSec) { IfFailGo(m_pStgdb->m_MiniMd.AddDeclSecurityRecord(&pDeclSec, &iDeclSec)); tkPerm = TokenFromRid(iDeclSec, mdtPermission); // Set output parameter. if (pmdPermission) *pmdPermission = tkPerm; // Save parent and action information. IfFailGo(m_pStgdb->m_MiniMd.PutToken(TBL_DeclSecurity, DeclSecurityRec::COL_Parent, pDeclSec, tk)); pDeclSec->SetAction(sAction); // Turn on the internal security flag on the parent. if (TypeFromToken(tk) == mdtTypeDef) IfFailGo(_TurnInternalFlagsOn(tk, tdHasSecurity)); else if (TypeFromToken(tk) == mdtMethodDef) IfFailGo(_TurnInternalFlagsOn(tk, mdHasSecurity)); IfFailGo(UpdateENCLog(tk)); } // Write the blob into the record. IfFailGo(m_pStgdb->m_MiniMd.PutBlob(TBL_DeclSecurity, DeclSecurityRec::COL_PermissionSet, pDeclSec, pValue, cbValue)); IfFailGo(UpdateENCLog(tkPerm)); ErrExit: return hr; } // RegMeta::AddDeclarativeSecurityHelper