| 1 | // Licensed to the .NET Foundation under one or more agreements. |
| 2 | // The .NET Foundation licenses this file to you under the MIT license. |
| 3 | // See the LICENSE file in the project root for more information. |
| 4 | //***************************************************************************** |
| 5 | // MDUtil.h |
| 6 | // |
| 7 | |
| 8 | // |
| 9 | // Contains utility code for MD directory |
| 10 | // |
| 11 | //***************************************************************************** |
| 12 | #ifndef __MDUtil__h__ |
| 13 | #define __MDUtil__h__ |
| 14 | |
| 15 | #include "metadata.h" |
| 16 | |
| 17 | |
| 18 | HRESULT _GetFixedSigOfVarArg( // S_OK or error. |
| 19 | PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob of COM+ method signature |
| 20 | ULONG cbSigBlob, // [IN] size of signature |
| 21 | CQuickBytes *pqbSig, // [OUT] output buffer for fixed part of VarArg Signature |
| 22 | ULONG *pcbSigBlob); // [OUT] number of bytes written to the above output buffer |
| 23 | |
| 24 | ULONG _GetSizeOfConstantBlob( |
| 25 | DWORD dwCPlusTypeFlag, // ELEMENT_TYPE_* |
| 26 | void *pValue, // BLOB value |
| 27 | ULONG cchString); // Size of string in wide chars, or -1 for auto. |
| 28 | |
| 29 | |
| 30 | //********************************************************************* |
| 31 | // APIs to help look up TypeRef using CORPATH environment variable |
| 32 | //********************************************************************* |
| 33 | class CORPATHService |
| 34 | { |
| 35 | public: |
| 36 | |
| 37 | static HRESULT GetClassFromCORPath( |
| 38 | __in __in_z LPWSTR wzClassname, // fully qualified class name |
| 39 | mdTypeRef tr, // TypeRef to be resolved |
| 40 | IMetaModelCommon *pCommon, // Scope in which the TypeRef is defined. |
| 41 | REFIID riid, |
| 42 | IUnknown **ppIScope, |
| 43 | mdTypeDef *ptd); // [OUT] typedef corresponding the typeref |
| 44 | |
| 45 | static HRESULT GetClassFromDir( |
| 46 | __in __in_z LPWSTR wzClassname, // Fully qualified class name. |
| 47 | __in SString& dir, // Directory to try. |
| 48 | mdTypeRef tr, // TypeRef to resolve. |
| 49 | IMetaModelCommon *pCommon, // Scope in which the TypeRef is defined. |
| 50 | REFIID riid, |
| 51 | IUnknown **ppIScope, |
| 52 | mdTypeDef *ptd); // [OUT] typedef |
| 53 | |
| 54 | static HRESULT FindTypeDef( |
| 55 | __in __in_z LPCWSTR wzModule, // name of the module that we are going to open |
| 56 | mdTypeRef tr, // TypeRef to resolve. |
| 57 | IMetaModelCommon *pCommon, // Scope in which the TypeRef is defined. |
| 58 | REFIID riid, |
| 59 | IUnknown **ppIScope, |
| 60 | mdTypeDef *ptd ); // [OUT] the type that we resolve to |
| 61 | }; // class CORPATHService |
| 62 | |
| 63 | |
| 64 | #if defined(FEATURE_METADATA_IN_VM) |
| 65 | |
| 66 | class RegMeta; |
| 67 | |
| 68 | //********************************************************************* |
| 69 | // |
| 70 | // Structure to record the all loaded modules and helpers. |
| 71 | // RegMeta instance is added to the global variable that is tracking |
| 72 | // the opened scoped. This happens in RegMeta's constructor. |
| 73 | // In RegMeta's destructor, the RegMeta pointer will be removed from |
| 74 | // this list. |
| 75 | // |
| 76 | //********************************************************************* |
| 77 | class UTSemReadWrite; |
| 78 | #define LOADEDMODULES_HASH_SIZE 47 |
| 79 | |
| 80 | class LOADEDMODULES : public CDynArray<RegMeta *> |
| 81 | { |
| 82 | private: |
| 83 | static HRESULT InitializeStatics(); |
| 84 | |
| 85 | // Global per-process list of loaded modules |
| 86 | static LOADEDMODULES * s_pLoadedModules; |
| 87 | |
| 88 | public: |
| 89 | static void DeleteStatics(); |
| 90 | |
| 91 | // Named for locking macros - see code:LOCKREAD |
| 92 | static UTSemReadWrite * m_pSemReadWrite; |
| 93 | static RegMeta *(m_HashedModules[LOADEDMODULES_HASH_SIZE]); |
| 94 | |
| 95 | static ULONG HashFileName(LPCWSTR szName); |
| 96 | |
| 97 | static HRESULT AddModuleToLoadedList(RegMeta *pRegMeta); |
| 98 | static BOOL RemoveModuleFromLoadedList(RegMeta *pRegMeta); // true if found and removed. |
| 99 | |
| 100 | static HRESULT FindCachedReadOnlyEntry(LPCWSTR szName, DWORD dwOpenFlags, RegMeta **ppMeta); |
| 101 | |
| 102 | #ifdef FEATURE_METADATA_IN_VM |
| 103 | static HRESULT ResolveTypeRefWithLoadedModules( |
| 104 | mdTypeRef tkTypeRef, // [IN] TypeRef to be resolved. |
| 105 | RegMeta * pTypeRefRegMeta, // [IN] Scope in which the TypeRef is defined. |
| 106 | IMetaModelCommon * pTypeRefScope, // [IN] Scope in which the TypeRef is defined. |
| 107 | REFIID riid, // [IN] iid for the return interface. |
| 108 | IUnknown ** ppIScope, // [OUT] Return interface. |
| 109 | mdTypeDef * ptd); // [OUT] TypeDef corresponding the TypeRef. |
| 110 | #endif //FEATURE_METADATA_IN_VM |
| 111 | |
| 112 | #ifdef _DEBUG |
| 113 | static BOOL IsEntryInList(RegMeta *pRegMeta); |
| 114 | #endif |
| 115 | }; // class LOADEDMODULES |
| 116 | |
| 117 | #endif //FEATURE_METADATA_IN_VM |
| 118 | |
| 119 | #endif // __MDUtil__h__ |
| 120 | |