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// File: metadata.h
6//
7
8//
9// Notes:
10// Common includes for EE & metadata internal. This file contains
11// definition of CorMetaDataScope
12//****************************************************************************
13
14#ifndef _METADATA_H_
15#define _METADATA_H_
16
17#include "../md/inc/metamodelro.h"
18#include "../md/inc/liteweightstgdb.h"
19
20class UTSemReadWrite;
21
22inline int IsGlobalMethodParentTk(mdTypeDef td)
23{
24 LIMITED_METHOD_CONTRACT;
25
26 return (td == mdTypeDefNil || td == mdTokenNil);
27}
28
29typedef enum CorInternalStates
30{
31 tdNoTypes = 0x00000000,
32 tdAllAssemblies = 0x00000001,
33 tdAllTypes = 0xffffffff,
34} CorInternalStates;
35
36//
37// MetaData custom value names.
38//
39enum CorIfaceAttr
40{
41 ifDual = 0, // Interface derives from IDispatch.
42 ifVtable = 1, // Interface derives from IUnknown.
43 ifDispatch = 2, // Interface is a dispinterface.
44 ifInspectable = 3, // Interface derives from IInspectable.
45 ifLast = 4, // The last member of the enum.
46};
47
48inline BOOL IsDispatchBasedItf(CorIfaceAttr ifaceAttr)
49{
50 return (ifaceAttr == ifDual || ifaceAttr == ifDispatch);
51}
52
53enum CorClassIfaceAttr
54{
55 clsIfNone = 0, // No class interface is generated.
56 clsIfAutoDisp = 1, // A dispatch only class interface is generated.
57 clsIfAutoDual = 2, // A dual class interface is generated.
58 clsIfLast = 3, // The last member of the enum.
59};
60
61//
62// The default values for the COM interface and class interface types.
63//
64#define DEFAULT_COM_INTERFACE_TYPE ifDual
65#define DEFAULT_CLASS_INTERFACE_TYPE clsIfAutoDisp
66
67#define HANDLE_UNCOMPRESSED(func) (E_FAIL)
68#define HANDLE_UNCOMPRESSED_BOOL(func) (false)
69
70class TOKENLIST : public CDynArray<mdToken>
71{
72};
73
74
75typedef enum tagEnumType
76{
77 MDSimpleEnum = 0x0, // simple enumerator that doesn't allocate memory
78
79 // You could get this kind of enum if you perform a non-simple query (such as EnumMethodWithName).
80 //
81 MDDynamicArrayEnum = 0x2, // dynamic array that holds tokens
82
83 MDCustomEnum = 0x3, // Custom enumerator that doesnt work with the enum functions
84} EnumType;
85
86//*****************************************
87// Enumerator used by MetaDataInternal
88//*****************************************
89struct HENUMInternal
90{
91 DWORD m_tkKind; // kind of tables that the enum is holding the result
92 ULONG m_ulCount; // count of total entries holding by the enumerator
93
94 EnumType m_EnumType;
95
96 struct {
97 ULONG m_ulStart;
98 ULONG m_ulEnd;
99 ULONG m_ulCur;
100 } u;
101
102 // m_cursor will go away when we no longer support running EE with uncompressed
103 // format. WHEN WE REMOVE THIS, REMOVE ITS VESTIAGES FROM ZeroEnum as well
104 //
105 union {
106 void* m_alignpad; // The first item is m_cursor[] is a pointer
107 char m_cursor[32]; // cursor holding query result for read/write mode
108 };
109
110 // TOKENLIST daTKList; // dynamic arrays of token list
111 HENUMInternal() : m_EnumType(MDSimpleEnum) { LIMITED_METHOD_DAC_CONTRACT; }
112
113 // in-place initialization
114 static void InitDynamicArrayEnum(
115 HENUMInternal *pEnum); // HENUMInternal to be initialized
116
117 static void InitSimpleEnum(
118 DWORD tkKind, // kind of token that we are iterating
119 ULONG ridStart, // starting rid
120 ULONG ridEnd, // end rid
121 HENUMInternal *pEnum); // HENUMInternal to be initialized
122
123 // Specialized helper which should be better than always calling memset
124 inline
125 static void ZeroEnum(
126 HENUMInternal *pEnum)
127 {
128 // we use this to avoid the memset that will happen otherwise.
129 // this should be inlined in its caller. we are seeing a large
130 // number of calls to memset from MDInternalRO::EnumPermissionSetsInit
131 // on x64 which we can eliminate with this code.
132 pEnum->m_tkKind = 0;
133 pEnum->m_ulCount = 0;
134 pEnum->m_EnumType = MDSimpleEnum;
135 pEnum->u.m_ulStart = 0;
136 pEnum->u.m_ulEnd = 0;
137 pEnum->u.m_ulCur = 0;
138
139 // TODO: remove this when we remove m_cursor from the HENUMInternal structure
140 _ASSERTE(IS_ALIGNED(pEnum->m_cursor, sizeof(DWORD)));
141 _ASSERTE((sizeof(HENUMInternal) - offsetof(HENUMInternal, m_cursor)) == (8 * sizeof(DWORD)));
142
143 DWORD* pBuffer = (DWORD*)pEnum->m_cursor;
144 pBuffer[0] = 0;
145 pBuffer[1] = 0;
146 pBuffer[2] = 0;
147 pBuffer[3] = 0;
148 pBuffer[4] = 0;
149 pBuffer[5] = 0;
150 pBuffer[6] = 0;
151 pBuffer[7] = 0;
152 }
153
154 // This will only clear the content of enum and will not free the memory of enum
155 static void ClearEnum(
156 HENUMInternal *pmdEnum);
157
158 // create a HENUMInternal. This will allocate the memory
159 __checkReturn
160 static HRESULT CreateSimpleEnum(
161 DWORD tkKind, // kind of token that we are iterating
162 ULONG ridStart, // starting rid
163 ULONG ridEnd, // end rid
164 HENUMInternal **ppEnum); // return the created HENUMInternal
165
166 __checkReturn
167 static HRESULT CreateDynamicArrayEnum(
168 DWORD tkKind, // kind of token that we are iterating
169 HENUMInternal **ppEnum); // return the created HENUMInternal
170
171 // Destory Enum. This will free the memory
172 static void DestroyEnum(
173 HENUMInternal *pmdEnum);
174
175 static void DestroyEnumIfEmpty(
176 HENUMInternal **ppEnum); // reset the enumerator pointer to NULL if empty
177
178 __checkReturn
179 static HRESULT EnumWithCount(
180 HENUMInternal *pEnum, // enumerator
181 ULONG cMax, // max tokens that caller wants
182 mdToken rTokens[], // output buffer to fill the tokens
183 ULONG *pcTokens); // number of tokens fill to the buffer upon return
184
185 __checkReturn
186 static HRESULT EnumWithCount(
187 HENUMInternal *pEnum, // enumerator
188 ULONG cMax, // max tokens that caller wants
189 mdToken rTokens1[], // first output buffer to fill the tokens
190 mdToken rTokens2[], // second output buffer to fill the tokens
191 ULONG *pcTokens); // number of tokens fill to the buffer upon return
192
193 __checkReturn
194 static HRESULT AddElementToEnum(
195 HENUMInternal *pEnum, // return the created HENUMInternal
196 mdToken tk); // token to fill
197
198 //*****************************************
199 // Get next value contained in the enumerator
200 //*****************************************
201 static bool EnumNext(
202 HENUMInternal *phEnum, // [IN] the enumerator to retrieve information
203 mdToken *ptk); // [OUT] token to scope the search
204
205 __checkReturn
206 static HRESULT GetCount(
207 HENUMInternal *phEnum, // [IN] the enumerator to retrieve information
208 ULONG *pCount); // ]OUT] the index of the desired item
209
210 __checkReturn
211 static HRESULT GetElement(
212 HENUMInternal *phEnum, // [IN] the enumerator to retrieve information
213 ULONG ix, // ]IN] the index of the desired item
214 mdToken *ptk); // [OUT] token to fill
215
216};
217
218
219
220//*****************************************
221// Default Value for field, param or property. Returned by GetDefaultValue
222//*****************************************
223typedef struct _MDDefaultValue
224{
225#if BIGENDIAN
226 _MDDefaultValue(void)
227 {
228 m_bType = ELEMENT_TYPE_END;
229 }
230 ~_MDDefaultValue(void)
231 {
232 if (m_bType == ELEMENT_TYPE_STRING)
233 {
234 delete[] m_wzValue;
235 }
236 }
237#endif
238
239 // type of default value
240 BYTE m_bType; // CorElementType for the default value
241
242 // the default value
243 union
244 {
245 BOOL m_bValue; // ELEMENT_TYPE_BOOLEAN
246 CHAR m_cValue; // ELEMENT_TYPE_I1
247 BYTE m_byteValue; // ELEMENT_TYPE_UI1
248 SHORT m_sValue; // ELEMENT_TYPE_I2
249 USHORT m_usValue; // ELEMENT_TYPE_UI2
250 LONG m_lValue; // ELEMENT_TYPE_I4
251 ULONG m_ulValue; // ELEMENT_TYPE_UI4
252 LONGLONG m_llValue; // ELEMENT_TYPE_I8
253 ULONGLONG m_ullValue; // ELEMENT_TYPE_UI8
254 FLOAT m_fltValue; // ELEMENT_TYPE_R4
255 DOUBLE m_dblValue; // ELEMENT_TYPE_R8
256 LPCWSTR m_wzValue; // ELEMENT_TYPE_STRING
257 IUnknown *m_unkValue; // ELEMENT_TYPE_CLASS
258 };
259 ULONG m_cbSize; // default value size (for blob)
260
261} MDDefaultValue;
262
263
264
265//*****************************************
266// structure use to in GetAllEventAssociates and GetAllPropertyAssociates
267//*****************************************
268typedef struct
269{
270 mdMethodDef m_memberdef;
271 DWORD m_dwSemantics;
272} ASSOCIATE_RECORD;
273
274
275//
276// structure use to retrieve class layout informaiton
277//
278typedef struct
279{
280 RID m_ridFieldCur; // indexing to the field table
281 RID m_ridFieldEnd; // end index to field table
282} MD_CLASS_LAYOUT;
283
284
285// Structure for describing the Assembly MetaData.
286typedef struct
287{
288 USHORT usMajorVersion; // Major Version.
289 USHORT usMinorVersion; // Minor Version.
290 USHORT usBuildNumber; // Build Number.
291 USHORT usRevisionNumber; // Revision Number.
292 LPCSTR szLocale; // Locale.
293 DWORD *rProcessor; // Processor array.
294 ULONG ulProcessor; // [IN/OUT] Size of the processor array/Actual # of entries filled in.
295 OSINFO *rOS; // OSINFO array.
296 ULONG ulOS; // [IN/OUT]Size of the OSINFO array/Actual # of entries filled in.
297} AssemblyMetaDataInternal;
298
299
300
301// Callback definition for comparing signatures.
302// (*PSIGCOMPARE) (BYTE ScopeSignature[], DWORD ScopeSignatureLength,
303// BYTE ExternalSignature[], DWORD ExternalSignatureLength,
304// void* SignatureData);
305typedef BOOL (*PSIGCOMPARE)(PCCOR_SIGNATURE, DWORD, PCCOR_SIGNATURE, DWORD, void*);
306
307
308
309// {CE0F34ED-BBC6-11d2-941E-0000F8083460}
310EXTERN_GUID(IID_IMDInternalImport, 0xce0f34ed, 0xbbc6, 0x11d2, 0x94, 0x1e, 0x0, 0x0, 0xf8, 0x8, 0x34, 0x60);
311
312#undef INTERFACE
313#define INTERFACE IMDInternalImport
314DECLARE_INTERFACE_(IMDInternalImport, IUnknown)
315{
316 //----------------------------------------------------------------------------------------
317 // !!! READ THIS !!!
318 //
319 // New methods have to be added at the end. The order and signatures of the existing methods
320 // have to be preserved. We need to maintain a backward compatibility for this interface to
321 // allow ildasm to work on SingleCLR.
322 //
323 //----------------------------------------------------------------------------------------
324
325 //*****************************************************************************
326 // return the count of entries of a given kind in a scope
327 // For example, pass in mdtMethodDef will tell you how many MethodDef
328 // contained in a scope
329 //*****************************************************************************
330 STDMETHOD_(ULONG, GetCountWithTokenKind)(// return hresult
331 DWORD tkKind) PURE; // [IN] pass in the kind of token.
332
333 //*****************************************************************************
334 // enumerator for typedef
335 //*****************************************************************************
336 __checkReturn
337 STDMETHOD(EnumTypeDefInit)( // return hresult
338 HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data
339
340 STDMETHOD_(ULONG, EnumTypeDefGetCount)(
341 HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information
342
343 STDMETHOD_(void, EnumTypeDefReset)(
344 HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information
345
346 STDMETHOD_(bool, EnumTypeDefNext)( // return hresult
347 HENUMInternal *phEnum, // [IN] input enum
348 mdTypeDef *ptd) PURE; // [OUT] return token
349
350 STDMETHOD_(void, EnumTypeDefClose)(
351 HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information
352
353 //*****************************************************************************
354 // enumerator for MethodImpl
355 //*****************************************************************************
356 __checkReturn
357 STDMETHOD(EnumMethodImplInit)( // return hresult
358 mdTypeDef td, // [IN] TypeDef over which to scope the enumeration.
359 HENUMInternal *phEnumBody, // [OUT] buffer to fill for enumerator data for MethodBody tokens.
360 HENUMInternal *phEnumDecl) PURE; // [OUT] buffer to fill for enumerator data for MethodDecl tokens.
361
362 STDMETHOD_(ULONG, EnumMethodImplGetCount)(
363 HENUMInternal *phEnumBody, // [IN] MethodBody enumerator.
364 HENUMInternal *phEnumDecl) PURE; // [IN] MethodDecl enumerator.
365
366 STDMETHOD_(void, EnumMethodImplReset)(
367 HENUMInternal *phEnumBody, // [IN] MethodBody enumerator.
368 HENUMInternal *phEnumDecl) PURE; // [IN] MethodDecl enumerator.
369
370 __checkReturn
371 STDMETHOD(EnumMethodImplNext)( // return hresult (S_OK = TRUE, S_FALSE = FALSE or error code)
372 HENUMInternal *phEnumBody, // [IN] input enum for MethodBody
373 HENUMInternal *phEnumDecl, // [IN] input enum for MethodDecl
374 mdToken *ptkBody, // [OUT] return token for MethodBody
375 mdToken *ptkDecl) PURE; // [OUT] return token for MethodDecl
376
377 STDMETHOD_(void, EnumMethodImplClose)(
378 HENUMInternal *phEnumBody, // [IN] MethodBody enumerator.
379 HENUMInternal *phEnumDecl) PURE; // [IN] MethodDecl enumerator.
380
381 //*****************************************
382 // Enumerator helpers for memberdef, memberref, interfaceimp,
383 // event, property, exception, param
384 //*****************************************
385
386 __checkReturn
387 STDMETHOD(EnumGlobalFunctionsInit)( // return hresult
388 HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data
389
390 __checkReturn
391 STDMETHOD(EnumGlobalFieldsInit)( // return hresult
392 HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data
393
394 __checkReturn
395 STDMETHOD(EnumInit)( // return S_FALSE if record not found
396 DWORD tkKind, // [IN] which table to work on
397 mdToken tkParent, // [IN] token to scope the search
398 HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill
399
400 __checkReturn
401 STDMETHOD(EnumAllInit)( // return S_FALSE if record not found
402 DWORD tkKind, // [IN] which table to work on
403 HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill
404
405 STDMETHOD_(bool, EnumNext)(
406 HENUMInternal *phEnum, // [IN] the enumerator to retrieve information
407 mdToken *ptk) PURE; // [OUT] token to scope the search
408
409 STDMETHOD_(ULONG, EnumGetCount)(
410 HENUMInternal *phEnum) PURE; // [IN] the enumerator to retrieve information
411
412 STDMETHOD_(void, EnumReset)(
413 HENUMInternal *phEnum) PURE; // [IN] the enumerator to be reset
414
415 STDMETHOD_(void, EnumClose)(
416 HENUMInternal *phEnum) PURE; // [IN] the enumerator to be closed
417
418 //*****************************************
419 // Enumerator helpers for declsecurity.
420 //*****************************************
421 __checkReturn
422 STDMETHOD(EnumPermissionSetsInit)( // return S_FALSE if record not found
423 mdToken tkParent, // [IN] token to scope the search
424 CorDeclSecurity Action, // [IN] Action to scope the search
425 HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill
426
427 //*****************************************
428 // Enumerator helpers for CustomAttribute
429 //*****************************************
430 __checkReturn
431 STDMETHOD(EnumCustomAttributeByNameInit)(// return S_FALSE if record not found
432 mdToken tkParent, // [IN] token to scope the search
433 LPCSTR szName, // [IN] CustomAttribute's name to scope the search
434 HENUMInternal *phEnum) PURE; // [OUT] the enumerator to fill
435
436 //*****************************************
437 // Nagivator helper to navigate back to the parent token given a token.
438 // For example, given a memberdef token, it will return the containing typedef.
439 //
440 // the mapping is as following:
441 // ---given child type---------parent type
442 // mdMethodDef mdTypeDef
443 // mdFieldDef mdTypeDef
444 // mdInterfaceImpl mdTypeDef
445 // mdParam mdMethodDef
446 // mdProperty mdTypeDef
447 // mdEvent mdTypeDef
448 //
449 //*****************************************
450 __checkReturn
451 STDMETHOD(GetParentToken)(
452 mdToken tkChild, // [IN] given child token
453 mdToken *ptkParent) PURE; // [OUT] returning parent
454
455 //*****************************************
456 // Custom value helpers
457 //*****************************************
458 __checkReturn
459 STDMETHOD(GetCustomAttributeProps)( // S_OK or error.
460 mdCustomAttribute at, // [IN] The attribute.
461 mdToken *ptkType) PURE; // [OUT] Put attribute type here.
462
463 __checkReturn
464 STDMETHOD(GetCustomAttributeAsBlob)(
465 mdCustomAttribute cv, // [IN] given custom value token
466 void const **ppBlob, // [OUT] return the pointer to internal blob
467 ULONG *pcbSize) PURE; // [OUT] return the size of the blob
468
469 // returned void in v1.0/v1.1
470 __checkReturn
471 STDMETHOD (GetScopeProps)(
472 LPCSTR *pszName, // [OUT] scope name
473 GUID *pmvid) PURE; // [OUT] version id
474
475 // finding a particular method
476 __checkReturn
477 STDMETHOD(FindMethodDef)(
478 mdTypeDef classdef, // [IN] given typedef
479 LPCSTR szName, // [IN] member name
480 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of CLR signature
481 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
482 mdMethodDef *pmd) PURE; // [OUT] matching memberdef
483
484 // return a iSeq's param given a MethodDef
485 __checkReturn
486 STDMETHOD(FindParamOfMethod)( // S_OK or error.
487 mdMethodDef md, // [IN] The owning method of the param.
488 ULONG iSeq, // [IN] The sequence # of the param.
489 mdParamDef *pparamdef) PURE; // [OUT] Put ParamDef token here.
490
491 //*****************************************
492 //
493 // GetName* functions
494 //
495 //*****************************************
496
497 // return the name and namespace of typedef
498 __checkReturn
499 STDMETHOD(GetNameOfTypeDef)(
500 mdTypeDef classdef, // given classdef
501 LPCSTR *pszname, // return class name(unqualified)
502 LPCSTR *psznamespace) PURE; // return the name space name
503
504 __checkReturn
505 STDMETHOD(GetIsDualOfTypeDef)(
506 mdTypeDef classdef, // [IN] given classdef.
507 ULONG *pDual) PURE; // [OUT] return dual flag here.
508
509 __checkReturn
510 STDMETHOD(GetIfaceTypeOfTypeDef)(
511 mdTypeDef classdef, // [IN] given classdef.
512 ULONG *pIface) PURE; // [OUT] 0=dual, 1=vtable, 2=dispinterface
513
514 // get the name of either methoddef
515 __checkReturn
516 STDMETHOD(GetNameOfMethodDef)( // return the name of the memberdef in UTF8
517 mdMethodDef md, // given memberdef
518 LPCSTR *pszName) PURE;
519
520 __checkReturn
521 STDMETHOD(GetNameAndSigOfMethodDef)(
522 mdMethodDef methoddef, // [IN] given memberdef
523 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to a blob value of CLR signature
524 ULONG *pcbSigBlob, // [OUT] count of bytes in the signature blob
525 LPCSTR *pszName) PURE;
526
527 // return the name of a FieldDef
528 __checkReturn
529 STDMETHOD(GetNameOfFieldDef)(
530 mdFieldDef fd, // given memberdef
531 LPCSTR *pszName) PURE;
532
533 // return the name of typeref
534 __checkReturn
535 STDMETHOD(GetNameOfTypeRef)(
536 mdTypeRef classref, // [IN] given typeref
537 LPCSTR *psznamespace, // [OUT] return typeref name
538 LPCSTR *pszname) PURE; // [OUT] return typeref namespace
539
540 // return the resolutionscope of typeref
541 __checkReturn
542 STDMETHOD(GetResolutionScopeOfTypeRef)(
543 mdTypeRef classref, // given classref
544 mdToken *ptkResolutionScope) PURE;
545
546 // Find the type token given the name.
547 __checkReturn
548 STDMETHOD(FindTypeRefByName)(
549 LPCSTR szNamespace, // [IN] Namespace for the TypeRef.
550 LPCSTR szName, // [IN] Name of the TypeRef.
551 mdToken tkResolutionScope, // [IN] Resolution Scope fo the TypeRef.
552 mdTypeRef *ptk) PURE; // [OUT] TypeRef token returned.
553
554 // return the TypeDef properties
555 // returned void in v1.0/v1.1
556 __checkReturn
557 STDMETHOD(GetTypeDefProps)(
558 mdTypeDef classdef, // given classdef
559 DWORD *pdwAttr, // return flags on class, tdPublic, tdAbstract
560 mdToken *ptkExtends) PURE; // [OUT] Put base class TypeDef/TypeRef here
561
562 // return the item's guid
563 __checkReturn
564 STDMETHOD(GetItemGuid)(
565 mdToken tkObj, // [IN] given item.
566 CLSID *pGuid) PURE; // [out[ put guid here.
567
568 // Get enclosing class of the NestedClass.
569 __checkReturn
570 STDMETHOD(GetNestedClassProps)( // S_OK or error
571 mdTypeDef tkNestedClass, // [IN] NestedClass token.
572 mdTypeDef *ptkEnclosingClass) PURE; // [OUT] EnclosingClass token.
573
574 // Get count of Nested classes given the enclosing class.
575 __checkReturn
576 STDMETHOD(GetCountNestedClasses)( // return count of Nested classes.
577 mdTypeDef tkEnclosingClass, // Enclosing class.
578 ULONG *pcNestedClassesCount) PURE;
579
580 // Return array of Nested classes given the enclosing class.
581 __checkReturn
582 STDMETHOD(GetNestedClasses)( // Return actual count.
583 mdTypeDef tkEnclosingClass, // [IN] Enclosing class.
584 mdTypeDef *rNestedClasses, // [OUT] Array of nested class tokens.
585 ULONG ulNestedClasses, // [IN] Size of array.
586 ULONG *pcNestedClasses) PURE;
587
588 // return the ModuleRef properties
589 // returned void in v1.0/v1.1
590 __checkReturn
591 STDMETHOD(GetModuleRefProps)(
592 mdModuleRef mur, // [IN] moduleref token
593 LPCSTR *pszName) PURE; // [OUT] buffer to fill with the moduleref name
594
595 //*****************************************
596 //
597 // GetSig* functions
598 //
599 //*****************************************
600 __checkReturn
601 STDMETHOD(GetSigOfMethodDef)(
602 mdMethodDef tkMethodDef, // [IN] given MethodDef
603 ULONG * pcbSigBlob, // [OUT] count of bytes in the signature blob
604 PCCOR_SIGNATURE * ppSig) PURE;
605
606 __checkReturn
607 STDMETHOD(GetSigOfFieldDef)(
608 mdFieldDef tkFieldDef, // [IN] given FieldDef
609 ULONG * pcbSigBlob, // [OUT] count of bytes in the signature blob
610 PCCOR_SIGNATURE * ppSig) PURE;
611
612 __checkReturn
613 STDMETHOD(GetSigFromToken)(
614 mdToken tk, // FieldDef, MethodDef, Signature or TypeSpec token
615 ULONG * pcbSig,
616 PCCOR_SIGNATURE * ppSig) PURE;
617
618
619
620 //*****************************************
621 // get method property
622 //*****************************************
623 __checkReturn
624 STDMETHOD(GetMethodDefProps)(
625 mdMethodDef md, // The method for which to get props.
626 DWORD *pdwFlags) PURE;
627
628 //*****************************************
629 // return method implementation informaiton, like RVA and implflags
630 //*****************************************
631 // returned void in v1.0/v1.1
632 __checkReturn
633 STDMETHOD(GetMethodImplProps)(
634 mdToken tk, // [IN] MethodDef
635 ULONG *pulCodeRVA, // [OUT] CodeRVA
636 DWORD *pdwImplFlags) PURE; // [OUT] Impl. Flags
637
638 //*****************************************
639 // return method implementation informaiton, like RVA and implflags
640 //*****************************************
641 __checkReturn
642 STDMETHOD(GetFieldRVA)(
643 mdFieldDef fd, // [IN] fielddef
644 ULONG *pulCodeRVA) PURE; // [OUT] CodeRVA
645
646 //*****************************************
647 // get field property
648 //*****************************************
649 __checkReturn
650 STDMETHOD(GetFieldDefProps)(
651 mdFieldDef fd, // [IN] given fielddef
652 DWORD *pdwFlags) PURE; // [OUT] return fdPublic, fdPrive, etc flags
653
654 //*****************************************************************************
655 // return default value of a token(could be paramdef, fielddef, or property
656 //*****************************************************************************
657 __checkReturn
658 STDMETHOD(GetDefaultValue)(
659 mdToken tk, // [IN] given FieldDef, ParamDef, or Property
660 MDDefaultValue *pDefaultValue) PURE;// [OUT] default value to fill
661
662
663 //*****************************************
664 // get dispid of a MethodDef or a FieldDef
665 //*****************************************
666 __checkReturn
667 STDMETHOD(GetDispIdOfMemberDef)( // return hresult
668 mdToken tk, // [IN] given methoddef or fielddef
669 ULONG *pDispid) PURE; // [OUT] Put the dispid here.
670
671 //*****************************************
672 // return TypeRef/TypeDef given an InterfaceImpl token
673 //*****************************************
674 __checkReturn
675 STDMETHOD(GetTypeOfInterfaceImpl)( // return the TypeRef/typedef token for the interfaceimpl
676 mdInterfaceImpl iiImpl, // given a interfaceimpl
677 mdToken *ptkType) PURE;
678
679 //*****************************************
680 // look up function for TypeDef
681 //*****************************************
682 __checkReturn
683 STDMETHOD(FindTypeDef)(
684 LPCSTR szNamespace, // [IN] Namespace for the TypeDef.
685 LPCSTR szName, // [IN] Name of the TypeDef.
686 mdToken tkEnclosingClass, // [IN] TypeRef/TypeDef Token for the enclosing class.
687 mdTypeDef *ptypedef) PURE; // [IN] return typedef
688
689 //*****************************************
690 // return name and sig of a memberref
691 //*****************************************
692 __checkReturn
693 STDMETHOD(GetNameAndSigOfMemberRef)( // return name here
694 mdMemberRef memberref, // given memberref
695 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to a blob value of CLR signature
696 ULONG *pcbSigBlob, // [OUT] count of bytes in the signature blob
697 LPCSTR *pszName) PURE;
698
699 //*****************************************************************************
700 // Given memberref, return the parent. It can be TypeRef, ModuleRef, MethodDef
701 //*****************************************************************************
702 __checkReturn
703 STDMETHOD(GetParentOfMemberRef)(
704 mdMemberRef memberref, // given memberref
705 mdToken *ptkParent) PURE; // return the parent token
706
707 __checkReturn
708 STDMETHOD(GetParamDefProps)(
709 mdParamDef paramdef, // given a paramdef
710 USHORT *pusSequence, // [OUT] slot number for this parameter
711 DWORD *pdwAttr, // [OUT] flags
712 LPCSTR *pszName) PURE; // [OUT] return the name of the parameter
713
714 __checkReturn
715 STDMETHOD(GetPropertyInfoForMethodDef)( // Result.
716 mdMethodDef md, // [IN] memberdef
717 mdProperty *ppd, // [OUT] put property token here
718 LPCSTR *pName, // [OUT] put pointer to name here
719 ULONG *pSemantic) PURE; // [OUT] put semantic here
720
721 //*****************************************
722 // class layout/sequence information
723 //*****************************************
724 __checkReturn
725 STDMETHOD(GetClassPackSize)( // return error if class doesn't have packsize
726 mdTypeDef td, // [IN] give typedef
727 ULONG *pdwPackSize) PURE; // [OUT] 1, 2, 4, 8, or 16
728
729 __checkReturn
730 STDMETHOD(GetClassTotalSize)( // return error if class doesn't have total size info
731 mdTypeDef td, // [IN] give typedef
732 ULONG *pdwClassSize) PURE; // [OUT] return the total size of the class
733
734 __checkReturn
735 STDMETHOD(GetClassLayoutInit)(
736 mdTypeDef td, // [IN] give typedef
737 MD_CLASS_LAYOUT *pLayout) PURE; // [OUT] set up the status of query here
738
739 __checkReturn
740 STDMETHOD(GetClassLayoutNext)(
741 MD_CLASS_LAYOUT *pLayout, // [IN|OUT] set up the status of query here
742 mdFieldDef *pfd, // [OUT] return the fielddef
743 ULONG *pulOffset) PURE; // [OUT] return the offset/ulSequence associate with it
744
745 //*****************************************
746 // marshal information of a field
747 //*****************************************
748 __checkReturn
749 STDMETHOD(GetFieldMarshal)( // return error if no native type associate with the token
750 mdFieldDef fd, // [IN] given fielddef
751 PCCOR_SIGNATURE *pSigNativeType, // [OUT] the native type signature
752 ULONG *pcbNativeType) PURE; // [OUT] the count of bytes of *ppvNativeType
753
754
755 //*****************************************
756 // property APIs
757 //*****************************************
758 // find a property by name
759 __checkReturn
760 STDMETHOD(FindProperty)(
761 mdTypeDef td, // [IN] given a typdef
762 LPCSTR szPropName, // [IN] property name
763 mdProperty *pProp) PURE; // [OUT] return property token
764
765 // returned void in v1.0/v1.1
766 __checkReturn
767 STDMETHOD(GetPropertyProps)(
768 mdProperty prop, // [IN] property token
769 LPCSTR *szProperty, // [OUT] property name
770 DWORD *pdwPropFlags, // [OUT] property flags.
771 PCCOR_SIGNATURE *ppvSig, // [OUT] property type. pointing to meta data internal blob
772 ULONG *pcbSig) PURE; // [OUT] count of bytes in *ppvSig
773
774 //**********************************
775 // Event APIs
776 //**********************************
777 __checkReturn
778 STDMETHOD(FindEvent)(
779 mdTypeDef td, // [IN] given a typdef
780 LPCSTR szEventName, // [IN] event name
781 mdEvent *pEvent) PURE; // [OUT] return event token
782
783 // returned void in v1.0/v1.1
784 __checkReturn
785 STDMETHOD(GetEventProps)(
786 mdEvent ev, // [IN] event token
787 LPCSTR *pszEvent, // [OUT] Event name
788 DWORD *pdwEventFlags, // [OUT] Event flags.
789 mdToken *ptkEventType) PURE; // [OUT] EventType class
790
791
792 //**********************************
793 // find a particular associate of a property or an event
794 //**********************************
795 __checkReturn
796 STDMETHOD(FindAssociate)(
797 mdToken evprop, // [IN] given a property or event token
798 DWORD associate, // [IN] given a associate semantics(setter, getter, testdefault, reset, AddOn, RemoveOn, Fire)
799 mdMethodDef *pmd) PURE; // [OUT] return method def token
800
801 // Note, void function in v1.0/v1.1
802 __checkReturn
803 STDMETHOD(EnumAssociateInit)(
804 mdToken evprop, // [IN] given a property or an event token
805 HENUMInternal *phEnum) PURE; // [OUT] cursor to hold the query result
806
807 // returned void in v1.0/v1.1
808 __checkReturn
809 STDMETHOD(GetAllAssociates)(
810 HENUMInternal *phEnum, // [IN] query result form GetPropertyAssociateCounts
811 ASSOCIATE_RECORD *pAssociateRec, // [OUT] struct to fill for output
812 ULONG cAssociateRec) PURE; // [IN] size of the buffer
813
814
815 //**********************************
816 // Get info about a PermissionSet.
817 //**********************************
818 // returned void in v1.0/v1.1
819 __checkReturn
820 STDMETHOD(GetPermissionSetProps)(
821 mdPermission pm, // [IN] the permission token.
822 DWORD *pdwAction, // [OUT] CorDeclSecurity.
823 void const **ppvPermission, // [OUT] permission blob.
824 ULONG *pcbPermission) PURE; // [OUT] count of bytes of pvPermission.
825
826 //****************************************
827 // Get the String given the String token.
828 // Returns a pointer to the string, or NULL in case of error.
829 //****************************************
830 __checkReturn
831 STDMETHOD(GetUserString)(
832 mdString stk, // [IN] the string token.
833 ULONG *pchString, // [OUT] count of characters in the string.
834 BOOL *pbIs80Plus, // [OUT] specifies where there are extended characters >= 0x80.
835 LPCWSTR *pwszUserString) PURE;
836
837 //*****************************************************************************
838 // p-invoke APIs.
839 //*****************************************************************************
840 __checkReturn
841 STDMETHOD(GetPinvokeMap)(
842 mdToken tk, // [IN] FieldDef, MethodDef.
843 DWORD *pdwMappingFlags, // [OUT] Flags used for mapping.
844 LPCSTR *pszImportName, // [OUT] Import name.
845 mdModuleRef *pmrImportDLL) PURE; // [OUT] ModuleRef token for the target DLL.
846
847 //*****************************************************************************
848 // helpers to convert a text signature to a com format
849 //*****************************************************************************
850 __checkReturn
851 STDMETHOD(ConvertTextSigToComSig)( // Return hresult.
852 BOOL fCreateTrIfNotFound, // [IN] create typeref if not found
853 LPCSTR pSignature, // [IN] class file format signature
854 CQuickBytes *pqbNewSig, // [OUT] place holder for CLR signature
855 ULONG *pcbCount) PURE; // [OUT] the result size of signature
856
857 //*****************************************************************************
858 // Assembly MetaData APIs.
859 //*****************************************************************************
860 // returned void in v1.0/v1.1
861 __checkReturn
862 STDMETHOD(GetAssemblyProps)(
863 mdAssembly mda, // [IN] The Assembly for which to get the properties.
864 const void **ppbPublicKey, // [OUT] Pointer to the public key.
865 ULONG *pcbPublicKey, // [OUT] Count of bytes in the public key.
866 ULONG *pulHashAlgId, // [OUT] Hash Algorithm.
867 LPCSTR *pszName, // [OUT] Buffer to fill with name.
868 AssemblyMetaDataInternal *pMetaData,// [OUT] Assembly MetaData.
869 DWORD *pdwAssemblyFlags) PURE;// [OUT] Flags.
870
871 // returned void in v1.0/v1.1
872 __checkReturn
873 STDMETHOD(GetAssemblyRefProps)(
874 mdAssemblyRef mdar, // [IN] The AssemblyRef for which to get the properties.
875 const void **ppbPublicKeyOrToken, // [OUT] Pointer to the public key or token.
876 ULONG *pcbPublicKeyOrToken, // [OUT] Count of bytes in the public key or token.
877 LPCSTR *pszName, // [OUT] Buffer to fill with name.
878 AssemblyMetaDataInternal *pMetaData,// [OUT] Assembly MetaData.
879 const void **ppbHashValue, // [OUT] Hash blob.
880 ULONG *pcbHashValue, // [OUT] Count of bytes in the hash blob.
881 DWORD *pdwAssemblyRefFlags) PURE; // [OUT] Flags.
882
883 // returned void in v1.0/v1.1
884 __checkReturn
885 STDMETHOD(GetFileProps)(
886 mdFile mdf, // [IN] The File for which to get the properties.
887 LPCSTR *pszName, // [OUT] Buffer to fill with name.
888 const void **ppbHashValue, // [OUT] Pointer to the Hash Value Blob.
889 ULONG *pcbHashValue, // [OUT] Count of bytes in the Hash Value Blob.
890 DWORD *pdwFileFlags) PURE; // [OUT] Flags.
891
892 // returned void in v1.0/v1.1
893 __checkReturn
894 STDMETHOD(GetExportedTypeProps)(
895 mdExportedType mdct, // [IN] The ExportedType for which to get the properties.
896 LPCSTR *pszNamespace, // [OUT] Namespace.
897 LPCSTR *pszName, // [OUT] Name.
898 mdToken *ptkImplementation, // [OUT] mdFile or mdAssemblyRef that provides the ExportedType.
899 mdTypeDef *ptkTypeDef, // [OUT] TypeDef token within the file.
900 DWORD *pdwExportedTypeFlags) PURE; // [OUT] Flags.
901
902 // returned void in v1.0/v1.1
903 __checkReturn
904 STDMETHOD(GetManifestResourceProps)(
905 mdManifestResource mdmr, // [IN] The ManifestResource for which to get the properties.
906 LPCSTR *pszName, // [OUT] Buffer to fill with name.
907 mdToken *ptkImplementation, // [OUT] mdFile or mdAssemblyRef that provides the ExportedType.
908 DWORD *pdwOffset, // [OUT] Offset to the beginning of the resource within the file.
909 DWORD *pdwResourceFlags) PURE;// [OUT] Flags.
910
911 __checkReturn
912 STDMETHOD(FindExportedTypeByName)( // S_OK or error
913 LPCSTR szNamespace, // [IN] Namespace of the ExportedType.
914 LPCSTR szName, // [IN] Name of the ExportedType.
915 mdExportedType tkEnclosingType, // [IN] ExportedType for the enclosing class.
916 mdExportedType *pmct) PURE; // [OUT] Put ExportedType token here.
917
918 __checkReturn
919 STDMETHOD(FindManifestResourceByName)( // S_OK or error
920 LPCSTR szName, // [IN] Name of the ManifestResource.
921 mdManifestResource *pmmr) PURE; // [OUT] Put ManifestResource token here.
922
923 __checkReturn
924 STDMETHOD(GetAssemblyFromScope)( // S_OK or error
925 mdAssembly *ptkAssembly) PURE; // [OUT] Put token here.
926
927 __checkReturn
928 STDMETHOD(GetCustomAttributeByName)( // S_OK or error
929 mdToken tkObj, // [IN] Object with Custom Attribute.
930 LPCUTF8 szName, // [IN] Name of desired Custom Attribute.
931 const void **ppData, // [OUT] Put pointer to data here.
932 ULONG *pcbData) PURE; // [OUT] Put size of data here.
933
934 // Note: The return type of this method was void in v1
935 __checkReturn
936 STDMETHOD(GetTypeSpecFromToken)( // S_OK or error.
937 mdTypeSpec typespec, // [IN] Signature token.
938 PCCOR_SIGNATURE *ppvSig, // [OUT] return pointer to token.
939 ULONG *pcbSig) PURE; // [OUT] return size of signature.
940
941 __checkReturn
942 STDMETHOD(SetUserContextData)( // S_OK or E_NOTIMPL
943 IUnknown *pIUnk) PURE; // The user context.
944
945 __checkReturn
946 STDMETHOD_(BOOL, IsValidToken)( // True or False.
947 mdToken tk) PURE; // [IN] Given token.
948
949 __checkReturn
950 STDMETHOD(TranslateSigWithScope)(
951 IMDInternalImport *pAssemImport, // [IN] import assembly scope.
952 const void *pbHashValue, // [IN] hash value for the import assembly.
953 ULONG cbHashValue, // [IN] count of bytes in the hash value.
954 PCCOR_SIGNATURE pbSigBlob, // [IN] signature in the importing scope
955 ULONG cbSigBlob, // [IN] count of bytes of signature
956 IMetaDataAssemblyEmit *pAssemEmit, // [IN] assembly emit scope.
957 IMetaDataEmit *emit, // [IN] emit interface
958 CQuickBytes *pqkSigEmit, // [OUT] buffer to hold translated signature
959 ULONG *pcbSig) PURE; // [OUT] count of bytes in the translated signature
960
961 STDMETHOD_(IMetaModelCommon*, GetMetaModelCommon)( // Return MetaModelCommon interface.
962 ) PURE;
963
964 STDMETHOD_(IUnknown *, GetCachedPublicInterface)(BOOL fWithLock) PURE; // return the cached public interface
965 __checkReturn
966 STDMETHOD(SetCachedPublicInterface)(IUnknown *pUnk) PURE; // no return value
967 STDMETHOD_(UTSemReadWrite*, GetReaderWriterLock)() PURE; // return the reader writer lock
968 __checkReturn
969 STDMETHOD(SetReaderWriterLock)(UTSemReadWrite * pSem) PURE;
970
971 STDMETHOD_(mdModule, GetModuleFromScope)() PURE; // [OUT] Put mdModule token here.
972
973
974 //-----------------------------------------------------------------
975 // Additional custom methods
976
977 // finding a particular method
978 __checkReturn
979 STDMETHOD(FindMethodDefUsingCompare)(
980 mdTypeDef classdef, // [IN] given typedef
981 LPCSTR szName, // [IN] member name
982 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of CLR signature
983 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
984 PSIGCOMPARE pSignatureCompare, // [IN] Routine to compare signatures
985 void* pSignatureArgs, // [IN] Additional info to supply the compare function
986 mdMethodDef *pmd) PURE; // [OUT] matching memberdef
987
988 // Additional v2 methods.
989
990 //*****************************************
991 // return a field offset for a given field
992 //*****************************************
993 __checkReturn
994 STDMETHOD(GetFieldOffset)(
995 mdFieldDef fd, // [IN] fielddef
996 ULONG *pulOffset) PURE; // [OUT] FieldOffset
997
998 __checkReturn
999 STDMETHOD(GetMethodSpecProps)(
1000 mdMethodSpec ms, // [IN] The method instantiation
1001 mdToken *tkParent, // [OUT] MethodDef or MemberRef
1002 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
1003 ULONG *pcbSigBlob) PURE; // [OUT] actual size of signature blob
1004
1005 __checkReturn
1006 STDMETHOD(GetTableInfoWithIndex)(
1007 ULONG index, // [IN] pass in the table index
1008 void **pTable, // [OUT] pointer to table at index
1009 void **pTableSize) PURE; // [OUT] size of table at index
1010
1011 __checkReturn
1012 STDMETHOD(ApplyEditAndContinue)(
1013 void *pDeltaMD, // [IN] the delta metadata
1014 ULONG cbDeltaMD, // [IN] length of pData
1015 IMDInternalImport **ppv) PURE; // [OUT] the resulting metadata interface
1016
1017 //**********************************
1018 // Generics APIs
1019 //**********************************
1020 __checkReturn
1021 STDMETHOD(GetGenericParamProps)( // S_OK or error.
1022 mdGenericParam rd, // [IN] The type parameter
1023 ULONG* pulSequence, // [OUT] Parameter sequence number
1024 DWORD* pdwAttr, // [OUT] Type parameter flags (for future use)
1025 mdToken *ptOwner, // [OUT] The owner (TypeDef or MethodDef)
1026 DWORD *reserved, // [OUT] The kind (TypeDef/Ref/Spec, for future use)
1027 LPCSTR *szName) PURE; // [OUT] The name
1028
1029 __checkReturn
1030 STDMETHOD(GetGenericParamConstraintProps)( // S_OK or error.
1031 mdGenericParamConstraint rd, // [IN] The constraint token
1032 mdGenericParam *ptGenericParam, // [OUT] GenericParam that is constrained
1033 mdToken *ptkConstraintType) PURE; // [OUT] TypeDef/Ref/Spec constraint
1034
1035 //*****************************************************************************
1036 // This function gets the "built for" version of a metadata scope.
1037 // NOTE: if the scope has never been saved, it will not have a built-for
1038 // version, and an empty string will be returned.
1039 //*****************************************************************************
1040 __checkReturn
1041 STDMETHOD(GetVersionString)( // S_OK or error.
1042 LPCSTR *pVer) PURE; // [OUT] Put version string here.
1043
1044
1045 __checkReturn
1046 STDMETHOD(SafeAndSlowEnumCustomAttributeByNameInit)(// return S_FALSE if record not found
1047 mdToken tkParent, // [IN] token to scope the search
1048 LPCSTR szName, // [IN] CustomAttribute's name to scope the search
1049 HENUMInternal *phEnum) PURE; // [OUT] The enumerator
1050
1051 __checkReturn
1052 STDMETHOD(SafeAndSlowEnumCustomAttributeByNameNext)(// return S_FALSE if record not found
1053 mdToken tkParent, // [IN] token to scope the search
1054 LPCSTR szName, // [IN] CustomAttribute's name to scope the search
1055 HENUMInternal *phEnum, // [IN] The enumerator
1056 mdCustomAttribute *mdAttribute) PURE; // [OUT] The custom attribute that was found
1057
1058
1059 __checkReturn
1060 STDMETHOD(GetTypeDefRefTokenInTypeSpec)(// return S_FALSE if enclosing type does not have a token
1061 mdTypeSpec tkTypeSpec, // [IN] TypeSpec token to look at
1062 mdToken *tkEnclosedToken) PURE; // [OUT] The enclosed type token
1063
1064#define MD_STREAM_VER_1X 0x10000
1065#define MD_STREAM_VER_2_B1 0x10001
1066#define MD_STREAM_VER_2 0x20000
1067 STDMETHOD_(DWORD, GetMetadataStreamVersion)() PURE; //returns DWORD with major version of
1068 // MD stream in senior word and minor version--in junior word
1069
1070 __checkReturn
1071 STDMETHOD(GetNameOfCustomAttribute)(// S_OK or error
1072 mdCustomAttribute mdAttribute, // [IN] The Custom Attribute
1073 LPCUTF8 *pszNamespace, // [OUT] Namespace of Custom Attribute.
1074 LPCUTF8 *pszName) PURE; // [OUT] Name of Custom Attribute.
1075
1076 STDMETHOD(SetOptimizeAccessForSpeed)(// S_OK or error
1077 BOOL fOptSpeed) PURE;
1078
1079 STDMETHOD(SetVerifiedByTrustedSource)(// S_OK or error
1080 BOOL fVerified) PURE;
1081
1082 STDMETHOD(GetRvaOffsetData)(
1083 DWORD *pFirstMethodRvaOffset, // [OUT] Offset (from start of metadata) to the first RVA field in MethodDef table.
1084 DWORD *pMethodDefRecordSize, // [OUT] Size of each record in MethodDef table.
1085 DWORD *pMethodDefCount, // [OUT] Number of records in MethodDef table.
1086 DWORD *pFirstFieldRvaOffset, // [OUT] Offset (from start of metadata) to the first RVA field in FieldRVA table.
1087 DWORD *pFieldRvaRecordSize, // [OUT] Size of each record in FieldRVA table.
1088 DWORD *pFieldRvaCount // [OUT] Number of records in FieldRVA table.
1089 ) PURE;
1090
1091 //----------------------------------------------------------------------------------------
1092 // !!! READ THIS !!!
1093 //
1094 // New methods have to be added at the end. The order and signatures of the existing methods
1095 // have to be preserved. We need to maintain a backward compatibility for this interface to
1096 // allow ildasm to work on SingleCLR.
1097 //
1098 //----------------------------------------------------------------------------------------
1099
1100}; // IMDInternalImport
1101
1102
1103// {E03D7730-D7E3-11d2-8C0D-00C04FF7431A}
1104EXTERN_GUID(IID_IMDInternalImportENC, 0xe03d7730, 0xd7e3, 0x11d2, 0x8c, 0xd, 0x0, 0xc0, 0x4f, 0xf7, 0x43, 0x1a);
1105
1106#undef INTERFACE
1107#define INTERFACE IMDInternalImportENC
1108DECLARE_INTERFACE_(IMDInternalImportENC, IMDInternalImport)
1109{
1110private:
1111 using IMDInternalImport::ApplyEditAndContinue;
1112public:
1113 // ENC only methods here.
1114 STDMETHOD(ApplyEditAndContinue)( // S_OK or error.
1115 MDInternalRW *pDelta) PURE; // Interface to MD with the ENC delta.
1116
1117 STDMETHOD(EnumDeltaTokensInit)( // return hresult
1118 HENUMInternal *phEnum) PURE; // [OUT] buffer to fill for enumerator data
1119
1120}; // IMDInternalImportENC
1121
1122// {F102C526-38CB-49ed-9B5F-498816AE36E0}
1123EXTERN_GUID(IID_IMDInternalEmit, 0xf102c526, 0x38cb, 0x49ed, 0x9b, 0x5f, 0x49, 0x88, 0x16, 0xae, 0x36, 0xe0);
1124
1125#undef INTERFACE
1126#define INTERFACE IMDInternalEmit
1127DECLARE_INTERFACE_(IMDInternalEmit, IUnknown)
1128{
1129 STDMETHOD(ChangeMvid)( // S_OK or error.
1130 REFGUID newMvid) PURE; // GUID to use as the MVID
1131
1132 STDMETHOD(SetMDUpdateMode)(
1133 ULONG updateMode, ULONG *pPreviousUpdateMode) PURE;
1134
1135}; // IMDInternalEmit
1136
1137#ifdef FEATURE_METADATA_CUSTOM_DATA_SOURCE
1138
1139struct IMDCustomDataSource;
1140
1141#include "../md/inc/metamodel.h"
1142
1143// {CC0C8F7A-A00B-493D-80B6-CE0C92491670}
1144EXTERN_GUID(IID_IMDCustomDataSource, 0xcc0c8f7a, 0xa00b, 0x493d, 0x80, 0xb6, 0xce, 0xc, 0x92, 0x49, 0x16, 0x70);
1145
1146#undef INTERFACE
1147#define INTERFACE IMDCustomDataSource
1148DECLARE_INTERFACE_(IMDCustomDataSource, IUnknown)
1149{
1150 STDMETHOD(GetSchema)(CMiniMdSchema* pSchema) PURE;
1151 STDMETHOD(GetTableDef)(ULONG32 tableIndex, CMiniTableDef* pTableDef) PURE;
1152 STDMETHOD(GetBlobHeap)(MetaData::DataBlob* pBlobHeapData) PURE;
1153 STDMETHOD(GetGuidHeap)(MetaData::DataBlob* pGuidHeapData) PURE;
1154 STDMETHOD(GetStringHeap)(MetaData::DataBlob* pStringHeapData) PURE;
1155 STDMETHOD(GetUserStringHeap)(MetaData::DataBlob* pUserStringHeapData) PURE;
1156 STDMETHOD(GetTableRecords)(ULONG32 tableIndex, MetaData::DataBlob* pTableRecordData) PURE;
1157 STDMETHOD(GetTableSortable)(ULONG32 tableIndex, BOOL* pSortable) PURE;
1158 STDMETHOD(GetStorageSignature)(MetaData::DataBlob* pStorageSignature) PURE;
1159
1160}; // IMDCustomDataSource
1161
1162// {503F79FB-7AAE-4364-BDA6-8E235D173AEC}
1163EXTERN_GUID(IID_IMetaDataDispenserCustom,
1164 0x503f79fb, 0x7aae, 0x4364, 0xbd, 0xa6, 0x8e, 0x23, 0x5d, 0x17, 0x3a, 0xec);
1165
1166#undef INTERFACE
1167#define INTERFACE IMetaDataDispenserCustom
1168DECLARE_INTERFACE_(IMetaDataDispenserCustom, IUnknown)
1169{
1170 STDMETHOD(OpenScopeOnCustomDataSource)( // Return code.
1171 IMDCustomDataSource *pCustomSource, // [in] The scope to open.
1172 DWORD dwOpenFlags, // [in] Open mode flags.
1173 REFIID riid, // [in] The interface desired.
1174 IUnknown **ppIUnk) PURE; // [out] Return interface on success.
1175
1176}; // IMetaDataDispenserCustom
1177
1178#endif // FEATURE_METADATA_CUSTOM_DATA_SOURCE
1179
1180#ifdef FEATURE_METADATA_DEBUGGEE_DATA_SOURCE
1181struct ICorDebugDataTarget;
1182HRESULT CreateRemoteMDInternalRWSource(TADDR mdInternalRWRemoteAddress, ICorDebugDataTarget* pDataTarget, DWORD defines, DWORD dataStructureVersion, IMDCustomDataSource** ppDataSource);
1183#endif
1184
1185#ifdef __HOLDER_H_
1186
1187void DECLSPEC_NORETURN ThrowHR(HRESULT hr);
1188
1189// This wrapper class ensures that the HENUMInternal is EnumTypeDefClose'd no matter how the scope is exited.
1190class HENUMTypeDefInternalHolder
1191{
1192public:
1193 FORCEINLINE HENUMTypeDefInternalHolder(IMDInternalImport *pInternalImport)
1194 {
1195 WRAPPER_NO_CONTRACT;
1196
1197 m_pInternalImport = pInternalImport;
1198 m_fAcquired = FALSE;
1199 }
1200
1201 FORCEINLINE VOID EnumTypeDefInit()
1202 {
1203 CONTRACTL {
1204 THROWS;
1205 } CONTRACTL_END;
1206
1207 _ASSERTE(!m_fAcquired);
1208 HRESULT hr = m_pInternalImport->EnumTypeDefInit(&m_hEnum);
1209 if (FAILED(hr))
1210 {
1211 ThrowHR(hr);
1212 }
1213 m_fAcquired = TRUE;
1214
1215 }
1216
1217 FORCEINLINE HRESULT EnumTypeDefInitNoThrow()
1218 {
1219 WRAPPER_NO_CONTRACT;
1220
1221 _ASSERTE(!m_fAcquired);
1222 HRESULT hr = m_pInternalImport->EnumTypeDefInit(&m_hEnum);
1223 if (FAILED(hr))
1224 {
1225 return hr;
1226 }
1227 m_fAcquired = TRUE;
1228
1229 return hr;
1230 }
1231
1232 FORCEINLINE ~HENUMTypeDefInternalHolder()
1233 {
1234 WRAPPER_NO_CONTRACT;
1235
1236 if (m_fAcquired)
1237 {
1238 m_pInternalImport->EnumTypeDefClose(&m_hEnum);
1239 }
1240 }
1241
1242 FORCEINLINE HENUMInternal* operator& ()
1243 {
1244 LIMITED_METHOD_CONTRACT;
1245
1246 _ASSERTE(m_fAcquired);
1247 return &m_hEnum;
1248 }
1249
1250private:
1251 FORCEINLINE HENUMTypeDefInternalHolder(const HENUMTypeDefInternalHolder &)
1252 {
1253 LIMITED_METHOD_CONTRACT;
1254
1255 _ASSERTE(!"Don't try to assign this class.");
1256 }
1257
1258private:
1259 IMDInternalImport *m_pInternalImport;
1260 HENUMInternal m_hEnum;
1261 BOOL m_fAcquired;
1262};
1263
1264
1265// This wrapper class ensures that the HENUMInternal is EnumClose'd no matter how the scope is exited.
1266class HENUMInternalHolder
1267{
1268public:
1269 FORCEINLINE HENUMInternalHolder(IMDInternalImport *pInternalImport)
1270 {
1271 WRAPPER_NO_CONTRACT;
1272
1273 m_pInternalImport = pInternalImport;
1274 m_fAcquired = FALSE;
1275 }
1276
1277 FORCEINLINE BOOL EnumPermissionSetsInit(mdToken tkToken, CorDeclSecurity action)
1278 {
1279 CONTRACTL {
1280 THROWS;
1281 } CONTRACTL_END;
1282
1283 _ASSERTE(!m_fAcquired);
1284 HRESULT hr = m_pInternalImport->EnumPermissionSetsInit(tkToken, action, &m_hEnum);
1285
1286 if (hr == CLDB_E_RECORD_NOTFOUND)
1287 return FALSE;
1288
1289 if (FAILED(hr) )
1290 {
1291 ThrowHR(hr);
1292 }
1293
1294 m_fAcquired = TRUE;
1295
1296 return TRUE;
1297 }
1298
1299 FORCEINLINE VOID EnumGlobalFunctionsInit()
1300 {
1301 CONTRACTL {
1302 THROWS;
1303 } CONTRACTL_END;
1304
1305 _ASSERTE(!m_fAcquired);
1306 HRESULT hr = m_pInternalImport->EnumGlobalFunctionsInit(&m_hEnum);
1307 if (FAILED(hr))
1308 {
1309 ThrowHR(hr);
1310 }
1311 m_fAcquired = TRUE;
1312
1313 }
1314
1315
1316 FORCEINLINE VOID EnumGlobalFieldsInit()
1317 {
1318 CONTRACTL {
1319 THROWS;
1320 } CONTRACTL_END;
1321
1322 _ASSERTE(!m_fAcquired);
1323 HRESULT hr = m_pInternalImport->EnumGlobalFieldsInit(&m_hEnum);
1324 if (FAILED(hr))
1325 {
1326 ThrowHR(hr);
1327 }
1328 m_fAcquired = TRUE;
1329
1330 }
1331
1332 FORCEINLINE VOID EnumTypeDefInit()
1333 {
1334 CONTRACTL {
1335 THROWS;
1336 } CONTRACTL_END;
1337
1338 _ASSERTE(!m_fAcquired);
1339 HRESULT hr = m_pInternalImport->EnumTypeDefInit(&m_hEnum);
1340 if (FAILED(hr))
1341 {
1342 ThrowHR(hr);
1343 }
1344 m_fAcquired = TRUE;
1345 }
1346
1347 FORCEINLINE VOID EnumAssociateInit(mdToken tkParent) // [IN] token to scope the search
1348 {
1349 CONTRACTL {
1350 THROWS;
1351 } CONTRACTL_END;
1352
1353 _ASSERTE(!m_fAcquired);
1354 IfFailThrow(m_pInternalImport->EnumAssociateInit(tkParent, &m_hEnum));
1355 m_fAcquired = TRUE;
1356 }
1357
1358 FORCEINLINE VOID EnumInit(DWORD tkKind, // [IN] which table to work on
1359 mdToken tkParent // [IN] token to scope the search
1360 )
1361 {
1362 CONTRACTL {
1363 THROWS;
1364 } CONTRACTL_END;
1365
1366 HRESULT hr = EnumInitNoThrow(tkKind, tkParent);
1367 if (FAILED(hr))
1368 {
1369 ThrowHR(hr);
1370 }
1371 }
1372
1373 __checkReturn
1374 FORCEINLINE HRESULT EnumInitNoThrow(DWORD tkKind, // [IN] which table to work on
1375 mdToken tkParent // [IN] token to scope the search
1376 )
1377 {
1378 CONTRACTL {
1379 NOTHROW;
1380 } CONTRACTL_END;
1381
1382 _ASSERTE(!m_fAcquired);
1383 HRESULT hr = m_pInternalImport->EnumInit(tkKind, tkParent, &m_hEnum);
1384 if (SUCCEEDED(hr))
1385 {
1386 m_fAcquired = TRUE;
1387 }
1388 return hr;
1389 }
1390
1391 FORCEINLINE VOID EnumAllInit(DWORD tkKind // [IN] which table to work on
1392 )
1393 {
1394 CONTRACTL {
1395 THROWS;
1396 } CONTRACTL_END;
1397
1398 _ASSERTE(!m_fAcquired);
1399 HRESULT hr = m_pInternalImport->EnumAllInit(tkKind, &m_hEnum);
1400 if (FAILED(hr))
1401 {
1402 ThrowHR(hr);
1403 }
1404 m_fAcquired = TRUE;
1405
1406 }
1407
1408 FORCEINLINE ULONG EnumGetCount()
1409 {
1410 CONTRACTL {
1411 NOTHROW;
1412 GC_NOTRIGGER;
1413 CONSISTENCY_CHECK(m_fAcquired);
1414 } CONTRACTL_END;
1415
1416 return m_pInternalImport->EnumGetCount(&m_hEnum);
1417 }
1418
1419 FORCEINLINE bool EnumNext(mdToken * pTok)
1420 {
1421 CONTRACTL {
1422 NOTHROW;
1423 GC_NOTRIGGER;
1424 CONSISTENCY_CHECK(m_fAcquired);
1425 } CONTRACTL_END;
1426
1427 return m_pInternalImport->EnumNext(&m_hEnum, pTok);
1428 }
1429
1430 FORCEINLINE void EnumReset()
1431 {
1432 CONTRACTL {
1433 NOTHROW;
1434 GC_NOTRIGGER;
1435 CONSISTENCY_CHECK(m_fAcquired);
1436 } CONTRACTL_END;
1437
1438 return m_pInternalImport->EnumReset(&m_hEnum);
1439 }
1440
1441 FORCEINLINE ~HENUMInternalHolder()
1442 {
1443 WRAPPER_NO_CONTRACT;
1444
1445 if (m_fAcquired)
1446 {
1447 // Ignore the error
1448 (void)m_pInternalImport->EnumClose(&m_hEnum);
1449 }
1450 }
1451
1452 FORCEINLINE HENUMInternal* operator& ()
1453 {
1454 LIMITED_METHOD_CONTRACT;
1455
1456 _ASSERTE(m_fAcquired);
1457 return &m_hEnum;
1458 }
1459
1460private:
1461 FORCEINLINE HENUMInternalHolder(const HENUMInternalHolder &)
1462 {
1463 WRAPPER_NO_CONTRACT;
1464
1465 _ASSERTE(!"Don't try to assign this class.");
1466 }
1467
1468
1469protected:
1470 IMDInternalImport *m_pInternalImport;
1471 HENUMInternal m_hEnum;
1472 BOOL m_fAcquired;
1473};
1474
1475class HENUMInternalMethodImplHolder : protected HENUMInternalHolder
1476{
1477 public:
1478 FORCEINLINE HENUMInternalMethodImplHolder(IMDInternalImport *pInternalImport)
1479 : HENUMInternalHolder(pInternalImport)
1480 {
1481 WRAPPER_NO_CONTRACT;
1482 }
1483
1484 FORCEINLINE ~HENUMInternalMethodImplHolder()
1485 {
1486 WRAPPER_NO_CONTRACT;
1487
1488 if (m_fAcquired)
1489 {
1490 // Ignore the error
1491 (void)m_pInternalImport->EnumClose(&m_hEnum2);
1492 }
1493 }
1494
1495 FORCEINLINE void EnumMethodImplInit(mdToken tkParent // [IN] token to scope the search
1496 )
1497 {
1498 CONTRACTL {
1499 THROWS;
1500 } CONTRACTL_END;
1501
1502 HRESULT hr = EnumMethodImplInitNoThrow(tkParent);
1503 if (FAILED(hr))
1504 {
1505 ThrowHR(hr);
1506 }
1507 }
1508
1509 __checkReturn
1510 FORCEINLINE HRESULT EnumMethodImplInitNoThrow(mdToken tkParent // [IN] token to scope the search
1511 )
1512 {
1513 CONTRACTL {
1514 NOTHROW;
1515 } CONTRACTL_END;
1516
1517 _ASSERTE(!m_fAcquired);
1518 HRESULT hr = m_pInternalImport->EnumMethodImplInit(tkParent, &m_hEnum, &m_hEnum2);
1519 if (SUCCEEDED(hr))
1520 {
1521 m_fAcquired = TRUE;
1522 }
1523 return hr;
1524 }
1525
1526 __checkReturn
1527 FORCEINLINE HRESULT EnumMethodImplNext(
1528 mdToken *ptkImpl,
1529 mdToken *ptkDecl)
1530 {
1531 CONTRACTL {
1532 NOTHROW;
1533 GC_NOTRIGGER;
1534 CONSISTENCY_CHECK(m_fAcquired);
1535 } CONTRACTL_END;
1536
1537 return m_pInternalImport->EnumMethodImplNext(&m_hEnum, &m_hEnum2, ptkImpl, ptkDecl);
1538 }
1539
1540 FORCEINLINE ULONG EnumMethodImplGetCount()
1541 {
1542 CONTRACTL {
1543 NOTHROW;
1544 GC_NOTRIGGER;
1545 CONSISTENCY_CHECK(m_fAcquired);
1546 } CONTRACTL_END;
1547
1548 return m_pInternalImport->EnumMethodImplGetCount(&m_hEnum, &m_hEnum2);
1549 }
1550
1551 protected:
1552 HENUMInternal m_hEnum2;
1553};
1554
1555#endif //__HOLDER_H_
1556
1557#endif // _METADATA_H_
1558