diff options
Diffstat (limited to 'src/ToolBox/SOS/Strike/sos_md.h')
-rw-r--r-- | src/ToolBox/SOS/Strike/sos_md.h | 924 |
1 files changed, 0 insertions, 924 deletions
diff --git a/src/ToolBox/SOS/Strike/sos_md.h b/src/ToolBox/SOS/Strike/sos_md.h deleted file mode 100644 index a7cd30c3bc..0000000000 --- a/src/ToolBox/SOS/Strike/sos_md.h +++ /dev/null @@ -1,924 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -// ==++== -// - -// -// ==--== - -#ifndef __SOS_MD_H__ -#define __SOS_MD_H__ - -#define IfErrGoTo(s, label) { \ - hresult = (s); \ - if(FAILED(hresult)){ \ - goto label; }} - -class CQuickBytes; - -// TODO: Cleanup code to allow SOS to directly include the metadata header files. -//#include "MetaData.h" -//#include "corpriv.h" - -/* - * - * Metadata definitions needed for PrettyPrint functions. - * The original definitions for the types and interfaces below exist in - * inc\MetaData.h and inc\CorPriv.h - * TODO: - * Cleanup code to allow SOS to directly include the metadata header files. - * Currently it's extremely difficult due to symbol redefinitions. - * Always keep the definitions below in sync with the originals. - * NOTES: - * Since SOS runs in a native debugger session, since it does not use EnC, - * and in order to minimize the amount of duplication we changed the - * method definitions that deal with UTSemReadWrite* arguments to take - * void* arguments instead. - * Also, some of the interface methods take CQuickBytes as arguments. - * If these methods are ever used it becomes crucial to maintain binary - * compatibility b/w the CQuickBytes defined in SOS and the definition - * from the EE. - * - */ -typedef enum tagEnumType -{ - MDSimpleEnum = 0x0, // simple enumerator that doesn't allocate memory - MDDynamicArrayEnum = 0x2, // dynamic array that holds tokens - MDCustomEnum = 0x3, // Custom enumerator that doesnt work with the enum functions -} EnumType; - -struct HENUMInternal -{ - DWORD m_tkKind; // kind of tables that the enum is holding the result - ULONG m_ulCount; // count of total entries holding by the enumerator - - EnumType m_EnumType; - - struct { - ULONG m_ulStart; - ULONG m_ulEnd; - ULONG m_ulCur; - } u; - - // m_cursor will go away when we no longer support running EE with uncompressed - // format. WHEN WE REMOVE THIS, REMOVE ITS VESTIAGES FROM ZeroEnum as well - // - char m_cursor[32]; // cursor holding query result for read/write mode -}; - -typedef struct _MDDefaultValue -{ -#if DBG_TARGET_BIGENDIAN - _MDDefaultValue(void) - { - m_bType = ELEMENT_TYPE_END; - } - ~_MDDefaultValue(void) - { - if (m_bType == ELEMENT_TYPE_STRING) - { - delete[] m_wzValue; - } - } -#endif - - // type of default value - BYTE m_bType; // CorElementType for the default value - - // the default value - union - { - BOOL m_bValue; // ELEMENT_TYPE_BOOLEAN - CHAR m_cValue; // ELEMENT_TYPE_I1 - BYTE m_byteValue; // ELEMENT_TYPE_UI1 - SHORT m_sValue; // ELEMENT_TYPE_I2 - USHORT m_usValue; // ELEMENT_TYPE_UI2 - LONG m_lValue; // ELEMENT_TYPE_I4 - ULONG m_ulValue; // ELEMENT_TYPE_UI4 - LONGLONG m_llValue; // ELEMENT_TYPE_I8 - ULONGLONG m_ullValue; // ELEMENT_TYPE_UI8 - FLOAT m_fltValue; // ELEMENT_TYPE_R4 - DOUBLE m_dblValue; // ELEMENT_TYPE_R8 - LPCWSTR m_wzValue; // ELEMENT_TYPE_STRING - IUnknown *m_unkValue; // ELEMENT_TYPE_CLASS - }; - ULONG m_cbSize; // default value size (for blob) - -} MDDefaultValue; - -typedef struct -{ - RID m_ridFieldCur; // indexing to the field table - RID m_ridFieldEnd; // end index to field table -} MD_CLASS_LAYOUT; - -typedef struct -{ - USHORT usMajorVersion; // Major Version. - USHORT usMinorVersion; // Minor Version. - USHORT usBuildNumber; // Build Number. - USHORT usRevisionNumber; // Revision Number. - LPCSTR szLocale; // Locale. - DWORD *rProcessor; // Processor array. - ULONG ulProcessor; // [IN/OUT] Size of the processor array/Actual # of entries filled in. - OSINFO *rOS; // OSINFO array. - ULONG ulOS; // [IN/OUT]Size of the OSINFO array/Actual # of entries filled in. -} AssemblyMetaDataInternal; - -typedef struct -{ - mdMethodDef m_memberdef; - DWORD m_dwSemantics; -} ASSOCIATE_RECORD; - -typedef BOOL (*PSIGCOMPARE)(PCCOR_SIGNATURE, DWORD, PCCOR_SIGNATURE, DWORD, void*); - -EXTERN_GUID(IID_IMDInternalImport, 0xce0f34ed, 0xbbc6, 0x11d2, 0x94, 0x1e, 0x0, 0x0, 0xf8, 0x8, 0x34, 0x60); -#undef INTERFACE -#define INTERFACE IMDInternalImport -DECLARE_INTERFACE_(IMDInternalImport, IUnknown) -{ - //***************************************************************************** - // return the count of entries of a given kind in a scope - // For example, pass in mdtMethodDef will tell you how many MethodDef - // contained in a scope - //***************************************************************************** - STDMETHOD_(ULONG, GetCountWithTokenKind)(// return hresult - DWORD tkKind) PURE; // [IN] pass in the kind of token. - - //***************************************************************************** - // enumerator for typedef - //***************************************************************************** - STDMETHOD(EnumTypeDefInit)( // return hresult - HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data - - STDMETHOD_(ULONG, EnumTypeDefGetCount)( - HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information - - STDMETHOD_(void, EnumTypeDefReset)( - HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information - - STDMETHOD_(bool, EnumTypeDefNext)( // return hresult - HENUMInternal *phEnum, // [IN] input enum - mdTypeDef *ptd) PURE; // [OUT] return token - - STDMETHOD_(void, EnumTypeDefClose)( - HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information - - //***************************************************************************** - // enumerator for MethodImpl - //***************************************************************************** - STDMETHOD(EnumMethodImplInit)( // return hresult - mdTypeDef td, // [IN] TypeDef over which to scope the enumeration. - HENUMInternal *phEnumBody, // [OUT] buffer to fill for enumerator data for MethodBody tokens. - HENUMInternal *phEnumDecl) PURE; // [OUT] buffer to fill for enumerator data for MethodDecl tokens. - - STDMETHOD_(ULONG, EnumMethodImplGetCount)( - HENUMInternal *phEnumBody, // [IN] MethodBody enumerator. - HENUMInternal *phEnumDecl) PURE; // [IN] MethodDecl enumerator. - - STDMETHOD_(void, EnumMethodImplReset)( - HENUMInternal *phEnumBody, // [IN] MethodBody enumerator. - HENUMInternal *phEnumDecl) PURE; // [IN] MethodDecl enumerator. - - STDMETHOD(EnumMethodImplNext)( // return hresult (S_OK = TRUE, S_FALSE = FALSE or error code) - HENUMInternal *phEnumBody, // [IN] input enum for MethodBody - HENUMInternal *phEnumDecl, // [IN] input enum for MethodDecl - mdToken *ptkBody, // [OUT] return token for MethodBody - mdToken *ptkDecl) PURE; // [OUT] return token for MethodDecl - - STDMETHOD_(void, EnumMethodImplClose)( - HENUMInternal *phEnumBody, // [IN] MethodBody enumerator. - HENUMInternal *phEnumDecl) PURE; // [IN] MethodDecl enumerator. - - //***************************************** - // Enumerator helpers for memberdef, memberref, interfaceimp, - // event, property, exception, param - //***************************************** - - STDMETHOD(EnumGlobalFunctionsInit)( // return hresult - HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data - - STDMETHOD(EnumGlobalFieldsInit)( // return hresult - HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data - - STDMETHOD(EnumInit)( // return S_FALSE if record not found - DWORD tkKind, // [IN] which table to work on - mdToken tkParent, // [IN] token to scope the search - HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill - - STDMETHOD(EnumAllInit)( // return S_FALSE if record not found - DWORD tkKind, // [IN] which table to work on - HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill - - STDMETHOD_(bool, EnumNext)( - HENUMInternal *phEnum, // [IN] the enumerator to retrieve information - mdToken *ptk) PURE; // [OUT] token to scope the search - - STDMETHOD_(ULONG, EnumGetCount)( - HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information - - STDMETHOD_(void, EnumReset)( - HENUMInternal *phEnum) PURE; // [IN] the enumerator to be reset - - STDMETHOD_(void, EnumClose)( - HENUMInternal *phEnum) PURE; // [IN] the enumerator to be closed - - //***************************************** - // Enumerator helpers for declsecurity. - //***************************************** - STDMETHOD(EnumPermissionSetsInit)( // return S_FALSE if record not found - mdToken tkParent, // [IN] token to scope the search - CorDeclSecurity Action, // [IN] Action to scope the search - HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill - - //***************************************** - // Enumerator helpers for CustomAttribute - //***************************************** - STDMETHOD(EnumCustomAttributeByNameInit)(// return S_FALSE if record not found - mdToken tkParent, // [IN] token to scope the search - LPCSTR szName, // [IN] CustomAttribute's name to scope the search - HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill - - //***************************************** - // Nagivator helper to navigate back to the parent token given a token. - // For example, given a memberdef token, it will return the containing typedef. - // - // the mapping is as following: - // ---given child type---------parent type - // mdMethodDef mdTypeDef - // mdFieldDef mdTypeDef - // mdInterfaceImpl mdTypeDef - // mdParam mdMethodDef - // mdProperty mdTypeDef - // mdEvent mdTypeDef - // - //***************************************** - STDMETHOD(GetParentToken)( - mdToken tkChild, // [IN] given child token - mdToken *ptkParent) PURE; // [OUT] returning parent - - //***************************************** - // Custom value helpers - //***************************************** - STDMETHOD(GetCustomAttributeProps)( // S_OK or error. - mdCustomAttribute at, // [IN] The attribute. - mdToken *ptkType) PURE; // [OUT] Put attribute type here. - - STDMETHOD(GetCustomAttributeAsBlob)( - mdCustomAttribute cv, // [IN] given custom value token - void const **ppBlob, // [OUT] return the pointer to internal blob - ULONG *pcbSize) PURE; // [OUT] return the size of the blob - - // returned void in v1.0/v1.1 - STDMETHOD (GetScopeProps)( - LPCSTR *pszName, // [OUT] scope name - GUID *pmvid) PURE; // [OUT] version id - - // finding a particular method - STDMETHOD(FindMethodDef)( - mdTypeDef classdef, // [IN] given typedef - LPCSTR szName, // [IN] member name - PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of CLR signature - ULONG cbSigBlob, // [IN] count of bytes in the signature blob - mdMethodDef *pmd) PURE; // [OUT] matching memberdef - - // return a iSeq's param given a MethodDef - STDMETHOD(FindParamOfMethod)( // S_OK or error. - mdMethodDef md, // [IN] The owning method of the param. - ULONG iSeq, // [IN] The sequence # of the param. - mdParamDef *pparamdef) PURE; // [OUT] Put ParamDef token here. - - //***************************************** - // - // GetName* functions - // - //***************************************** - - // return the name and namespace of typedef - STDMETHOD(GetNameOfTypeDef)( - mdTypeDef classdef, // given classdef - LPCSTR *pszname, // return class name(unqualified) - LPCSTR *psznamespace) PURE; // return the name space name - - STDMETHOD(GetIsDualOfTypeDef)( - mdTypeDef classdef, // [IN] given classdef. - ULONG *pDual) PURE; // [OUT] return dual flag here. - - STDMETHOD(GetIfaceTypeOfTypeDef)( - mdTypeDef classdef, // [IN] given classdef. - ULONG *pIface) PURE; // [OUT] 0=dual, 1=vtable, 2=dispinterface - - // get the name of either methoddef - STDMETHOD(GetNameOfMethodDef)( // return the name of the memberdef in UTF8 - mdMethodDef md, // given memberdef - LPCSTR *pszName) PURE; - - STDMETHOD(GetNameAndSigOfMethodDef)( - mdMethodDef methoddef, // [IN] given memberdef - PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to a blob value of CLR signature - ULONG *pcbSigBlob, // [OUT] count of bytes in the signature blob - LPCSTR *pszName) PURE; - - // return the name of a FieldDef - STDMETHOD(GetNameOfFieldDef)( - mdFieldDef fd, // given memberdef - LPCSTR *pszName) PURE; - - // return the name of typeref - STDMETHOD(GetNameOfTypeRef)( - mdTypeRef classref, // [IN] given typeref - LPCSTR *psznamespace, // [OUT] return typeref name - LPCSTR *pszname) PURE; // [OUT] return typeref namespace - - // return the resolutionscope of typeref - STDMETHOD(GetResolutionScopeOfTypeRef)( - mdTypeRef classref, // given classref - mdToken *ptkResolutionScope) PURE; - - // Find the type token given the name. - STDMETHOD(FindTypeRefByName)( - LPCSTR szNamespace, // [IN] Namespace for the TypeRef. - LPCSTR szName, // [IN] Name of the TypeRef. - mdToken tkResolutionScope, // [IN] Resolution Scope fo the TypeRef. - mdTypeRef *ptk) PURE; // [OUT] TypeRef token returned. - - // return the TypeDef properties - // returned void in v1.0/v1.1 - STDMETHOD(GetTypeDefProps)( - mdTypeDef classdef, // given classdef - DWORD *pdwAttr, // return flags on class, tdPublic, tdAbstract - mdToken *ptkExtends) PURE; // [OUT] Put base class TypeDef/TypeRef here - - // return the item's guid - STDMETHOD(GetItemGuid)( - mdToken tkObj, // [IN] given item. - CLSID *pGuid) PURE; // [out[ put guid here. - - // Get enclosing class of the NestedClass. - STDMETHOD(GetNestedClassProps)( // S_OK or error - mdTypeDef tkNestedClass, // [IN] NestedClass token. - mdTypeDef *ptkEnclosingClass) PURE; // [OUT] EnclosingClass token. - - // Get count of Nested classes given the enclosing class. - STDMETHOD(GetCountNestedClasses)( // return count of Nested classes. - mdTypeDef tkEnclosingClass, // Enclosing class. - ULONG *pcNestedClassesCount) PURE; - - // Return array of Nested classes given the enclosing class. - STDMETHOD(GetNestedClasses)( // Return actual count. - mdTypeDef tkEnclosingClass, // [IN] Enclosing class. - mdTypeDef *rNestedClasses, // [OUT] Array of nested class tokens. - ULONG ulNestedClasses, // [IN] Size of array. - ULONG *pcNestedClasses) PURE; - - // return the ModuleRef properties - // returned void in v1.0/v1.1 - STDMETHOD(GetModuleRefProps)( - mdModuleRef mur, // [IN] moduleref token - LPCSTR *pszName) PURE; // [OUT] buffer to fill with the moduleref name - - //***************************************** - // - // GetSig* functions - // - //***************************************** - STDMETHOD(GetSigOfMethodDef)( - mdMethodDef methoddef, // [IN] given memberdef - ULONG *pcbSigBlob, // [OUT] count of bytes in the signature blob - PCCOR_SIGNATURE *ppSig) PURE; - - STDMETHOD(GetSigOfFieldDef)( - mdMethodDef methoddef, // [IN] given memberdef - ULONG *pcbSigBlob, // [OUT] count of bytes in the signature blob - PCCOR_SIGNATURE *ppSig) PURE; - - STDMETHOD(GetSigFromToken)( - mdToken tk, - ULONG * pcbSig, - PCCOR_SIGNATURE * ppSig) PURE; - - - - //***************************************** - // get method property - //***************************************** - STDMETHOD(GetMethodDefProps)( - mdMethodDef md, // The method for which to get props. - DWORD *pdwFlags) PURE; - - //***************************************** - // return method implementation informaiton, like RVA and implflags - //***************************************** - // returned void in v1.0/v1.1 - STDMETHOD(GetMethodImplProps)( - mdToken tk, // [IN] MethodDef - ULONG *pulCodeRVA, // [OUT] CodeRVA - DWORD *pdwImplFlags) PURE; // [OUT] Impl. Flags - - //***************************************** - // return method implementation informaiton, like RVA and implflags - //***************************************** - STDMETHOD(GetFieldRVA)( - mdFieldDef fd, // [IN] fielddef - ULONG *pulCodeRVA) PURE; // [OUT] CodeRVA - - //***************************************** - // get field property - //***************************************** - STDMETHOD(GetFieldDefProps)( - mdFieldDef fd, // [IN] given fielddef - DWORD *pdwFlags) PURE; // [OUT] return fdPublic, fdPrive, etc flags - - //***************************************************************************** - // return default value of a token(could be paramdef, fielddef, or property - //***************************************************************************** - STDMETHOD(GetDefaultValue)( - mdToken tk, // [IN] given FieldDef, ParamDef, or Property - MDDefaultValue *pDefaultValue) PURE;// [OUT] default value to fill - - - //***************************************** - // get dispid of a MethodDef or a FieldDef - //***************************************** - STDMETHOD(GetDispIdOfMemberDef)( // return hresult - mdToken tk, // [IN] given methoddef or fielddef - ULONG *pDispid) PURE; // [OUT] Put the dispid here. - - //***************************************** - // return TypeRef/TypeDef given an InterfaceImpl token - //***************************************** - STDMETHOD(GetTypeOfInterfaceImpl)( // return the TypeRef/typedef token for the interfaceimpl - mdInterfaceImpl iiImpl, // given a interfaceimpl - mdToken *ptkType) PURE; - - //***************************************** - // look up function for TypeDef - //***************************************** - STDMETHOD(FindTypeDef)( - LPCSTR szNamespace, // [IN] Namespace for the TypeDef. - LPCSTR szName, // [IN] Name of the TypeDef. - mdToken tkEnclosingClass, // [IN] TypeRef/TypeDef Token for the enclosing class. - mdTypeDef *ptypedef) PURE; // [IN] return typedef - - //***************************************** - // return name and sig of a memberref - //***************************************** - STDMETHOD(GetNameAndSigOfMemberRef)( // return name here - mdMemberRef memberref, // given memberref - PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to a blob value of CLR signature - ULONG *pcbSigBlob, // [OUT] count of bytes in the signature blob - LPCSTR *pszName) PURE; - - //***************************************************************************** - // Given memberref, return the parent. It can be TypeRef, ModuleRef, MethodDef - //***************************************************************************** - STDMETHOD(GetParentOfMemberRef)( - mdMemberRef memberref, // given memberref - mdToken *ptkParent) PURE; // return the parent token - - STDMETHOD(GetParamDefProps)( - mdParamDef paramdef, // given a paramdef - USHORT *pusSequence, // [OUT] slot number for this parameter - DWORD *pdwAttr, // [OUT] flags - LPCSTR *pszName) PURE; // [OUT] return the name of the parameter - - STDMETHOD(GetPropertyInfoForMethodDef)( // Result. - mdMethodDef md, // [IN] memberdef - mdProperty *ppd, // [OUT] put property token here - LPCSTR *pName, // [OUT] put pointer to name here - ULONG *pSemantic) PURE; // [OUT] put semantic here - - //***************************************** - // class layout/sequence information - //***************************************** - STDMETHOD(GetClassPackSize)( // return error if class doesn't have packsize - mdTypeDef td, // [IN] give typedef - ULONG *pdwPackSize) PURE; // [OUT] 1, 2, 4, 8, or 16 - - STDMETHOD(GetClassTotalSize)( // return error if class doesn't have total size info - mdTypeDef td, // [IN] give typedef - ULONG *pdwClassSize) PURE; // [OUT] return the total size of the class - - STDMETHOD(GetClassLayoutInit)( - mdTypeDef td, // [IN] give typedef - MD_CLASS_LAYOUT *pLayout) PURE; // [OUT] set up the status of query here - - STDMETHOD(GetClassLayoutNext)( - MD_CLASS_LAYOUT *pLayout, // [IN|OUT] set up the status of query here - mdFieldDef *pfd, // [OUT] return the fielddef - ULONG *pulOffset) PURE; // [OUT] return the offset/ulSequence associate with it - - //***************************************** - // marshal information of a field - //***************************************** - STDMETHOD(GetFieldMarshal)( // return error if no native type associate with the token - mdFieldDef fd, // [IN] given fielddef - PCCOR_SIGNATURE *pSigNativeType, // [OUT] the native type signature - ULONG *pcbNativeType) PURE; // [OUT] the count of bytes of *ppvNativeType - - - //***************************************** - // property APIs - //***************************************** - // find a property by name - STDMETHOD(FindProperty)( - mdTypeDef td, // [IN] given a typdef - LPCSTR szPropName, // [IN] property name - mdProperty *pProp) PURE; // [OUT] return property token - - // returned void in v1.0/v1.1 - STDMETHOD(GetPropertyProps)( - mdProperty prop, // [IN] property token - LPCSTR *szProperty, // [OUT] property name - DWORD *pdwPropFlags, // [OUT] property flags. - PCCOR_SIGNATURE *ppvSig, // [OUT] property type. pointing to meta data internal blob - ULONG *pcbSig) PURE; // [OUT] count of bytes in *ppvSig - - //********************************** - // Event APIs - //********************************** - STDMETHOD(FindEvent)( - mdTypeDef td, // [IN] given a typdef - LPCSTR szEventName, // [IN] event name - mdEvent *pEvent) PURE; // [OUT] return event token - - // returned void in v1.0/v1.1 - STDMETHOD(GetEventProps)( - mdEvent ev, // [IN] event token - LPCSTR *pszEvent, // [OUT] Event name - DWORD *pdwEventFlags, // [OUT] Event flags. - mdToken *ptkEventType) PURE; // [OUT] EventType class - - - //********************************** - // find a particular associate of a property or an event - //********************************** - STDMETHOD(FindAssociate)( - mdToken evprop, // [IN] given a property or event token - DWORD associate, // [IN] given a associate semantics(setter, getter, testdefault, reset, AddOn, RemoveOn, Fire) - mdMethodDef *pmd) PURE; // [OUT] return method def token - - // Note, void function in v1.0/v1.1 - STDMETHOD(EnumAssociateInit)( - mdToken evprop, // [IN] given a property or an event token - HENUMInternal *phEnum) PURE; // [OUT] cursor to hold the query result - - // returned void in v1.0/v1.1 - STDMETHOD(GetAllAssociates)( - HENUMInternal *phEnum, // [IN] query result form GetPropertyAssociateCounts - ASSOCIATE_RECORD *pAssociateRec, // [OUT] struct to fill for output - ULONG cAssociateRec) PURE; // [IN] size of the buffer - - - //********************************** - // Get info about a PermissionSet. - //********************************** - // returned void in v1.0/v1.1 - STDMETHOD(GetPermissionSetProps)( - mdPermission pm, // [IN] the permission token. - DWORD *pdwAction, // [OUT] CorDeclSecurity. - void const **ppvPermission, // [OUT] permission blob. - ULONG *pcbPermission) PURE; // [OUT] count of bytes of pvPermission. - - //**************************************** - // Get the String given the String token. - // Returns a pointer to the string, or NULL in case of error. - //**************************************** - STDMETHOD(GetUserString)( - mdString stk, // [IN] the string token. - ULONG *pchString, // [OUT] count of characters in the string. - BOOL *pbIs80Plus, // [OUT] specifies where there are extended characters >= 0x80. - LPCWSTR *pwszUserString) PURE; - - //***************************************************************************** - // p-invoke APIs. - //***************************************************************************** - STDMETHOD(GetPinvokeMap)( - mdToken tk, // [IN] FieldDef, MethodDef. - DWORD *pdwMappingFlags, // [OUT] Flags used for mapping. - LPCSTR *pszImportName, // [OUT] Import name. - mdModuleRef *pmrImportDLL) PURE; // [OUT] ModuleRef token for the target DLL. - - //***************************************************************************** - // helpers to convert a text signature to a com format - //***************************************************************************** - STDMETHOD(ConvertTextSigToComSig)( // Return hresult. - BOOL fCreateTrIfNotFound, // [IN] create typeref if not found - LPCSTR pSignature, // [IN] class file format signature - CQuickBytes *pqbNewSig, // [OUT] place holder for CLR signature - ULONG *pcbCount) PURE; // [OUT] the result size of signature - - //***************************************************************************** - // Assembly MetaData APIs. - //***************************************************************************** - // returned void in v1.0/v1.1 - STDMETHOD(GetAssemblyProps)( - mdAssembly mda, // [IN] The Assembly for which to get the properties. - const void **ppbPublicKey, // [OUT] Pointer to the public key. - ULONG *pcbPublicKey, // [OUT] Count of bytes in the public key. - ULONG *pulHashAlgId, // [OUT] Hash Algorithm. - LPCSTR *pszName, // [OUT] Buffer to fill with name. - AssemblyMetaDataInternal *pMetaData,// [OUT] Assembly MetaData. - DWORD *pdwAssemblyFlags) PURE;// [OUT] Flags. - - // returned void in v1.0/v1.1 - STDMETHOD(GetAssemblyRefProps)( - mdAssemblyRef mdar, // [IN] The AssemblyRef for which to get the properties. - const void **ppbPublicKeyOrToken, // [OUT] Pointer to the public key or token. - ULONG *pcbPublicKeyOrToken, // [OUT] Count of bytes in the public key or token. - LPCSTR *pszName, // [OUT] Buffer to fill with name. - AssemblyMetaDataInternal *pMetaData,// [OUT] Assembly MetaData. - const void **ppbHashValue, // [OUT] Hash blob. - ULONG *pcbHashValue, // [OUT] Count of bytes in the hash blob. - DWORD *pdwAssemblyRefFlags) PURE; // [OUT] Flags. - - // returned void in v1.0/v1.1 - STDMETHOD(GetFileProps)( - mdFile mdf, // [IN] The File for which to get the properties. - LPCSTR *pszName, // [OUT] Buffer to fill with name. - const void **ppbHashValue, // [OUT] Pointer to the Hash Value Blob. - ULONG *pcbHashValue, // [OUT] Count of bytes in the Hash Value Blob. - DWORD *pdwFileFlags) PURE; // [OUT] Flags. - - // returned void in v1.0/v1.1 - STDMETHOD(GetExportedTypeProps)( - mdExportedType mdct, // [IN] The ExportedType for which to get the properties. - LPCSTR *pszNamespace, // [OUT] Namespace. - LPCSTR *pszName, // [OUT] Name. - mdToken *ptkImplementation, // [OUT] mdFile or mdAssemblyRef that provides the ExportedType. - mdTypeDef *ptkTypeDef, // [OUT] TypeDef token within the file. - DWORD *pdwExportedTypeFlags) PURE; // [OUT] Flags. - - // returned void in v1.0/v1.1 - STDMETHOD(GetManifestResourceProps)( - mdManifestResource mdmr, // [IN] The ManifestResource for which to get the properties. - LPCSTR *pszName, // [OUT] Buffer to fill with name. - mdToken *ptkImplementation, // [OUT] mdFile or mdAssemblyRef that provides the ExportedType. - DWORD *pdwOffset, // [OUT] Offset to the beginning of the resource within the file. - DWORD *pdwResourceFlags) PURE;// [OUT] Flags. - - STDMETHOD(FindExportedTypeByName)( // S_OK or error - LPCSTR szNamespace, // [IN] Namespace of the ExportedType. - LPCSTR szName, // [IN] Name of the ExportedType. - mdExportedType tkEnclosingType, // [IN] ExportedType for the enclosing class. - mdExportedType *pmct) PURE; // [OUT] Put ExportedType token here. - - STDMETHOD(FindManifestResourceByName)( // S_OK or error - LPCSTR szName, // [IN] Name of the ManifestResource. - mdManifestResource *pmmr) PURE; // [OUT] Put ManifestResource token here. - - STDMETHOD(GetAssemblyFromScope)( // S_OK or error - mdAssembly *ptkAssembly) PURE; // [OUT] Put token here. - - STDMETHOD(GetCustomAttributeByName)( // S_OK or error - mdToken tkObj, // [IN] Object with Custom Attribute. - LPCUTF8 szName, // [IN] Name of desired Custom Attribute. - const void **ppData, // [OUT] Put pointer to data here. - ULONG *pcbData) PURE; // [OUT] Put size of data here. - - // Note: The return type of this method was void in v1 - STDMETHOD(GetTypeSpecFromToken)( // S_OK or error. - mdTypeSpec typespec, // [IN] Signature token. - PCCOR_SIGNATURE *ppvSig, // [OUT] return pointer to token. - ULONG *pcbSig) PURE; // [OUT] return size of signature. - - STDMETHOD(SetUserContextData)( // S_OK or E_NOTIMPL - IUnknown *pIUnk) PURE; // The user context. - - STDMETHOD_(BOOL, IsValidToken)( // True or False. - mdToken tk) PURE; // [IN] Given token. - - STDMETHOD(TranslateSigWithScope)( - IMDInternalImport *pAssemImport, // [IN] import assembly scope. - const void *pbHashValue, // [IN] hash value for the import assembly. - ULONG cbHashValue, // [IN] count of bytes in the hash value. - PCCOR_SIGNATURE pbSigBlob, // [IN] signature in the importing scope - ULONG cbSigBlob, // [IN] count of bytes of signature - IMetaDataAssemblyEmit *pAssemEmit, // [IN] assembly emit scope. - IMetaDataEmit *emit, // [IN] emit interface - CQuickBytes *pqkSigEmit, // [OUT] buffer to hold translated signature - ULONG *pcbSig) PURE; // [OUT] count of bytes in the translated signature - - // since SOS does not need to call method below, change return value to IUnknown* (from IMetaModelCommon*) - STDMETHOD_(IUnknown*, GetMetaModelCommon)( // Return MetaModelCommon interface. - ) PURE; - - STDMETHOD_(IUnknown *, GetCachedPublicInterface)(BOOL fWithLock) PURE; // return the cached public interface - STDMETHOD(SetCachedPublicInterface)(IUnknown *pUnk) PURE; // no return value - // since SOS does not use the next 2 methods replace UTSemReadWrite* with void* in the signature - STDMETHOD_(void*, GetReaderWriterLock)() PURE; // return the reader writer lock - STDMETHOD(SetReaderWriterLock)(void * pSem) PURE; - - STDMETHOD_(mdModule, GetModuleFromScope)() PURE; // [OUT] Put mdModule token here. - - - //----------------------------------------------------------------- - // Additional custom methods - - // finding a particular method - STDMETHOD(FindMethodDefUsingCompare)( - mdTypeDef classdef, // [IN] given typedef - LPCSTR szName, // [IN] member name - PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of CLR signature - ULONG cbSigBlob, // [IN] count of bytes in the signature blob - PSIGCOMPARE pSignatureCompare, // [IN] Routine to compare signatures - void* pSignatureArgs, // [IN] Additional info to supply the compare function - mdMethodDef *pmd) PURE; // [OUT] matching memberdef - - // Additional v2 methods. - - //***************************************** - // return a field offset for a given field - //***************************************** - STDMETHOD(GetFieldOffset)( - mdFieldDef fd, // [IN] fielddef - ULONG *pulOffset) PURE; // [OUT] FieldOffset - - STDMETHOD(GetMethodSpecProps)( - mdMethodSpec ms, // [IN] The method instantiation - mdToken *tkParent, // [OUT] MethodDef or MemberRef - PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data - ULONG *pcbSigBlob) PURE; // [OUT] actual size of signature blob - - STDMETHOD(GetTableInfoWithIndex)( - ULONG index, // [IN] pass in the table index - void **pTable, // [OUT] pointer to table at index - void **pTableSize) PURE; // [OUT] size of table at index - - STDMETHOD(ApplyEditAndContinue)( - void *pDeltaMD, // [IN] the delta metadata - ULONG cbDeltaMD, // [IN] length of pData - IMDInternalImport **ppv) PURE; // [OUT] the resulting metadata interface - - //********************************** - // Generics APIs - //********************************** - STDMETHOD(GetGenericParamProps)( // S_OK or error. - mdGenericParam rd, // [IN] The type parameter - ULONG* pulSequence, // [OUT] Parameter sequence number - DWORD* pdwAttr, // [OUT] Type parameter flags (for future use) - mdToken *ptOwner, // [OUT] The owner (TypeDef or MethodDef) - DWORD *reserved, // [OUT] The kind (TypeDef/Ref/Spec, for future use) - LPCSTR *szName) PURE; // [OUT] The name - - STDMETHOD(GetGenericParamConstraintProps)( // S_OK or error. - mdGenericParamConstraint rd, // [IN] The constraint token - mdGenericParam *ptGenericParam, // [OUT] GenericParam that is constrained - mdToken *ptkConstraintType) PURE; // [OUT] TypeDef/Ref/Spec constraint - - //***************************************************************************** - // This function gets the "built for" version of a metadata scope. - // NOTE: if the scope has never been saved, it will not have a built-for - // version, and an empty string will be returned. - //***************************************************************************** - STDMETHOD(GetVersionString)( // S_OK or error. - LPCSTR *pVer) PURE; // [OUT] Put version string here. - - - STDMETHOD(SafeAndSlowEnumCustomAttributeByNameInit)(// return S_FALSE if record not found - mdToken tkParent, // [IN] token to scope the search - LPCSTR szName, // [IN] CustomAttribute's name to scope the search - HENUMInternal *phEnum) PURE; // [OUT] The enumerator - - STDMETHOD(SafeAndSlowEnumCustomAttributeByNameNext)(// return S_FALSE if record not found - mdToken tkParent, // [IN] token to scope the search - LPCSTR szName, // [IN] CustomAttribute's name to scope the search - HENUMInternal *phEnum, // [IN] The enumerator - mdCustomAttribute *mdAttribute) PURE; // [OUT] The custom attribute that was found - - - STDMETHOD(GetTypeDefRefTokenInTypeSpec)(// return S_FALSE if enclosing type does not have a token - mdTypeSpec tkTypeSpec, // [IN] TypeSpec token to look at - mdToken *tkEnclosedToken) PURE; // [OUT] The enclosed type token - -#define MD_STREAM_VER_1X 0x10000 -#define MD_STREAM_VER_2_B1 0x10001 -#define MD_STREAM_VER_2 0x20000 - STDMETHOD_(DWORD, GetMetadataStreamVersion)() PURE; //returns DWORD with major version of - // MD stream in senior word and minor version--in junior word - - STDMETHOD(GetNameOfCustomAttribute)(// S_OK or error - mdCustomAttribute mdAttribute, // [IN] The Custom Attribute - LPCUTF8 *pszNamespace, // [OUT] Namespace of Custom Attribute. - LPCUTF8 *pszName) PURE; // [OUT] Name of Custom Attribute. - - STDMETHOD(SetOptimizeAccessForSpeed)(// S_OK or error - BOOL fOptSpeed) PURE; - - STDMETHOD(SetVerifiedByTrustedSource)(// S_OK or error - BOOL fVerified) PURE; - -}; // IMDInternalImport - -EXTERN_GUID(IID_IMetaDataHelper, 0xad93d71d, 0xe1f2, 0x11d1, 0x94, 0x9, 0x0, 0x0, 0xf8, 0x8, 0x34, 0x60); - -#undef INTERFACE -#define INTERFACE IMetaDataHelper -DECLARE_INTERFACE_(IMetaDataHelper, IUnknown) -{ - // helper functions - // This function is exposing the ability to translate signature from a given - // source scope to a given target scope. - // - STDMETHOD(TranslateSigWithScope)( - IMetaDataAssemblyImport *pAssemImport, // [IN] importing assembly interface - const void *pbHashValue, // [IN] Hash Blob for Assembly. - ULONG cbHashValue, // [IN] Count of bytes. - IMetaDataImport *import, // [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 *emit, // [IN] emit interface - PCOR_SIGNATURE pvTranslatedSig, // [OUT] buffer to hold translated signature - ULONG cbTranslatedSigMax, - ULONG *pcbTranslatedSig) PURE;// [OUT] count of bytes in the translated signature - - STDMETHOD(GetMetadata)( - ULONG ulSelect, // [IN] Selector. - void **ppData) PURE; // [OUT] Put pointer to data here. - - STDMETHOD_(IUnknown *, GetCachedInternalInterface)(BOOL fWithLock) PURE; // S_OK or error - STDMETHOD(SetCachedInternalInterface)(IUnknown * pUnk) PURE; // S_OK or error - // since SOS does not use the next 2 methods replace UTSemReadWrite* with void* in the signature - STDMETHOD_(void*, GetReaderWriterLock)() PURE; // return the reader writer lock - STDMETHOD(SetReaderWriterLock)(void * pSem) PURE; -}; - -/********************************************************************************/ - -// Fine grained formatting flags used by the PrettyPrint APIs below. -// Upto FormatStubInfo they mirror the values used by TypeString, after that -// they're used to enable specifying differences between the ILDASM-style -// output and the C#-like output prefered by the rest of SOS. -typedef enum -{ - FormatBasic = 0x00000000, // Not a bitmask, simply the tersest flag settings possible - FormatNamespace = 0x00000001, // Include namespace and/or enclosing class names in type names - FormatFullInst = 0x00000002, // Include namespace and assembly in generic types (regardless of other flag settings) - FormatAssembly = 0x00000004, // Include assembly display name in type names - FormatSignature = 0x00000008, // Include signature in method names - FormatNoVersion = 0x00000010, // Suppress version and culture information in all assembly names - FormatDebug = 0x00000020, // For debug printing of types only - FormatAngleBrackets = 0x00000040, // Whether generic types are C<T> or C[T] - FormatStubInfo = 0x00000080, // Include stub info like {unbox-stub} - // following flags are not present in TypeString::FormatFlags - FormatSlashSep = 0x00000100, // Whether nested types are NS.C1/C2 or NS.C1+C2 - FormatKwInNames = 0x00000200, // Whether "class" and "valuetype" appear in type names in certain instances - FormatCSharp = 0x0000004b, // Used to generate a C#-like string representation of the token - FormatILDasm = 0x000003ff, // Used to generate an ILDASM-style string representation of the token -} -PPFormatFlags; - -PCCOR_SIGNATURE PrettyPrintType( - PCCOR_SIGNATURE typePtr, // type to convert, - CQuickBytes *out, // where to put the pretty printed string - IMDInternalImport *pIMDI, // ptr to IMDInternal class with ComSig - DWORD formatFlags = FormatILDasm); - -const char* PrettyPrintClass( - CQuickBytes *out, // where to put the pretty printed string - mdToken tk, // The class token to look up - IMDInternalImport *pIMDI, // ptr to IMDInternalImport class with ComSig - DWORD formatFlags = FormatILDasm); - -// We have a proliferation of functions that translate a (module/token) pair to -// a string, but none of them were as complete as PrettyPrintClass. Most were -// not handling generic instantiations appropriately. PrettyPrintClassFromToken -// provides this missing functionality. If passed "FormatCSharp" it will generate -// a name fitting the format used throughout SOS, with the exception of !dumpil -// (due to its ILDASM ancestry). -// TODO: Refactor the code in PrettyPrintClassFromToken, NameForTypeDef_s, -// TODO: NameForToken_s, MDInfo::TypeDef/RefName -void PrettyPrintClassFromToken( - TADDR moduleAddr, // the module containing the token - mdToken tok, // the class token to look up - __out_ecount(cbName) WCHAR* mdName, // where to put the pretty printed string - size_t cbName, // the capacity of the buffer - DWORD formatFlags = FormatCSharp); // the format flags for the types - -inline HRESULT GetMDInternalFromImport(IMetaDataImport* pIMDImport, IMDInternalImport **ppIMDI) -{ - HRESULT hresult = E_FAIL; - IUnknown *pUnk = NULL; - IMetaDataHelper *pIMDH = NULL; - - IfErrGoTo(pIMDImport->QueryInterface(IID_IMetaDataHelper, (void**)&pIMDH), Cleanup); - pUnk = pIMDH->GetCachedInternalInterface(FALSE); - if (pUnk == NULL) - goto Cleanup; - IfErrGoTo(pUnk->QueryInterface(IID_IMDInternalImport, (void**)ppIMDI), Cleanup); - -Cleanup: - if (pUnk) - pUnk->Release(); - if (pIMDH != NULL) - pIMDH->Release(); - - return hresult; -} - -#endif - |