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// RegMeta.h
6//
7
8//
9// This is the code for the MetaData coclass including both the emit and
10// import API's.
11//
12// This provides an implementation of the public Metadata interfaces via the RegMeta class. It's
13// primarily intended for use by tools such as compilers, debuggers, and profilers.
14//*****************************************************************************
15#ifndef __RegMeta__h__
16#define __RegMeta__h__
17
18#include <metamodelrw.h>
19#include "../inc/mdlog.h"
20#include "utsem.h"
21
22#include "rwutil.h"
23#include "mdperf.h"
24
25#include "sigparser.h"
26
27#include "winmdinterfaces.h"
28
29class FilterManager;
30
31// Support for symbol binding meta data. This is a custom value hung off of
32// the Module entry. The CORDBG_SYMBOL_URL needs to be allocated on top of
33// a buffer large enough to hold it.
34//
35#define SZ_CORDBG_SYMBOL_URL W("DebugSymbolUrlData")
36
37struct CORDBG_SYMBOL_URL
38{
39 GUID FormatID; // ID of the format type.
40 WCHAR rcName[2]; // Variable sized name of the item.
41
42#ifdef _PREFAST_
43#pragma warning(push)
44#pragma warning(disable:6305) // "Potential mismatch between sizeof and countof quantities"
45#endif
46
47 ULONG Size() const
48 {
49 return (ULONG)(sizeof(GUID) + ((wcslen(rcName) + 1) * 2));
50 }
51
52#ifdef _PREFAST_
53#pragma warning(pop)
54#endif
55};
56
57
58//
59// Internal open flags.
60//
61#define ofExternalStgDB ofReserved1
62#define IsOfExternalStgDB(x) ((x) & ofExternalStgDB)
63#define ofReOpen ofReserved2
64#define IsOfReOpen(x) ((x) & ofReOpen)
65
66
67// Set API caller type
68enum SetAPICallerType
69{
70 DEFINE_API = 0x1,
71 EXTERNAL_CALLER = 0x2
72};
73
74// Define the record entry for the table over which ValidateMetaData iterates over.
75// Add a forward declaration for RegMeta.
76class RegMeta;
77typedef HRESULT (RegMeta::*ValidateRecordFunction)(RID);
78
79// Support for security attributes. Bundles of attributes (they look much like
80// custom attributes) are passed into a single API (DefineSecurityAttributeSet)
81// where they're processed and written into the metadata as one or more opaque
82// blobs of data.
83struct CORSEC_ATTR
84{
85 CORSEC_ATTR *pNext; // Next structure in list or NULL.
86 mdToken tkObj; // The object to put the value on.
87 mdMemberRef tkCtor; // The security attribute constructor.
88 mdTypeRef tkTypeRef; // Ref to the security attribute type.
89 mdAssemblyRef tkAssemblyRef; // Ref to the assembly containing the security attribute class.
90 void const *pCustomAttribute; // The custom value data.
91 ULONG cbCustomAttribute; // The custom value data length.
92};
93
94// Support for "Pseudo Custom Attributes".
95struct CCustAttrHashKey
96{
97 mdToken tkType; // Token of the custom attribute type.
98 int ca; // flag indicating what the ca is.
99};
100
101class CCustAttrHash : public CClosedHashEx<CCustAttrHashKey, CCustAttrHash>
102{
103 typedef CCustAttrHashKey T;
104
105 using CClosedHashEx<CCustAttrHashKey, CCustAttrHash>::Hash;
106 using CClosedHashEx<CCustAttrHashKey, CCustAttrHash>::Compare;
107 using CClosedHashEx<CCustAttrHashKey, CCustAttrHash>::Status;
108 using CClosedHashEx<CCustAttrHashKey, CCustAttrHash>::SetStatus;
109 using CClosedHashEx<CCustAttrHashKey, CCustAttrHash>::GetKey;
110
111public:
112 CCustAttrHash(int iBuckets=37) : CClosedHashEx<CCustAttrHashKey,CCustAttrHash>(iBuckets) {}
113 unsigned int Hash(const T *pData);
114 unsigned int Compare(const T *p1, T *p2);
115 ELEMENTSTATUS Status(T *pEntry);
116 void SetStatus(T *pEntry, ELEMENTSTATUS s);
117 void* GetKey(T *pEntry);
118};
119
120class MDInternalRW;
121struct CaArg;
122struct CaNamedArg;
123
124#ifdef FEATURE_METADATA_RELEASE_MEMORY_ON_REOPEN
125#define REGMETA_POSSIBLE_INTERNAL_POINTER_EXPOSED() MarkUnsafeToDeleteStgdb()
126#else
127#define REGMETA_POSSIBLE_INTERNAL_POINTER_EXPOSED()
128#endif
129
130// The RegMeta class implements the public metadata interfaces.
131//
132// Notes:
133// This object is primarily consumed by tools, not the runtime itself. (The runtime should be
134// using the internal metadata interfaces, not the public ones implemented here).
135// The VM uses it for IMetaDataEmit* interfaces. Define* methods are not exposed to the VM
136// (eg for Reflection) otherwise.
137// This object is a thin veneer exposing a public interface on top of the real storage.
138// The runtime also has internal interfaces to access that storage.
139//
140// This is included outside of md\compiler; so be very careful about using #ifdef to change class layout
141// (adding removing interfaces changes class layout)
142//
143// This exists in both the full and standalone versions of the metadata.
144//
145
146class RegMeta :
147 public IMetaDataImport2,
148 public IMetaDataAssemblyImport,
149 public IMetaDataTables2
150
151 , public IMetaDataInfo
152
153#ifdef FEATURE_METADATA_EMIT
154 , public IMetaDataEmit2
155 , public IMetaDataAssemblyEmit
156#endif
157
158#ifdef FEATURE_METADATA_EMIT_ALL
159 , public IMetaDataFilter
160#endif
161
162#ifdef FEATURE_METADATA_INTERNAL_APIS
163 , public IMetaDataHelper
164 , public IMDInternalEmit
165 , public IGetIMDInternalImport
166#endif
167
168#if defined(FEATURE_METADATA_EMIT) && defined(FEATURE_METADATA_INTERNAL_APIS)
169 , public IMetaDataEmitHelper
170#endif
171
172#if defined(FEATURE_METADATA_IN_VM) && defined(FEATURE_PREJIT)
173 , public IMetaDataCorProfileData
174 , public IMDInternalMetadataReorderingOptions
175#endif
176 , public IMDCommon
177{
178 friend class CImportTlb;
179 friend class MDInternalRW;
180 friend class MDInternalRO;
181 friend HRESULT TranslateSigHelper(
182 IMDInternalImport* pImport,
183 IMDInternalImport* pAssemImport,
184 const void* pbHashValue,
185 ULONG cbHashValue,
186 PCCOR_SIGNATURE pbSigBlob,
187 ULONG cbSigBlob,
188 IMetaDataAssemblyEmit* pAssemEmit,
189 IMetaDataEmit* emit,
190 CQuickBytes* pqkSigEmit,
191 ULONG* pcbSig);
192public:
193//*****************************************************************************
194// IUnknown methods
195//*****************************************************************************
196 STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
197 STDMETHODIMP_(ULONG) AddRef(void);
198 STDMETHODIMP_(ULONG) Release(void);
199
200//*****************************************************************************
201// IMetaDataImport methods
202//*****************************************************************************
203 void STDMETHODCALLTYPE CloseEnum(HCORENUM hEnum);
204 STDMETHODIMP CountEnum(HCORENUM hEnum, ULONG *pulCount);
205 STDMETHODIMP ResetEnum(HCORENUM hEnum, ULONG ulPos);
206 STDMETHODIMP EnumTypeDefs(HCORENUM *phEnum, mdTypeDef rTypeDefs[],
207 ULONG cMax, ULONG *pcTypeDefs);
208 STDMETHODIMP EnumInterfaceImpls(HCORENUM *phEnum, mdTypeDef td,
209 mdInterfaceImpl rImpls[], ULONG cMax,
210 ULONG* pcImpls);
211 STDMETHODIMP EnumTypeRefs(HCORENUM *phEnum, mdTypeRef rTypeRefs[],
212 ULONG cMax, ULONG* pcTypeRefs);
213 STDMETHODIMP FindTypeDefByName( // S_OK or error.
214 LPCWSTR szTypeDef, // [IN] Name of the Type.
215 mdToken tdEncloser, // [IN] TypeDef/TypeRef of Enclosing class.
216 mdTypeDef *ptd); // [OUT] Put the TypeDef token here.
217
218 STDMETHODIMP GetScopeProps( // S_OK or error.
219 __out_ecount_opt (cchName) LPWSTR szName, // [OUT] Put name here.
220 ULONG cchName, // [IN] Size of name buffer in wide chars.
221 ULONG *pchName, // [OUT] Put size of name (wide chars) here.
222 GUID *pmvid); // [OUT] Put MVID here.
223
224 STDMETHODIMP GetModuleFromScope( // S_OK.
225 mdModule *pmd); // [OUT] Put mdModule token here.
226
227 STDMETHODIMP GetTypeDefProps( // S_OK or error.
228 mdTypeDef td, // [IN] TypeDef token for inquiry.
229 __out_ecount_opt (cchTypeDef) LPWSTR szTypeDef, // [OUT] Put name here.
230 ULONG cchTypeDef, // [IN] size of name buffer in wide chars.
231 ULONG *pchTypeDef, // [OUT] put size of name (wide chars) here.
232 DWORD *pdwTypeDefFlags, // [OUT] Put flags here.
233 mdToken *ptkExtends); // [OUT] Put base class TypeDef/TypeRef here.
234
235 STDMETHODIMP GetInterfaceImplProps( // S_OK or error.
236 mdInterfaceImpl iiImpl, // [IN] InterfaceImpl token.
237 mdTypeDef *pClass, // [OUT] Put implementing class token here.
238 mdToken *ptkIface); // [OUT] Put implemented interface token here.
239
240 STDMETHODIMP GetTypeRefProps(
241 mdTypeRef tr, // S_OK or error.
242 mdToken *ptkResolutionScope, // [OUT] Resolution scope, mdModuleRef or mdAssemblyRef.
243 __out_ecount_opt (cchName) LPWSTR szName, // [OUT] Name buffer.
244 ULONG cchName, // [IN] Size of Name buffer.
245 ULONG *pchName); // [OUT] Actual size of Name.
246
247 // This access global shared state to looks across multiple metadata scopes that would
248 // otherwise be independent.
249 STDMETHODIMP ResolveTypeRef(mdTypeRef tr, REFIID riid, IUnknown **ppIScope, mdTypeDef *ptd);
250
251 STDMETHODIMP EnumMembers( // S_OK, S_FALSE, or error.
252 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
253 mdTypeDef cl, // [IN] TypeDef to scope the enumeration.
254 mdToken rMembers[], // [OUT] Put MemberDefs here.
255 ULONG cMax, // [IN] Max MemberDefs to put.
256 ULONG *pcTokens); // [OUT] Put # put here.
257
258 STDMETHODIMP EnumMembersWithName( // S_OK, S_FALSE, or error.
259 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
260 mdTypeDef cl, // [IN] TypeDef to scope the enumeration.
261 LPCWSTR szName, // [IN] Limit results to those with this name.
262 mdToken rMembers[], // [OUT] Put MemberDefs here.
263 ULONG cMax, // [IN] Max MemberDefs to put.
264 ULONG *pcTokens); // [OUT] Put # put here.
265
266 STDMETHODIMP EnumMethods( // S_OK, S_FALSE, or error.
267 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
268 mdTypeDef cl, // [IN] TypeDef to scope the enumeration.
269 mdMethodDef rMethods[], // [OUT] Put MethodDefs here.
270 ULONG cMax, // [IN] Max MethodDefs to put.
271 ULONG *pcTokens); // [OUT] Put # put here.
272
273 STDMETHODIMP EnumMethodsWithName( // S_OK, S_FALSE, or error.
274 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
275 mdTypeDef cl, // [IN] TypeDef to scope the enumeration.
276 LPCWSTR szName, // [IN] Limit results to those with this name.
277 mdMethodDef rMethods[], // [OU] Put MethodDefs here.
278 ULONG cMax, // [IN] Max MethodDefs to put.
279 ULONG *pcTokens); // [OUT] Put # put here.
280
281 STDMETHODIMP EnumFields( // S_OK, S_FALSE, or error.
282 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
283 mdTypeDef cl, // [IN] TypeDef to scope the enumeration.
284 mdFieldDef rFields[], // [OUT] Put FieldDefs here.
285 ULONG cMax, // [IN] Max FieldDefs to put.
286 ULONG *pcTokens); // [OUT] Put # put here.
287
288 STDMETHODIMP EnumFieldsWithName( // S_OK, S_FALSE, or error.
289 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
290 mdTypeDef cl, // [IN] TypeDef to scope the enumeration.
291 LPCWSTR szName, // [IN] Limit results to those with this name.
292 mdFieldDef rFields[], // [OUT] Put MemberDefs here.
293 ULONG cMax, // [IN] Max MemberDefs to put.
294 ULONG *pcTokens); // [OUT] Put # put here.
295
296
297 STDMETHODIMP EnumParams( // S_OK, S_FALSE, or error.
298 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
299 mdMethodDef mb, // [IN] MethodDef to scope the enumeration.
300 mdParamDef rParams[], // [OUT] Put ParamDefs here.
301 ULONG cMax, // [IN] Max ParamDefs to put.
302 ULONG *pcTokens); // [OUT] Put # put here.
303
304 STDMETHODIMP EnumMemberRefs( // S_OK, S_FALSE, or error.
305 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
306 mdToken tkParent, // [IN] Parent token to scope the enumeration.
307 mdMemberRef rMemberRefs[], // [OUT] Put MemberRefs here.
308 ULONG cMax, // [IN] Max MemberRefs to put.
309 ULONG *pcTokens); // [OUT] Put # put here.
310
311 STDMETHODIMP EnumMethodImpls( // S_OK, S_FALSE, or error
312 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
313 mdTypeDef td, // [IN] TypeDef to scope the enumeration.
314 mdToken rMethodBody[], // [OUT] Put Method Body tokens here.
315 mdToken rMethodDecl[], // [OUT] Put Method Declaration tokens here.
316 ULONG cMax, // [IN] Max tokens to put.
317 ULONG *pcTokens); // [OUT] Put # put here.
318
319 STDMETHODIMP EnumPermissionSets( // S_OK, S_FALSE, or error.
320 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
321 mdToken tk, // [IN] if !NIL, token to scope the enumeration.
322 DWORD dwActions, // [IN] if !0, return only these actions.
323 mdPermission rPermission[], // [OUT] Put Permissions here.
324 ULONG cMax, // [IN] Max Permissions to put.
325 ULONG *pcTokens); // [OUT] Put # put here.
326
327 STDMETHODIMP FindMember(
328 mdTypeDef td, // [IN] given typedef
329 LPCWSTR szName, // [IN] member name
330 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
331 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
332 mdToken *pmb); // [OUT] matching memberdef
333
334 STDMETHODIMP FindMethod(
335 mdTypeDef td, // [IN] given typedef
336 LPCWSTR szName, // [IN] member name
337 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
338 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
339 mdMethodDef *pmb); // [OUT] matching memberdef
340
341 STDMETHODIMP FindField(
342 mdTypeDef td, // [IN] given typedef
343 LPCWSTR szName, // [IN] member name
344 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
345 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
346 mdFieldDef *pmb); // [OUT] matching memberdef
347
348 STDMETHODIMP FindMemberRef(
349 mdTypeRef td, // [IN] given typeRef
350 LPCWSTR szName, // [IN] member name
351 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
352 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
353 mdMemberRef *pmr); // [OUT] matching memberref
354
355 STDMETHODIMP GetMethodProps(
356 mdMethodDef mb, // The method for which to get props.
357 mdTypeDef *pClass, // Put method's class here.
358 __out_ecount_opt (cchMethod) LPWSTR szMethod, // Put method's name here.
359 ULONG cchMethod, // Size of szMethod buffer in wide chars.
360 ULONG *pchMethod, // Put actual size here
361 DWORD *pdwAttr, // Put flags here.
362 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
363 ULONG *pcbSigBlob, // [OUT] actual size of signature blob
364 ULONG *pulCodeRVA, // [OUT] codeRVA
365 DWORD *pdwImplFlags); // [OUT] Impl. Flags
366
367 STDMETHODIMP GetMemberRefProps( // S_OK or error.
368 mdMemberRef mr, // [IN] given memberref
369 mdToken *ptk, // [OUT] Put classref or classdef here.
370 __out_ecount_opt (cchMember) LPWSTR szMember, // [OUT] buffer to fill for member's name
371 ULONG cchMember, // [IN] the count of char of szMember
372 ULONG *pchMember, // [OUT] actual count of char in member name
373 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to meta data blob value
374 ULONG *pbSig); // [OUT] actual size of signature blob
375
376 STDMETHODIMP EnumProperties( // S_OK, S_FALSE, or error.
377 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
378 mdTypeDef td, // [IN] TypeDef to scope the enumeration.
379 mdProperty rProperties[], // [OUT] Put Properties here.
380 ULONG cMax, // [IN] Max properties to put.
381 ULONG *pcProperties); // [OUT] Put # put here.
382
383 STDMETHODIMP EnumEvents( // S_OK, S_FALSE, or error.
384 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
385 mdTypeDef td, // [IN] TypeDef to scope the enumeration.
386 mdEvent rEvents[], // [OUT] Put events here.
387 ULONG cMax, // [IN] Max events to put.
388 ULONG *pcEvents); // [OUT] Put # put here.
389
390 STDMETHODIMP GetEventProps( // S_OK, S_FALSE, or error.
391 mdEvent ev, // [IN] event token
392 mdTypeDef *pClass, // [OUT] typedef containing the event declarion.
393 LPCWSTR szEvent, // [OUT] Event name
394 ULONG cchEvent, // [IN] the count of wchar of szEvent
395 ULONG *pchEvent, // [OUT] actual count of wchar for event's name
396 DWORD *pdwEventFlags, // [OUT] Event flags.
397 mdToken *ptkEventType, // [OUT] EventType class
398 mdMethodDef *pmdAddOn, // [OUT] AddOn method of the event
399 mdMethodDef *pmdRemoveOn, // [OUT] RemoveOn method of the event
400 mdMethodDef *pmdFire, // [OUT] Fire method of the event
401 mdMethodDef rmdOtherMethod[], // [OUT] other method of the event
402 ULONG cMax, // [IN] size of rmdOtherMethod
403 ULONG *pcOtherMethod); // [OUT] total number of other method of this event
404
405 STDMETHODIMP EnumMethodSemantics( // S_OK, S_FALSE, or error.
406 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
407 mdMethodDef mb, // [IN] MethodDef to scope the enumeration.
408 mdToken rEventProp[], // [OUT] Put Event/Property here.
409 ULONG cMax, // [IN] Max properties to put.
410 ULONG *pcEventProp); // [OUT] Put # put here.
411
412 STDMETHODIMP GetMethodSemantics( // S_OK, S_FALSE, or error.
413 mdMethodDef mb, // [IN] method token
414 mdToken tkEventProp, // [IN] event/property token.
415 DWORD *pdwSemanticsFlags); // [OUT] the role flags for the method/propevent pair
416
417 STDMETHODIMP GetClassLayout(
418 mdTypeDef td, // [IN] give typedef
419 DWORD *pdwPackSize, // [OUT] 1, 2, 4, 8, or 16
420 COR_FIELD_OFFSET rFieldOffset[], // [OUT] field offset array
421 ULONG cMax, // [IN] size of the array
422 ULONG *pcFieldOffset, // [OUT] needed array size
423 ULONG *pulClassSize); // [OUT] the size of the class
424
425 STDMETHODIMP GetFieldMarshal(
426 mdToken tk, // [IN] given a field's memberdef
427 PCCOR_SIGNATURE *ppvNativeType, // [OUT] native type of this field
428 ULONG *pcbNativeType); // [OUT] the count of bytes of *ppvNativeType
429
430 STDMETHODIMP GetRVA( // S_OK or error.
431 mdToken tk, // Member for which to set offset
432 ULONG *pulCodeRVA, // The offset
433 DWORD *pdwImplFlags); // the implementation flags
434
435 STDMETHODIMP GetPermissionSetProps(
436 mdPermission pm, // [IN] the permission token.
437 DWORD *pdwAction, // [OUT] CorDeclSecurity.
438 void const **ppvPermission, // [OUT] permission blob.
439 ULONG *pcbPermission); // [OUT] count of bytes of pvPermission.
440
441 STDMETHODIMP GetSigFromToken( // S_OK or error.
442 mdSignature mdSig, // [IN] Signature token.
443 PCCOR_SIGNATURE *ppvSig, // [OUT] return pointer to token.
444 ULONG *pcbSig); // [OUT] return size of signature.
445
446 STDMETHODIMP GetModuleRefProps( // S_OK or error.
447 mdModuleRef mur, // [IN] moduleref token.
448 __out_ecount_opt (cchName) LPWSTR szName, // [OUT] buffer to fill with the moduleref name.
449 ULONG cchName, // [IN] size of szName in wide characters.
450 ULONG *pchName); // [OUT] actual count of characters in the name.
451
452 STDMETHODIMP EnumModuleRefs( // S_OK or error.
453 HCORENUM *phEnum, // [IN|OUT] pointer to the enum.
454 mdModuleRef rModuleRefs[], // [OUT] put modulerefs here.
455 ULONG cmax, // [IN] max memberrefs to put.
456 ULONG *pcModuleRefs); // [OUT] put # put here.
457
458 STDMETHODIMP GetTypeSpecFromToken( // S_OK or error.
459 mdTypeSpec typespec, // [IN] TypeSpec token.
460 PCCOR_SIGNATURE *ppvSig, // [OUT] return pointer to TypeSpec signature
461 ULONG *pcbSig); // [OUT] return size of signature.
462
463 STDMETHODIMP GetNameFromToken( // S_OK or error.
464 mdToken tk, // [IN] Token to get name from. Must have a name.
465 MDUTF8CSTR *pszUtf8NamePtr); // [OUT] Return pointer to UTF8 name in heap.
466
467 STDMETHODIMP EnumUnresolvedMethods( // S_OK, S_FALSE, or error.
468 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
469 mdToken rMethods[], // [OUT] Put MemberDefs here.
470 ULONG cMax, // [IN] Max MemberDefs to put.
471 ULONG *pcTokens); // [OUT] Put # put here.
472
473 STDMETHODIMP GetUserString( // S_OK or error.
474 mdString stk, // [IN] String token.
475 __out_ecount_opt (cchString) LPWSTR szString, // [OUT] Copy of string.
476 ULONG cchString, // [IN] Max chars of room in szString.
477 ULONG *pchString); // [OUT] How many chars in actual string.
478
479 STDMETHODIMP GetPinvokeMap( // S_OK or error.
480 mdToken tk, // [IN] FieldDef or MethodDef.
481 DWORD *pdwMappingFlags, // [OUT] Flags used for mapping.
482 __out_ecount_opt (cchImportName) LPWSTR szImportName, // [OUT] Import name.
483 ULONG cchImportName, // [IN] Size of the name buffer.
484 ULONG *pchImportName, // [OUT] Actual number of characters stored.
485 mdModuleRef *pmrImportDLL); // [OUT] ModuleRef token for the target DLL.
486
487 STDMETHODIMP EnumSignatures( // S_OK or error.
488 HCORENUM *phEnum, // [IN|OUT] pointer to the enum.
489 mdSignature rSignatures[], // [OUT] put signatures here.
490 ULONG cmax, // [IN] max signatures to put.
491 ULONG *pcSignatures); // [OUT] put # put here.
492
493 STDMETHODIMP EnumTypeSpecs( // S_OK or error.
494 HCORENUM *phEnum, // [IN|OUT] pointer to the enum.
495 mdTypeSpec rTypeSpecs[], // [OUT] put TypeSpecs here.
496 ULONG cmax, // [IN] max TypeSpecs to put.
497 ULONG *pcTypeSpecs); // [OUT] put # put here.
498
499 STDMETHODIMP EnumUserStrings( // S_OK or error.
500 HCORENUM *phEnum, // [IN/OUT] pointer to the enum.
501 mdString rStrings[], // [OUT] put Strings here.
502 ULONG cmax, // [IN] max Strings to put.
503 ULONG *pcStrings); // [OUT] put # put here.
504
505 STDMETHODIMP GetParamForMethodIndex( // S_OK or error.
506 mdMethodDef md, // [IN] Method token.
507 ULONG ulParamSeq, // [IN] Parameter sequence.
508 mdParamDef *ppd); // [IN] Put Param token here.
509
510 STDMETHODIMP GetCustomAttributeByName( // S_OK or error.
511 mdToken tkObj, // [IN] Object with Custom Attribute.
512 LPCWSTR szName, // [IN] Name of desired Custom Attribute.
513 const void **ppData, // [OUT] Put pointer to data here.
514 ULONG *pcbData); // [OUT] Put size of data here.
515
516 STDMETHODIMP EnumCustomAttributes( // S_OK or error.
517 HCORENUM *phEnum, // [IN, OUT] COR enumerator.
518 mdToken tk, // [IN] Token to scope the enumeration, 0 for all.
519 mdToken tkType, // [IN] Type of interest, 0 for all.
520 mdCustomAttribute rCustomAttributes[], // [OUT] Put custom attribute tokens here.
521 ULONG cMax, // [IN] Size of rCustomAttributes.
522 ULONG *pcCustomAttributes); // [OUT, OPTIONAL] Put count of token values here.
523
524 STDMETHODIMP GetCustomAttributeProps( // S_OK or error.
525 mdCustomAttribute cv, // [IN] CustomAttribute token.
526 mdToken *ptkObj, // [OUT, OPTIONAL] Put object token here.
527 mdToken *ptkType, // [OUT, OPTIONAL] Put AttrType token here.
528 void const **ppBlob, // [OUT, OPTIONAL] Put pointer to data here.
529 ULONG *pcbSize); // [OUT, OPTIONAL] Put size of date here.
530
531 STDMETHODIMP FindTypeRef( // S_OK or error.
532 mdToken tkResolutionScope, // ResolutionScope.
533 LPCWSTR szName, // [IN] TypeRef name.
534 mdTypeRef *ptr); // [OUT] matching TypeRef.
535
536 STDMETHODIMP GetMemberProps(
537 mdToken mb, // The member for which to get props.
538 mdTypeDef *pClass, // Put member's class here.
539 __out_ecount_opt (cchMember) LPWSTR szMember, // Put member's name here.
540 ULONG cchMember, // Size of szMember buffer in wide chars.
541 ULONG *pchMember, // Put actual size here
542 DWORD *pdwAttr, // Put flags here.
543 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
544 ULONG *pcbSigBlob, // [OUT] actual size of signature blob
545 ULONG *pulCodeRVA, // [OUT] codeRVA
546 DWORD *pdwImplFlags, // [OUT] Impl. Flags
547 DWORD *pdwCPlusTypeFlag, // [OUT] flag for value type. selected ELEMENT_TYPE_*
548 UVCP_CONSTANT *ppValue, // [OUT] constant value
549 ULONG *pcbValue); // [OUT] size of constant value
550
551 STDMETHODIMP GetFieldProps(
552 mdFieldDef mb, // The field for which to get props.
553 mdTypeDef *pClass, // Put field's class here.
554 __out_ecount_opt (cchField) LPWSTR szField, // Put field's name here.
555 ULONG cchField, // Size of szField buffer in wide chars.
556 ULONG *pchField, // Put actual size here
557 DWORD *pdwAttr, // Put flags here.
558 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
559 ULONG *pcbSigBlob, // [OUT] actual size of signature blob
560 DWORD *pdwCPlusTypeFlag, // [OUT] flag for value type. selected ELEMENT_TYPE_*
561 UVCP_CONSTANT *ppValue, // [OUT] constant value
562 ULONG *pcbValue); // [OUT] size of constant value
563
564 STDMETHODIMP GetPropertyProps( // S_OK, S_FALSE, or error.
565 mdProperty prop, // [IN] property token
566 mdTypeDef *pClass, // [OUT] typedef containing the property declarion.
567 LPCWSTR szProperty, // [OUT] Property name
568 ULONG cchProperty, // [IN] the count of wchar of szProperty
569 ULONG *pchProperty, // [OUT] actual count of wchar for property name
570 DWORD *pdwPropFlags, // [OUT] property flags.
571 PCCOR_SIGNATURE *ppvSig, // [OUT] property type. pointing to meta data internal blob
572 ULONG *pbSig, // [OUT] count of bytes in *ppvSig
573 DWORD *pdwCPlusTypeFlag, // [OUT] flag for value type. selected ELEMENT_TYPE_*
574 UVCP_CONSTANT *ppDefaultValue, // [OUT] constant value
575 ULONG *pcbValue, // [OUT] size of constant value
576 mdMethodDef *pmdSetter, // [OUT] setter method of the property
577 mdMethodDef *pmdGetter, // [OUT] getter method of the property
578 mdMethodDef rmdOtherMethod[], // [OUT] other method of the property
579 ULONG cMax, // [IN] size of rmdOtherMethod
580 ULONG *pcOtherMethod); // [OUT] total number of other method of this property
581
582 STDMETHODIMP GetParamProps( // S_OK or error.
583 mdParamDef tk, // [IN]The Parameter.
584 mdMethodDef *pmd, // [OUT] Parent Method token.
585 ULONG *pulSequence, // [OUT] Parameter sequence.
586 __out_ecount_opt (cchName) LPWSTR szName, // [OUT] Put name here.
587 ULONG cchName, // [OUT] Size of name buffer.
588 ULONG *pchName, // [OUT] Put actual size of name here.
589 DWORD *pdwAttr, // [OUT] Put flags here.
590 DWORD *pdwCPlusTypeFlag, // [OUT] Flag for value type. selected ELEMENT_TYPE_*.
591 UVCP_CONSTANT *ppValue, // [OUT] Constant value.
592 ULONG *pcbValue); // [OUT] size of constant value
593
594 STDMETHODIMP_(BOOL) IsValidToken( // True or False.
595 mdToken tk); // [IN] Given token.
596
597 STDMETHODIMP GetNestedClassProps( // S_OK or error.
598 mdTypeDef tdNestedClass, // [IN] NestedClass token.
599 mdTypeDef *ptdEnclosingClass); // [OUT] EnclosingClass token.
600
601 STDMETHODIMP GetNativeCallConvFromSig( // S_OK or error.
602 void const *pvSig, // [IN] Pointer to signature.
603 ULONG cbSig, // [IN] Count of signature bytes.
604 ULONG *pCallConv); // [OUT] Put calling conv here (see CorPinvokemap).
605
606 STDMETHODIMP IsGlobal( // S_OK or error.
607 mdToken pd, // [IN] Type, Field, or Method token.
608 int *pbGlobal); // [OUT] Put 1 if global, 0 otherwise.
609
610//*****************************************************************************
611// IMetaDataImport2 methods
612//*****************************************************************************
613 STDMETHODIMP GetGenericParamProps( // S_OK or error.
614 mdGenericParam gp, // [IN] GenericParam
615 ULONG *pulParamSeq, // [OUT] Index of the type parameter
616 DWORD *pdwParamFlags, // [OUT] Flags, for future use (e.g. variance)
617 mdToken *ptOwner, // [OUT] Owner (TypeDef or MethodDef)
618 DWORD *reserved, // [OUT] For future use (e.g. non-type parameters)
619 __out_ecount_opt (cchName) LPWSTR wzname, // [OUT] Put name here
620 ULONG cchName, // [IN] Size of buffer
621 ULONG *pchName); // [OUT] Put size of name (wide chars) here.
622
623 STDMETHODIMP GetGenericParamConstraintProps( // S_OK or error.
624 mdGenericParamConstraint gpc, // [IN] GenericParamConstraint
625 mdGenericParam *ptGenericParam, // [OUT] GenericParam that is constrained
626 mdToken *ptkConstraintType); // [OUT] TypeDef/Ref/Spec constraint
627
628 STDMETHODIMP GetMethodSpecProps(
629 mdMethodSpec mi, // [IN] The method instantiation
630 mdToken *tkParent, // [OUT] MethodDef or MemberRef
631 PCCOR_SIGNATURE *ppvSigBlob, // [OUT] point to the blob value of meta data
632 ULONG *pcbSigBlob); // [OUT] actual size of signature blob
633
634 STDMETHODIMP EnumGenericParams( // S_OK or error.
635 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
636 mdToken tk, // [IN] TypeDef or MethodDef whose generic parameters are requested
637 mdGenericParam rGenericParams[], // [OUT] Put GenericParams here.
638 ULONG cMax, // [IN] Max GenericParams to put.
639 ULONG *pcGenericParams); // [OUT] Put # put here.
640
641 STDMETHODIMP EnumGenericParamConstraints( // S_OK or error.
642 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
643 mdGenericParam tk, // [IN] GenericParam whose constraints are requested
644 mdGenericParamConstraint rGenericParamConstraints[], // [OUT] Put GenericParamConstraints here.
645 ULONG cMax, // [IN] Max GenericParamConstraints to put.
646 ULONG *pcGenericParamConstraints); // [OUT] Put # put here.
647
648 STDMETHODIMP EnumMethodSpecs(
649 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
650 mdToken tk, // [IN] MethodDef or MemberRef whose MethodSpecs are requested
651 mdMethodSpec rMethodSpecs[], // [OUT] Put MethodSpecs here.
652 ULONG cMax, // [IN] Max tokens to put.
653 ULONG *pcMethodSpecs); // [OUT] Put actual count here.
654
655 STDMETHODIMP GetPEKind( // S_OK or error.
656 DWORD* pdwPEKind, // [OUT] The kind of PE (0 - not a PE)
657 DWORD* pdwMAchine); // [OUT] Machine as defined in NT header
658
659 STDMETHODIMP GetVersionString( // S_OK or error.
660 __out_ecount_opt (cchBufSize) LPWSTR pwzBuf, // [OUT] Put version string here.
661 DWORD cchBufSize, // [IN] size of the buffer, in wide chars
662 DWORD *pchBufSize); // [OUT] Size of the version string, wide chars, including terminating nul.
663
664//*****************************************************************************
665// IMetaDataAssemblyImport
666//*****************************************************************************
667 STDMETHODIMP GetAssemblyProps( // S_OK or error.
668 mdAssembly mda, // [IN] The Assembly for which to get the properties.
669 const void **ppbPublicKey, // [OUT] Pointer to the public key.
670 ULONG *pcbPublicKey, // [OUT] Count of bytes in the public key.
671 ULONG *pulHashAlgId, // [OUT] Hash Algorithm.
672 __out_ecount_part_opt(cchName, *pchName) LPWSTR szName, // [OUT] Buffer to fill with assembly's simply name.
673 ULONG cchName, // [IN] Size of buffer in wide chars.
674 ULONG *pchName, // [OUT] Actual # of wide chars in name.
675 ASSEMBLYMETADATA *pMetaData, // [OUT] Assembly MetaData.
676 DWORD *pdwAssemblyFlags); // [OUT] Flags.
677
678 STDMETHODIMP GetAssemblyRefProps( // S_OK or error.
679 mdAssemblyRef mdar, // [IN] The AssemblyRef for which to get the properties.
680 const void **ppbPublicKeyOrToken, // [OUT] Pointer to the public key or token.
681 ULONG *pcbPublicKeyOrToken, // [OUT] Count of bytes in the public key or token.
682 __out_ecount_part_opt(cchName, *pchName)LPWSTR szName, // [OUT] Buffer to fill with name.
683 ULONG cchName, // [IN] Size of buffer in wide chars.
684 ULONG *pchName, // [OUT] Actual # of wide chars in name.
685 ASSEMBLYMETADATA *pMetaData, // [OUT] Assembly MetaData.
686 const void **ppbHashValue, // [OUT] Hash blob.
687 ULONG *pcbHashValue, // [OUT] Count of bytes in the hash blob.
688 DWORD *pdwAssemblyRefFlags); // [OUT] Flags.
689
690 STDMETHODIMP GetFileProps( // S_OK or error.
691 mdFile mdf, // [IN] The File for which to get the properties.
692 __out_ecount_part_opt(cchName, *pchName) LPWSTR szName, // [OUT] Buffer to fill with name.
693 ULONG cchName, // [IN] Size of buffer in wide chars.
694 ULONG *pchName, // [OUT] Actual # of wide chars in name.
695 const void **ppbHashValue, // [OUT] Pointer to the Hash Value Blob.
696 ULONG *pcbHashValue, // [OUT] Count of bytes in the Hash Value Blob.
697 DWORD *pdwFileFlags); // [OUT] Flags.
698
699 STDMETHODIMP GetExportedTypeProps( // S_OK or error.
700 mdExportedType mdct, // [IN] The ExportedType for which to get the properties.
701 __out_ecount_part_opt(cchName, *pchName) LPWSTR szName, // [OUT] Buffer to fill with name.
702 ULONG cchName, // [IN] Size of buffer in wide chars.
703 ULONG *pchName, // [OUT] Actual # of wide chars in name.
704 mdToken *ptkImplementation, // [OUT] mdFile or mdAssemblyRef that provides the ExportedType.
705 mdTypeDef *ptkTypeDef, // [OUT] TypeDef token within the file.
706 DWORD *pdwExportedTypeFlags); // [OUT] Flags.
707
708 STDMETHODIMP GetManifestResourceProps( // S_OK or error.
709 mdManifestResource mdmr, // [IN] The ManifestResource for which to get the properties.
710 __out_ecount_part_opt(cchName, *pchName)LPWSTR szName, // [OUT] Buffer to fill with name.
711 ULONG cchName, // [IN] Size of buffer in wide chars.
712 ULONG *pchName, // [OUT] Actual # of wide chars in name.
713 mdToken *ptkImplementation, // [OUT] mdFile or mdAssemblyRef that provides the ExportedType.
714 DWORD *pdwOffset, // [OUT] Offset to the beginning of the resource within the file.
715 DWORD *pdwResourceFlags); // [OUT] Flags.
716
717 STDMETHODIMP EnumAssemblyRefs( // S_OK or error
718 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
719 mdAssemblyRef rAssemblyRefs[], // [OUT] Put AssemblyRefs here.
720 ULONG cMax, // [IN] Max AssemblyRefs to put.
721 ULONG *pcTokens); // [OUT] Put # put here.
722
723 STDMETHODIMP EnumFiles( // S_OK or error
724 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
725 mdFile rFiles[], // [OUT] Put Files here.
726 ULONG cMax, // [IN] Max Files to put.
727 ULONG *pcTokens); // [OUT] Put # put here.
728
729 STDMETHODIMP EnumExportedTypes( // S_OK or error
730 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
731 mdExportedType rExportedTypes[], // [OUT] Put ExportedTypes here.
732 ULONG cMax, // [IN] Max ExportedTypes to put.
733 ULONG *pcTokens); // [OUT] Put # put here.
734
735 STDMETHODIMP EnumManifestResources( // S_OK or error
736 HCORENUM *phEnum, // [IN|OUT] Pointer to the enum.
737 mdManifestResource rManifestResources[], // [OUT] Put ManifestResources here.
738 ULONG cMax, // [IN] Max Resources to put.
739 ULONG *pcTokens); // [OUT] Put # put here.
740
741 STDMETHODIMP FindExportedTypeByName( // S_OK or error
742 LPCWSTR szName, // [IN] Name of the ExportedType.
743 mdExportedType tkEnclosingType, // [IN] Enclosing ExportedType.
744 mdExportedType *ptkExportedType); // [OUT] Put the ExportedType token here.
745
746 STDMETHODIMP FindManifestResourceByName(// S_OK or error
747 LPCWSTR szName, // [IN] Name of the ManifestResource.
748 mdManifestResource *ptkManifestResource); // [OUT] Put the ManifestResource token here.
749
750 STDMETHODIMP GetAssemblyFromScope( // S_OK or error
751 mdAssembly *ptkAssembly); // [OUT] Put token here.
752
753 // This uses Fusion to lookup, so it's E_NOTIMPL in the standalone versions.
754 STDMETHODIMP FindAssembliesByName( // S_OK or error
755 LPCWSTR szAppBase, // [IN] optional - can be NULL
756 LPCWSTR szPrivateBin, // [IN] optional - can be NULL
757 LPCWSTR szAssemblyName, // [IN] required - this is the assembly you are requesting
758 IUnknown *ppIUnk[], // [OUT] put IMetaDataAssemblyImport pointers here
759 ULONG cMax, // [IN] The max number to put
760 ULONG *pcAssemblies); // [OUT] The number of assemblies returned.
761
762#ifdef FEATURE_METADATA_EMIT
763//*****************************************************************************
764// IMetaDataEmit
765//*****************************************************************************
766 STDMETHODIMP DefineMethod( // S_OK or error.
767 mdTypeDef td, // Parent TypeDef
768 LPCWSTR szName, // Name of member
769 DWORD dwMethodFlags, // Member attributes
770 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
771 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
772 ULONG ulCodeRVA,
773 DWORD dwImplFlags,
774 mdMethodDef *pmd); // Put member token here
775
776 STDMETHODIMP DefineMethodImpl( // S_OK or error.
777 mdTypeDef td, // [IN] The class implementing the method
778 mdToken tkBody, // [IN] Method body, MethodDef or MethodRef
779 mdToken tkDecl); // [IN] Method declaration, MethodDef or MethodRef
780
781 STDMETHODIMP SetMethodImplFlags( // [IN] S_OK or error.
782 mdMethodDef md, // [IN] Method for which to set impl flags
783 DWORD dwImplFlags);
784
785 STDMETHODIMP SetFieldRVA( // [IN] S_OK or error.
786 mdFieldDef fd, // [IN] Field for which to set offset
787 ULONG ulRVA); // [IN] The offset
788
789 STDMETHODIMP DefineTypeRefByName( // S_OK or error.
790 mdToken tkResolutionScope, // [IN] ModuleRef or AssemblyRef.
791 LPCWSTR szName, // [IN] Name of the TypeRef.
792 mdTypeRef *ptr); // [OUT] Put TypeRef token here.
793
794 STDMETHODIMP DefineImportType( // S_OK or error.
795 IMetaDataAssemblyImport *pAssemImport, // [IN] Assemby containing the TypeDef.
796 const void *pbHashValue, // [IN] Hash Blob for Assembly.
797 ULONG cbHashValue, // [IN] Count of bytes.
798 IMetaDataImport *pImport, // [IN] Scope containing the TypeDef.
799 mdTypeDef tdImport, // [IN] The imported TypeDef.
800 IMetaDataAssemblyEmit *pAssemEmit, // [IN] Assembly into which the TypeDef is imported.
801 mdTypeRef *ptr); // [OUT] Put TypeRef token here.
802
803 STDMETHODIMP DefineMemberRef( // S_OK or error
804 mdToken tkImport, // [IN] ClassRef or ClassDef importing a member.
805 LPCWSTR szName, // [IN] member's name
806 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
807 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
808 mdMemberRef *pmr); // [OUT] memberref token
809
810 STDMETHODIMP DefineImportMember( // S_OK or error.
811 IMetaDataAssemblyImport *pAssemImport, // [IN] Assemby containing the Member.
812 const void *pbHashValue, // [IN] Hash Blob for Assembly.
813 ULONG cbHashValue, // [IN] Count of bytes.
814 IMetaDataImport *pImport, // [IN] Import scope, with member.
815 mdToken mbMember, // [IN] Member in import scope.
816 IMetaDataAssemblyEmit *pAssemEmit, // [IN] Assembly into which the Member is imported.
817 mdToken tkImport, // [IN] Classref or classdef in emit scope.
818 mdMemberRef *pmr); // [OUT] Put member ref here.
819
820 STDMETHODIMP DefineEvent(
821 mdTypeDef td, // [IN] the class/interface on which the event is being defined
822 LPCWSTR szEvent, // [IN] Name of the event
823 DWORD dwEventFlags, // [IN] CorEventAttr
824 mdToken tkEventType, // [IN] a reference (mdTypeRef or mdTypeRef(to the Event class
825 mdMethodDef mdAddOn, // [IN] required add method
826 mdMethodDef mdRemoveOn, // [IN] required remove method
827 mdMethodDef mdFire, // [IN] optional fire method
828 mdMethodDef rmdOtherMethods[], // [IN] optional array of other methods associate with the event
829 mdEvent *pmdEvent); // [OUT] output event token
830
831 STDMETHODIMP SetClassLayout(
832 mdTypeDef td, // [IN] typedef
833 DWORD dwPackSize, // [IN] packing size specified as 1, 2, 4, 8, or 16
834 COR_FIELD_OFFSET rFieldOffsets[], // [IN] array of layout specification
835 ULONG ulClassSize); // [IN] size of the class
836
837 STDMETHODIMP DeleteClassLayout(
838 mdTypeDef td); // [IN] typdef token
839
840 STDMETHODIMP SetFieldMarshal(
841 mdToken tk, // [IN] given a fieldDef or paramDef token
842 PCCOR_SIGNATURE pvNativeType, // [IN] native type specification
843 ULONG cbNativeType); // [IN] count of bytes of pvNativeType
844
845 STDMETHODIMP DeleteFieldMarshal(
846 mdToken tk); // [IN] fieldDef or paramDef token to be deleted.
847
848 STDMETHODIMP DefinePermissionSet(
849 mdToken tk, // [IN] the object to be decorated.
850 DWORD dwAction, // [IN] CorDeclSecurity.
851 void const *pvPermission, // [IN] permission blob.
852 ULONG cbPermission, // [IN] count of bytes of pvPermission.
853 mdPermission *ppm); // [OUT] returned permission token.
854
855 STDMETHODIMP SetRVA( // [IN] S_OK or error.
856 mdToken md, // [IN] MethodDef for which to set offset
857 ULONG ulRVA); // [IN] The offset#endif
858
859 STDMETHODIMP GetTokenFromSig( // [IN] S_OK or error.
860 PCCOR_SIGNATURE pvSig, // [IN] Signature to define.
861 ULONG cbSig, // [IN] Size of signature data.
862 mdSignature *pmsig); // [OUT] returned signature token.
863
864 STDMETHODIMP DefineModuleRef( // S_OK or error.
865 LPCWSTR szName, // [IN] DLL name
866 mdModuleRef *pmur); // [OUT] returned module ref token
867
868 STDMETHODIMP SetParent( // S_OK or error.
869 mdMemberRef mr, // [IN] Token for the ref to be fixed up.
870 mdToken tk); // [IN] The ref parent.
871
872 STDMETHODIMP GetTokenFromTypeSpec( // S_OK or error.
873 PCCOR_SIGNATURE pvSig, // [IN] ArraySpec Signature to define.
874 ULONG cbSig, // [IN] Size of signature data.
875 mdTypeSpec *ptypespec); // [OUT] returned TypeSpec token.
876
877 STDMETHODIMP SaveToMemory( // S_OK or error.
878 void *pbData, // [OUT] Location to write data.
879 ULONG cbData); // [IN] Max size of data buffer.
880
881 STDMETHODIMP DefineUserString( // S_OK or error.
882 LPCWSTR szString, // [IN] User literal string.
883 ULONG cchString, // [IN] Length of string.
884 mdString *pstk); // [OUT] String token.
885
886 STDMETHODIMP DeleteToken( // Return code.
887 mdToken tkObj); // [IN] The token to be deleted
888
889 STDMETHODIMP SetTypeDefProps( // S_OK or error.
890 mdTypeDef td, // [IN] The TypeDef.
891 DWORD dwTypeDefFlags, // [IN] TypeDef flags.
892 mdToken tkExtends, // [IN] Base TypeDef or TypeRef.
893 mdToken rtkImplements[]); // [IN] Implemented interfaces.
894
895 STDMETHODIMP DefineNestedType( // S_OK or error.
896 LPCWSTR szTypeDef, // [IN] Name of TypeDef
897 DWORD dwTypeDefFlags, // [IN] CustomAttribute flags
898 mdToken tkExtends, // [IN] extends this TypeDef or typeref
899 mdToken rtkImplements[], // [IN] Implements interfaces
900 mdTypeDef tdEncloser, // [IN] TypeDef token of the enclosing type.
901 mdTypeDef *ptd); // [OUT] Put TypeDef token here
902
903 STDMETHODIMP SetMethodProps( // S_OK or error.
904 mdMethodDef md, // [IN] The MethodDef.
905 DWORD dwMethodFlags, // [IN] Method attributes.
906 ULONG ulCodeRVA, // [IN] Code RVA.
907 DWORD dwImplFlags); // [IN] MethodImpl flags.
908
909 STDMETHODIMP SetEventProps( // S_OK or error.
910 mdEvent ev, // [IN] The event token.
911 DWORD dwEventFlags, // [IN] CorEventAttr.
912 mdToken tkEventType, // [IN] A reference (mdTypeRef or mdTypeRef) to the Event class.
913 mdMethodDef mdAddOn, // [IN] Add method.
914 mdMethodDef mdRemoveOn, // [IN] Remove method.
915 mdMethodDef mdFire, // [IN] Fire method.
916 mdMethodDef rmdOtherMethods[]); // [IN] Array of other methods associated with the event.
917
918 STDMETHODIMP SetPermissionSetProps( // S_OK or error.
919 mdToken tk, // [IN] The object to be decorated.
920 DWORD dwAction, // [IN] CorDeclSecurity.
921 void const *pvPermission, // [IN] Permission blob.
922 ULONG cbPermission, // [IN] Count of bytes of pvPermission.
923 mdPermission *ppm); // [OUT] Permission token.
924
925 STDMETHODIMP DefinePinvokeMap( // Return code.
926 mdToken tk, // [IN] FieldDef or MethodDef.
927 DWORD dwMappingFlags, // [IN] Flags used for mapping.
928 LPCWSTR szImportName, // [IN] Import name.
929 mdModuleRef mrImportDLL); // [IN] ModuleRef token for the target DLL.
930
931 STDMETHODIMP SetPinvokeMap( // Return code.
932 mdToken tk, // [IN] FieldDef or MethodDef.
933 DWORD dwMappingFlags, // [IN] Flags used for mapping.
934 LPCWSTR szImportName, // [IN] Import name.
935 mdModuleRef mrImportDLL); // [IN] ModuleRef token for the target DLL.
936
937 STDMETHODIMP DeletePinvokeMap( // Return code.
938 mdToken tk); // [IN]FieldDef or MethodDef.
939
940 STDMETHODIMP DefineCustomAttribute( // Return code.
941 mdToken tkOwner, // [IN] The object to put the value on.
942 mdToken tkCtor, // [IN] Constructor of the CustomAttribute type (MemberRef/MethodDef).
943 void const *pCustomAttribute, // [IN] The custom value data.
944 ULONG cbCustomAttribute, // [IN] The custom value data length.
945 mdCustomAttribute *pcv); // [OUT] The custom value token value on return.
946
947 STDMETHODIMP SetCustomAttributeValue( // Return code.
948 mdCustomAttribute pcv, // [IN] The custom value token whose value to replace.
949 void const *pCustomAttribute, // [IN] The custom value data.
950 ULONG cbCustomAttribute); // [IN] The custom value data length.
951
952 STDMETHODIMP DefineField( // S_OK or error.
953 mdTypeDef td, // Parent TypeDef
954 LPCWSTR szName, // Name of member
955 DWORD dwFieldFlags, // Member attributes
956 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
957 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
958 DWORD dwCPlusTypeFlag, // [IN] flag for value type. selected ELEMENT_TYPE_*
959 void const *pValue, // [IN] constant value
960 ULONG cchValue, // [IN] size of constant value (string, in wide chars).
961 mdFieldDef *pmd); // [OUT] Put member token here
962
963 STDMETHODIMP DefineProperty(
964 mdTypeDef td, // [IN] the class/interface on which the property is being defined
965 LPCWSTR szProperty, // [IN] Name of the property
966 DWORD dwPropFlags, // [IN] CorPropertyAttr
967 PCCOR_SIGNATURE pvSig, // [IN] the required type signature
968 ULONG cbSig, // [IN] the size of the type signature blob
969 DWORD dwCPlusTypeFlag, // [IN] flag for value type. selected ELEMENT_TYPE_*
970 void const *pValue, // [IN] constant value
971 ULONG cchValue, // [IN] size of constant value (string, in wide chars).
972 mdMethodDef mdSetter, // [IN] optional setter of the property
973 mdMethodDef mdGetter, // [IN] optional getter of the property
974 mdMethodDef rmdOtherMethods[], // [IN] an optional array of other methods
975 mdProperty *pmdProp); // [OUT] output property token
976
977 STDMETHODIMP DefineParam(
978 mdMethodDef md, // [IN] Owning method
979 ULONG ulParamSeq, // [IN] Which param
980 LPCWSTR szName, // [IN] Optional param name
981 DWORD dwParamFlags, // [IN] Optional param flags
982 DWORD dwCPlusTypeFlag, // [IN] flag for value type. selected ELEMENT_TYPE_*
983 void const *pValue, // [IN] constant value
984 ULONG cchValue, // [IN] size of constant value (string, in wide chars).
985 mdParamDef *ppd); // [OUT] Put param token here
986
987 STDMETHODIMP SetFieldProps( // S_OK or error.
988 mdFieldDef fd, // [IN] The FieldDef.
989 DWORD dwFieldFlags, // [IN] Field attributes.
990 DWORD dwCPlusTypeFlag, // [IN] Flag for the value type, selected ELEMENT_TYPE_*
991 void const *pValue, // [IN] Constant value.
992 ULONG cchValue); // [IN] size of constant value (string, in wide chars).
993
994 STDMETHODIMP SetPropertyProps( // S_OK or error.
995 mdProperty pr, // [IN] Property token.
996 DWORD dwPropFlags, // [IN] CorPropertyAttr.
997 DWORD dwCPlusTypeFlag, // [IN] Flag for value type, selected ELEMENT_TYPE_*
998 void const *pValue, // [IN] Constant value.
999 ULONG cchValue, // [IN] size of constant value (string, in wide chars).
1000 mdMethodDef mdSetter, // [IN] Setter of the property.
1001 mdMethodDef mdGetter, // [IN] Getter of the property.
1002 mdMethodDef rmdOtherMethods[]); // [IN] Array of other methods.
1003
1004 STDMETHODIMP SetParamProps( // Return code.
1005 mdParamDef pd, // [IN] Param token.
1006 LPCWSTR szName, // [IN] Param name.
1007 DWORD dwParamFlags, // [IN] Param flags.
1008 DWORD dwCPlusTypeFlag, // [IN] Flag for value type. selected ELEMENT_TYPE_*.
1009 void const *pValue, // [OUT] Constant value.
1010 ULONG cchValue); // [IN] size of constant value (string, in wide chars).
1011
1012 STDMETHODIMP ApplyEditAndContinue( // S_OK or error.
1013 IUnknown *pImport); // [IN] Metadata from the delta PE.
1014
1015 // Specialized Custom Attributes for security.
1016 STDMETHODIMP DefineSecurityAttributeSet(// Return code.
1017 mdToken tkObj, // [IN] Class or method requiring security attributes.
1018 COR_SECATTR rSecAttrs[], // [IN] Array of security attribute descriptions.
1019 ULONG cSecAttrs, // [IN] Count of elements in above array.
1020 ULONG *pulErrorAttr); // [OUT] On error, index of attribute causing problem.
1021
1022 STDMETHODIMP TranslateSigWithScope(
1023 IMetaDataAssemblyImport *pAssemImport, // [IN] assembly importing interface
1024 const void *pbHashValue, // [IN] Hash Blob for Assembly.
1025 ULONG cbHashValue, // [IN] Count of bytes.
1026 IMetaDataImport *import, // [IN] importing interface
1027 PCCOR_SIGNATURE pbSigBlob, // [IN] signature in the importing scope
1028 ULONG cbSigBlob, // [IN] count of bytes of signature
1029 IMetaDataAssemblyEmit *pAssemEmti, // [IN] emit assembly interface
1030 IMetaDataEmit *emit, // [IN] emit interface
1031 PCOR_SIGNATURE pvTranslatedSig, // [OUT] buffer to hold translated signature
1032 ULONG cbTranslatedSigMax,
1033 ULONG *pcbTranslatedSig); // [OUT] count of bytes in the translated signature
1034
1035//*****************************************************************************
1036// IMetaDataEmit2 methods
1037//*****************************************************************************
1038 STDMETHODIMP SetModuleProps( // S_OK or error.
1039 LPCWSTR szName); // [IN] If not NULL, the name to set.
1040
1041 STDMETHODIMP Save( // S_OK or error.
1042 LPCWSTR szFile, // [IN] The filename to save to.
1043 DWORD dwSaveFlags); // [IN] Flags for the save.
1044
1045 STDMETHODIMP SaveToStream( // S_OK or error.
1046 IStream *pIStream, // [IN] A writable stream to save to.
1047 DWORD dwSaveFlags); // [IN] Flags for the save.
1048
1049 STDMETHODIMP GetSaveSize( // S_OK or error.
1050 CorSaveSize fSave, // [IN] cssAccurate or cssQuick.
1051 DWORD *pdwSaveSize); // [OUT] Put the size here.
1052
1053 STDMETHODIMP Merge( // S_OK or error.
1054 IMetaDataImport *pImport, // [IN] The scope to be merged.
1055 IMapToken *pHostMapToken, // [IN] Host IMapToken interface to receive token remap notification
1056 IUnknown *pHandler); // [IN] An object to receive to receive error notification.
1057
1058 STDMETHODIMP MergeEnd(); // S_OK or error.
1059
1060 STDMETHODIMP DefineMethodSpec( // S_OK or error
1061 mdToken tkImport, // [IN] MethodDef or MemberRef
1062 PCCOR_SIGNATURE pvSigBlob, // [IN] point to a blob value of COM+ signature
1063 ULONG cbSigBlob, // [IN] count of bytes in the signature blob
1064 mdMethodSpec *pmi); // [OUT] method instantiation token
1065
1066 STDMETHODIMP DefineTypeDef( // S_OK or error.
1067 LPCWSTR szTypeDef, // [IN] Name of TypeDef
1068 DWORD dwTypeDefFlags, // [IN] CustomAttribute flags
1069 mdToken tkExtends, // [IN] extends this TypeDef or typeref
1070 mdToken rtkImplements[], // [IN] Implements interfaces
1071 mdTypeDef *ptd); // [OUT] Put TypeDef token here
1072
1073 STDMETHODIMP SetHandler( // S_OK.
1074 IUnknown *pUnk); // [IN] The new error handler.
1075
1076 STDMETHODIMP GetDeltaSaveSize( // S_OK or error.
1077 CorSaveSize fSave, // [IN] cssAccurate or cssQuick.
1078 DWORD *pdwSaveSize); // [OUT] Put the size here.
1079
1080 STDMETHODIMP SaveDelta( // S_OK or error.
1081 LPCWSTR szFile, // [IN] The filename to save to.
1082 DWORD dwSaveFlags); // [IN] Flags for the save.
1083
1084 STDMETHODIMP SaveDeltaToStream( // S_OK or error.
1085 IStream *pIStream, // [IN] A writable stream to save to.
1086 DWORD dwSaveFlags); // [IN] Flags for the save.
1087
1088 STDMETHODIMP SaveDeltaToMemory( // S_OK or error.
1089 void *pbData, // [OUT] Location to write data.
1090 ULONG cbData); // [IN] Max size of data buffer.
1091
1092 STDMETHODIMP ResetENCLog(); // S_OK or error.
1093
1094 STDMETHODIMP DefineGenericParam( // S_OK or error.
1095 mdToken tk, // [IN] TypeDef or MethodDef
1096 ULONG ulParamSeq, // [IN] Index of the type parameter
1097 DWORD dwParamFlags, // [IN] Flags, for future use (e.g. variance)
1098 LPCWSTR szname, // [IN] Name
1099 DWORD reserved, // [IN] For future use (e.g. non-type parameters)
1100 mdToken rtkConstraints[], // [IN] Array of type constraints (TypeDef,TypeRef,TypeSpec)
1101 mdGenericParam *pgp); // [OUT] Put GenericParam token here
1102
1103 STDMETHODIMP SetGenericParamProps( // S_OK or error.
1104 mdGenericParam gp, // [IN] GenericParam
1105 DWORD dwParamFlags, // [IN] Flags, for future use (e.g. variance)
1106 LPCWSTR szName, // [IN] Optional name
1107 DWORD reserved, // [IN] For future use (e.g. non-type parameters)
1108 mdToken rtkConstraints[]); // [IN] Array of type constraints (TypeDef,TypeRef,TypeSpec)
1109
1110//*****************************************************************************
1111// IMetaDataAssemblyEmit
1112//*****************************************************************************
1113 STDMETHODIMP DefineAssembly( // S_OK or error.
1114 const void *pbPublicKey, // [IN] Public key of the assembly.
1115 ULONG cbPublicKey, // [IN] Count of bytes in the public key.
1116 ULONG ulHashAlgId, // [IN] Hash Algorithm.
1117 LPCWSTR szName, // [IN] Name of the assembly.
1118 const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData.
1119 DWORD dwAssemblyFlags, // [IN] Flags.
1120 mdAssembly *pma); // [OUT] Returned Assembly token.
1121
1122 STDMETHODIMP DefineAssemblyRef( // S_OK or error.
1123 const void *pbPublicKeyOrToken, // [IN] Public key or token of the assembly.
1124 ULONG cbPublicKeyOrToken, // [IN] Count of bytes in the public key or token.
1125 LPCWSTR szName, // [IN] Name of the assembly being referenced.
1126 const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData.
1127 const void *pbHashValue, // [IN] Hash Blob.
1128 ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob.
1129 DWORD dwAssemblyRefFlags, // [IN] Token for Execution Location.
1130 mdAssemblyRef *pmar); // [OUT] Returned AssemblyRef token.
1131
1132 STDMETHODIMP DefineFile( // S_OK or error.
1133 LPCWSTR szName, // [IN] Name of the file.
1134 const void *pbHashValue, // [IN] Hash Blob.
1135 ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob.
1136 DWORD dwFileFlags, // [IN] Flags.
1137 mdFile *pmf); // [OUT] Returned File token.
1138
1139 STDMETHODIMP DefineExportedType( // S_OK or error.
1140 LPCWSTR szName, // [IN] Name of the Com Type.
1141 mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the ExportedType.
1142 mdTypeDef tkTypeDef, // [IN] TypeDef token within the file.
1143 DWORD dwExportedTypeFlags, // [IN] Flags.
1144 mdExportedType *pmct); // [OUT] Returned ExportedType token.
1145
1146 STDMETHODIMP DefineManifestResource( // S_OK or error.
1147 LPCWSTR szName, // [IN] Name of the resource.
1148 mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the resource.
1149 DWORD dwOffset, // [IN] Offset to the beginning of the resource within the file.
1150 DWORD dwResourceFlags, // [IN] Flags.
1151 mdManifestResource *pmmr); // [OUT] Returned ManifestResource token.
1152
1153 STDMETHODIMP SetAssemblyProps( // S_OK or error.
1154 mdAssembly pma, // [IN] Assembly token.
1155 const void *pbPublicKey, // [IN] Public key of the assembly.
1156 ULONG cbPublicKey, // [IN] Count of bytes in the public key.
1157 ULONG ulHashAlgId, // [IN] Hash Algorithm.
1158 LPCWSTR szName, // [IN] Name of the assembly.
1159 const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData.
1160 DWORD dwAssemblyFlags); // [IN] Flags.
1161
1162 STDMETHODIMP SetAssemblyRefProps( // S_OK or error.
1163 mdAssemblyRef ar, // [IN] AssemblyRefToken.
1164 const void *pbPublicKeyOrToken, // [IN] Public key or token of the assembly.
1165 ULONG cbPublicKeyOrToken, // [IN] Count of bytes in the public key or token.
1166 LPCWSTR szName, // [IN] Name of the assembly being referenced.
1167 const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData.
1168 const void *pbHashValue, // [IN] Hash Blob.
1169 ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob.
1170 DWORD dwAssemblyRefFlags); // [IN] Token for Execution Location.
1171
1172 STDMETHODIMP SetFileProps( // S_OK or error.
1173 mdFile file, // [IN] File token.
1174 const void *pbHashValue, // [IN] Hash Blob.
1175 ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob.
1176 DWORD dwFileFlags); // [IN] Flags.
1177
1178 STDMETHODIMP SetExportedTypeProps( // S_OK or error.
1179 mdExportedType ct, // [IN] ExportedType token.
1180 mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the ExportedType.
1181 mdTypeDef tkTypeDef, // [IN] TypeDef token within the file.
1182 DWORD dwExportedTypeFlags); // [IN] Flags.
1183
1184 STDMETHODIMP SetManifestResourceProps( // S_OK or error.
1185 mdManifestResource mr, // [IN] ManifestResource token.
1186 mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the resource.
1187 DWORD dwOffset, // [IN] Offset to the beginning of the resource within the file.
1188 DWORD dwResourceFlags); // [IN] Flags.
1189
1190#endif //FEATURE_METADATA_EMIT
1191
1192#ifdef FEATURE_METADATA_EMIT_ALL
1193//*****************************************************************************
1194// IMetaDataFilter
1195//*****************************************************************************
1196 STDMETHODIMP UnmarkAll(); // unmark everything in a module
1197
1198 STDMETHODIMP MarkToken(
1199 mdToken tk); // [IN] Token to be marked
1200
1201 STDMETHODIMP IsTokenMarked(
1202 mdToken tk, // [IN] Token to be checked
1203 BOOL *pIsMarked); // [OUT] TRUE if token is marked
1204
1205#endif //FEATURE_METADATA_EMIT_ALL
1206
1207#ifdef FEATURE_METADATA_INTERNAL_APIS
1208
1209//*****************************************************************************
1210// IMetaDataEmitHelper
1211//*****************************************************************************
1212 STDMETHODIMP DefineMethodSemanticsHelper(
1213 mdToken tkAssociation, // [IN] property or event token
1214 DWORD dwFlags, // [IN] semantics
1215 mdMethodDef md); // [IN] method to associated with
1216
1217 STDMETHODIMP SetFieldLayoutHelper( // Return hresult.
1218 mdFieldDef fd, // [IN] field to associate the layout info
1219 ULONG ulOffset); // [IN] the offset for the field
1220
1221 STDMETHODIMP DefineEventHelper(
1222 mdTypeDef td, // [IN] the class/interface on which the event is being defined
1223 LPCWSTR szEvent, // [IN] Name of the event
1224 DWORD dwEventFlags, // [IN] CorEventAttr
1225 mdToken tkEventType, // [IN] a reference (mdTypeRef or mdTypeRef) to the Event class
1226 mdEvent *pmdEvent); // [OUT] output event token
1227
1228 STDMETHODIMP AddDeclarativeSecurityHelper(
1229 mdToken tk, // [IN] Parent token (typedef/methoddef)
1230 DWORD dwAction, // [IN] Security action (CorDeclSecurity)
1231 void const *pValue, // [IN] Permission set blob
1232 DWORD cbValue, // [IN] Byte count of permission set blob
1233 mdPermission*pmdPermission); // [OUT] Output permission token
1234
1235 STDMETHODIMP SetResolutionScopeHelper( // Return hresult.
1236 mdTypeRef tr, // [IN] TypeRef record to update
1237 mdToken rs); // [IN] new ResolutionScope
1238
1239 STDMETHODIMP SetManifestResourceOffsetHelper( // Return hresult.
1240 mdManifestResource mr, // [IN] The manifest token
1241 ULONG ulOffset); // [IN] new offset
1242
1243 STDMETHODIMP SetTypeParent( // Return hresult.
1244 mdTypeDef td, // [IN] Type definition
1245 mdToken tkExtends); // [IN] parent type
1246
1247 STDMETHODIMP AddInterfaceImpl( // Return hresult.
1248 mdTypeDef td, // [IN] Type definition
1249 mdToken tkInterface); // [IN] interface type
1250
1251//*****************************************************************************
1252// IMDInternalEmit
1253//*****************************************************************************
1254
1255 STDMETHODIMP ChangeMvid( // S_OK or error.
1256 REFGUID newMvid); // GUID to use as the MVID
1257
1258 STDMETHOD(SetMDUpdateMode)(
1259 ULONG updateMode, ULONG *pPreviousUpdateMode);
1260
1261//*****************************************************************************
1262// IMetaDataHelper
1263//*****************************************************************************
1264 STDMETHODIMP GetMetadata( // Result.
1265 ULONG ulSelect, // [IN] Selector.
1266 void **ppData); // [OUT] Put pointer to data here.
1267
1268 STDMETHODIMP_(IUnknown *) GetCachedInternalInterface(BOOL fWithLock); // S_OK or error
1269 STDMETHODIMP SetCachedInternalInterface(IUnknown *pUnk); // S_OK or error
1270 STDMETHODIMP SetReaderWriterLock(UTSemReadWrite * pSem)
1271 {
1272 _ASSERTE(m_pSemReadWrite == NULL);
1273 m_pSemReadWrite = pSem;
1274 INDEBUG(m_pStgdb->m_MiniMd.Debug_SetLock(m_pSemReadWrite);)
1275 return NOERROR;
1276 }
1277 STDMETHODIMP_(UTSemReadWrite *) GetReaderWriterLock() { return m_pSemReadWrite; }
1278
1279#ifndef FEATURE_METADATA_EMIT
1280 // This method is also part of IMetaDataEmit interface, do not declare it twice
1281 STDMETHODIMP TranslateSigWithScope(
1282 IMetaDataAssemblyImport *pAssemImport, // [IN] assembly importing interface
1283 const void *pbHashValue, // [IN] Hash Blob for Assembly.
1284 ULONG cbHashValue, // [IN] Count of bytes.
1285 IMetaDataImport *import, // [IN] importing interface
1286 PCCOR_SIGNATURE pbSigBlob, // [IN] signature in the importing scope
1287 ULONG cbSigBlob, // [IN] count of bytes of signature
1288 IMetaDataAssemblyEmit *pAssemEmti, // [IN] emit assembly interface
1289 IMetaDataEmit *emit, // [IN] emit interface
1290 PCOR_SIGNATURE pvTranslatedSig, // [OUT] buffer to hold translated signature
1291 ULONG cbTranslatedSigMax,
1292 ULONG *pcbTranslatedSig); // [OUT] count of bytes in the translated signature
1293#endif //!FEATURE_METADATA_EMIT
1294
1295 //*****************************************************************************
1296 // IGetIMDInternalImport methods
1297 //*****************************************************************************
1298 STDMETHOD(GetIMDInternalImport) (
1299 IMDInternalImport ** ppIMDInternalImport // [OUT] Buffer to receive IMDInternalImport*
1300 );
1301
1302#endif //FEATURE_METADATA_INTERNAL_APIS
1303
1304//*****************************************************************************
1305// IMetaDataTables
1306//*****************************************************************************
1307
1308 // Fills size (*pcbStringsHeapSize) of internal strings heap (#String).
1309 // Returns S_OK or error code. Fills *pcbStringsHeapSize with 0 on error.
1310 // Implements public API code:IMetaDataTables::GetStringHeapSize.
1311 STDMETHODIMP GetStringHeapSize(
1312 __out ULONG *pcbStringsHeapSize); // [OUT] Size of the string heap.
1313
1314 // Fills size (*pcbBlobsHeapSize) of blobs heap (#Blob).
1315 // Returns S_OK or error code. Fills *pcbBlobsHeapSize with 0 on error.
1316 // Implements public API code:IMetaDataTables::GetBlobHeapSize.
1317 STDMETHODIMP GetBlobHeapSize(
1318 __out ULONG *pcbBlobsHeapSize); // [OUT] Size of the blob heap.
1319
1320 // Fills size (*pcbGuidsHeapSize) of guids heap (#GUID).
1321 // Returns S_OK or error code. Fills *pcbGuidsHeapSize with 0 on error.
1322 // Implements public API code:IMetaDataTables::GetGuidHeapSize.
1323 STDMETHODIMP GetGuidHeapSize(
1324 __out ULONG *pcbGuidsHeapSize); // [OUT] Size of the Guid heap.
1325
1326 // Fills size (*pcbUserStringsHeapSize) of user strings heap (#US) (referenced from IL).
1327 // Returns S_OK or error code. Fills *pcbUserStringsHeapSize with 0 on error.
1328 // Implements public API code:IMetaDataTables::GetUserStringHeapSize.
1329 // Backward compatibility: returns S_OK even if the string doesn't have odd number of bytes as specified
1330 // in CLI ECMA specification.
1331 STDMETHODIMP GetUserStringHeapSize(
1332 __out ULONG *pcbUserStringsHeapSize); // [OUT] Size of the user string heap.
1333
1334 // Implements public API code:IMetaDataTables::GetNumTables.
1335 STDMETHODIMP GetNumTables(
1336 __out ULONG *pcTables); // [OUT] Count of tables.
1337
1338 // Implements public API code:IMetaDataTables::GetNumTables.
1339 STDMETHODIMP GetTableIndex(
1340 ULONG token, // [IN] Token for which to get table index.
1341 __out ULONG *pixTbl); // [OUT] Put table index here.
1342
1343 // Implements public API code:IMetaDataTables::GetTableInfo.
1344 STDMETHODIMP GetTableInfo(
1345 ULONG ixTbl, // [IN] Which table.
1346 ULONG *pcbRow, // [OUT] Size of a row, bytes.
1347 ULONG *pcRows, // [OUT] Number of rows.
1348 ULONG *pcCols, // [OUT] Number of columns in each row.
1349 ULONG *piKey, // [OUT] Key column, or -1 if none.
1350 const char **ppName); // [OUT] Name of the table.
1351
1352 // Implements public API code:IMetaDataTables::GetColumnInfo.
1353 STDMETHODIMP GetColumnInfo(
1354 ULONG ixTbl, // [IN] Which Table.
1355 ULONG ixCol, // [IN] Which Column in the table.
1356 ULONG *poCol, // [OUT] Offset of the column in the row.
1357 ULONG *pcbCol, // [OUT] Size of a column, bytes.
1358 ULONG *pType, // [OUT] Type of the column.
1359 const char **ppName); // [OUT] Name of the Column.
1360
1361 // Implements public API code:IMetaDataTables::GetCodedTokenInfo.
1362 STDMETHODIMP GetCodedTokenInfo(
1363 ULONG ixCdTkn, // [IN] Which kind of coded token.
1364 ULONG *pcTokens, // [OUT] Count of tokens.
1365 ULONG **ppTokens, // [OUT] List of tokens.
1366 const char **ppName); // [OUT] Name of the CodedToken.
1367
1368 // Implements public API code:IMetaDataTables::GetRow.
1369 STDMETHODIMP GetRow(
1370 ULONG ixTbl, // [IN] Which table.
1371 ULONG rid, // [IN] Which row.
1372 void **ppRow); // [OUT] Put pointer to row here.
1373
1374 // Implements public API code:IMetaDataTables::GetColumn.
1375 STDMETHODIMP GetColumn(
1376 ULONG ixTbl, // [IN] Which table.
1377 ULONG ixCol, // [IN] Which column.
1378 ULONG rid, // [IN] Which row.
1379 ULONG *pVal); // [OUT] Put the column contents here.
1380
1381 //#GetString_IMetaDataTables
1382 // Fills internal null-terminated string (*pszString) at index ixString from string heap (#String).
1383 // Returns S_OK (even for index 0) or error code (if index is invalid, fills *pszString with NULL then).
1384 // Implements public API code:IMetaDataTables::GetString.
1385 STDMETHODIMP GetString(
1386 ULONG ixString, // [IN] Value from a string column.
1387 const char **pszString); // [OUT] Put a pointer to the string here.
1388
1389 //#GetBlob_IMetaDataTables
1390 // Fills blob entry (*ppvData of size *pcbDataSize) at index ixBlob from blob heap (#Blob).
1391 // Returns S_OK (even for index 0) or error code (if index is invalid, fills NULL and o then).
1392 // Implements public API code:IMetaDataTables::GetBlob.
1393 STDMETHODIMP GetBlob(
1394 ULONG ixBlob, // [IN] Value from a blob column.
1395 ULONG *pcbDataSize, // [OUT] Put size of the blob here.
1396 const void **ppvData); // [OUT] Put a pointer to the blob here.
1397
1398 //#GetGuid_IMetaDataTables
1399 // Fills guid (*ppGuid) at index ixGuid from guid heap (#GUID).
1400 // Returns S_OK and fills *ppGuid. Returns S_OK even for (invalid) index 0 (fills *ppGuid with pointer
1401 // to zeros then).
1402 // Retruns error code (if index is invalid except 0, fills NULL and o then).
1403 // Implements public API code:IMetaDataTables::GetGuid.
1404 // Backward compatibility: returns S_OK even if the index is 0 which is invalid as specified in CLI ECMA
1405 // specification. In that case returns pointer to GUID from zeros.
1406 STDMETHODIMP GetGuid(
1407 ULONG ixGuid, // [IN] Value from a guid column.
1408 const GUID **ppGuid); // [OUT] Put a pointer to the GUID here.
1409
1410 //#GetUserString_IMetaDataTables
1411 // Fills user string (*ppvData of size *pcbDataSize) at index ixUserString.
1412 // Returns S_OK (even for index 0) or error code (if index is invalid, fills NULL and o then).
1413 // Implements public API code:IMetaDataTables::GetUserString.
1414 STDMETHODIMP GetUserString(
1415 ULONG ixUserString, // [IN] Value from a UserString column.
1416 __out ULONG *pcbData, // [OUT] Put size of the UserString here.
1417 __deref_out_opt const void **ppData); // [OUT] Put a pointer to the UserString here.
1418
1419 //#GetNextString_IMetaDataTables
1420 // Fills index of string (*pixNextString) from the internal strings heap (#String) starting behind
1421 // string at index ixString.
1422 // Returns S_OK or S_FALSE (if either index is invalid). Fills *pixNextString with 0 on S_FALSE.
1423 // Implements public API code:IMetaDataTables::.GetNextString.
1424 STDMETHODIMP GetNextString(
1425 ULONG ixString, // [IN] Value from a string column.
1426 __out ULONG *pixNextString); // [OUT] Put the index of the next string here.
1427
1428 //#GetNextBlob_IMetaDataTables
1429 // Fills index of blob (*pixNextBlob) from the blobs heap (#Blob) starting behind blob at index ixBlob.
1430 // Returns S_OK or S_FALSE (if either index is invalid). Fills *pixNextBlob with 0 on S_FALSE.
1431 // Implements public API code:IMetaDataTables::GetNextString.
1432 STDMETHODIMP GetNextBlob(
1433 ULONG ixBlob, // [IN] Value from a blob column.
1434 __out ULONG *pixNextBlob); // [OUT] Put the index of the next blob here.
1435
1436 //#GetNextGuid_IMetaDataTables
1437 // Fills index of guid (*pixNextGuid) from the guids heap (#GUID) starting behind guid at index ixGuid.
1438 // Returns S_OK or S_FALSE (if the new index is invalid). Fills *pixNextGuid with 0 on S_FALSE.
1439 // Implements public API code:IMetaDataTables::GetNextGuid.
1440 // Backward compatibility: returns S_OK even if the guid index (ixGuid) is 0 which is invalid as
1441 // specified in CLI ECMA specification.
1442 STDMETHODIMP GetNextGuid(
1443 ULONG ixGuid, // [IN] Value from a guid column.
1444 __out ULONG *pixNextGuid); // [OUT] Put the index of the next guid here.
1445
1446 //#GetNextUserString_IMetaDataTables
1447 // Fills index of user string (*pixNextUserString) from the user strings heap (#US) starting behind string
1448 // at index ixUserString.
1449 // Returns S_OK or S_FALSE (if either index is invalid). Fills *pixNextUserString with 0 on S_FALSE.
1450 // Implements public API code:IMetaDataTables::GetNextUserString.
1451 // Backward compatibility: returns S_OK even if the string doesn't have odd number of bytes as specified
1452 // in CLI ECMA specification.
1453 STDMETHODIMP GetNextUserString(
1454 ULONG ixUserString, // [IN] Value from a UserString column.
1455 __out ULONG *ixpNextUserString); // [OUT] Put the index of the next user string here.
1456
1457 // Implements public API code:IMetaDataTables2::GetMetaDataStorage.
1458 STDMETHODIMP GetMetaDataStorage(
1459 const void **ppvMd, // [OUT] put pointer to MD section here (aka, 'BSJB').
1460 ULONG *pcbMd); // [OUT] put size of the stream here.
1461
1462 // Implements public API code:IMetaDataTables2::GetMetaDataStreamInfo.
1463 STDMETHODIMP GetMetaDataStreamInfo( // Get info about the MD stream.
1464 ULONG ix, // [IN] Stream ordinal desired.
1465 const char **ppchName, // [OUT] put pointer to stream name here.
1466 const void **ppv, // [OUT] put pointer to MD stream here.
1467 ULONG *pcb); // [OUT] put size of the stream here.
1468
1469
1470//*****************************************************************************
1471// IMetaDataInfo
1472//*****************************************************************************
1473
1474 // Returns the memory region of the mapped file and type of its mapping. The choice of the file mapping
1475 // type for each scope is CLR implementation specific and user cannot explicitly set it.
1476 //
1477 // The memory is valid only as long as the underlying MetaData scope is opened (there's a reference to
1478 // a MetaData interface for this scope).
1479 //
1480 // Returns S_OK, COR_E_NOTSUPPORTED (.obj files, etc.), or E_INVALIDARG (if NULL is passed).
1481 // Implements public API code:IMetaDataInfo::GetFileMapping.
1482 STDMETHODIMP GetFileMapping(
1483 const void ** ppvData, // [out] Pointer to the start of the mapped file.
1484 ULONGLONG * pcbData, // [out] Size of the mapped memory region..
1485 DWORD * pdwMappingType); // [out] Type of file mapping (code:CorFileMapping).
1486
1487
1488#if defined(FEATURE_METADATA_IN_VM) && defined(FEATURE_PREJIT)
1489
1490//*****************************************************************************
1491// IMetaDataCorProfileData
1492//*****************************************************************************
1493
1494 STDMETHOD(SetCorProfileData)(
1495 CorProfileData *pProfileData); // [IN] Pointer to profile data
1496
1497//*****************************************************************************
1498// IMDInternalMetadataReorderingOptions
1499//*****************************************************************************
1500
1501 STDMETHOD(SetMetaDataReorderingOptions)(
1502 MetaDataReorderingOptions options); // [IN] metadata reordering options
1503
1504#endif //FEATURE_METADATA_IN_VM && FEATURE_PREJIT
1505
1506//*****************************************************************************
1507// IMDCommon methods
1508//*****************************************************************************
1509 STDMETHOD_(IMetaModelCommon*, GetMetaModelCommon)()
1510 {
1511 return GetMiniMd();
1512 }
1513
1514 STDMETHOD_(IMetaModelCommonRO*, GetMetaModelCommonRO)()
1515 {
1516 if (GetMiniMd()->IsWritable())
1517 {
1518 _ASSERTE(!"IMetaModelCommonRO methods cannot be used because this importer is writable.");
1519 return NULL;
1520 }
1521 return GetMiniMd();
1522 }
1523
1524
1525 // returns the "built for" version of a metadata scope.
1526 __checkReturn
1527 STDMETHOD(GetVersionString)( // S_OK or error.
1528 LPCSTR *pVer); // [OUT] Put version string here.
1529
1530//*****************************************************************************
1531// Helpers.
1532//*****************************************************************************
1533
1534 HRESULT MarkAll(); // mark everything in a module
1535
1536//*****************************************************************************
1537// Open / Create support.
1538//*****************************************************************************
1539
1540 RegMeta();
1541 virtual ~RegMeta();
1542
1543 HRESULT SetOption(OptionValue *pOptionValue);
1544
1545 // HRESULT Init();
1546 // void Cleanup();
1547
1548 HRESULT InitWithStgdb(
1549 IUnknown *pUnk, // The IUnknown that owns the life time for the existing stgdb
1550 CLiteWeightStgdbRW *pStgdb); // existing light weight stgdb
1551
1552 ULONG GetRefCount() { return m_cRef; }
1553 HRESULT AddToCache();
1554 static HRESULT FindCachedReadOnlyEntry(LPCWSTR szName, DWORD dwOpenFlags, RegMeta **ppMeta);
1555 BOOL IsReadOnly() { return IsOfReadOnly(m_OpenFlags); }
1556 BOOL IsCopyMemory() { return IsOfCopyMemory(m_OpenFlags); }
1557
1558
1559 // helper function to reopen RegMeta with a new chuck of memory
1560 HRESULT ReOpenWithMemory(
1561 LPCVOID pData, // [in] Location of scope data.
1562 ULONG cbData, // [in] ReOpen flags
1563 DWORD dwReOpenFlags); // [in] Size of the data pointed to by pData.
1564
1565 HRESULT CreateNewMD();
1566
1567 HRESULT OpenExistingMD(
1568 LPCWSTR szDatabase, // Name of database.
1569 void *pbData, // Data to open on top of, 0 default.
1570 ULONG cbData, // How big is the data.
1571 ULONG dwFlags); // Flags to control open.
1572
1573#ifdef FEATURE_METADATA_CUSTOM_DATA_SOURCE
1574 HRESULT OpenExistingMD(
1575 IMDCustomDataSource* pDataSource, // Name of database.
1576 ULONG dwFlags); // Flags to control open.
1577#endif
1578
1579 FORCEINLINE CLiteWeightStgdbRW* GetMiniStgdb() { return m_pStgdb; }
1580 FORCEINLINE CMiniMdRW* GetMiniMd() { return &m_pStgdb->m_MiniMd; }
1581
1582//*****************************************************************************
1583
1584 bool IsTypeDefDirty() { return m_fIsTypeDefDirty;}
1585 void SetTypeDefDirty(bool fDirty) { m_fIsTypeDefDirty = fDirty;}
1586
1587 bool IsMemberDefDirty() { return m_fIsMemberDefDirty;}
1588 void SetMemberDefDirty(bool fDirty) { m_fIsMemberDefDirty = fDirty;}
1589
1590 FORCEINLINE BOOL IsThreadSafetyOn()
1591 {
1592 return (m_OptionValue.m_ThreadSafetyOptions & MDThreadSafetyOn) == MDThreadSafetyOn;
1593 }
1594
1595 LPCWSTR GetNameOfDBFile() { return (m_pStgdb->m_wszFileName == NULL) ? W("") : m_pStgdb->m_wszFileName; }
1596 DWORD GetLowFileTimeOfDBFile() { return m_pStgdb->m_dwDatabaseLFT; }
1597 DWORD GetLowFileSizeOfDBFile() { return m_pStgdb->m_dwDatabaseLFS; }
1598protected:
1599 // Helper functions used for implementation of MetaData APIs.
1600 HRESULT RefToDefOptimization();
1601
1602 FORCEINLINE BOOL PreserveLocalRefs(CorLocalRefPreservation localRefType)
1603 {
1604 return (m_OptionValue.m_LocalRefPreservation & localRefType) == localRefType;
1605 }
1606
1607 HRESULT PreSave();
1608
1609 // Initialize the EE
1610 HRESULT StartupEE();
1611
1612 // Define a TypeRef given the name.
1613 enum eCheckDups {eCheckDefault=0, eCheckNo=1, eCheckYes=2};
1614
1615 HRESULT _DefinePermissionSet(
1616 mdToken tk, // [IN] the object to be decorated.
1617 DWORD dwAction, // [IN] CorDeclSecurity.
1618 void const *pvPermission, // [IN] permission blob.
1619 ULONG cbPermission, // [IN] count of bytes of pvPermission.
1620 mdPermission *ppm); // [OUT] returned permission token.
1621
1622 HRESULT _DefineTypeRef(
1623 mdToken tkResolutionScope, // [IN] ModuleRef or AssemblyRef.
1624 const void *szName, // [IN] Name of the TypeRef.
1625 BOOL isUnicode, // [IN] Specifies whether the URL is unicode.
1626 mdTypeRef *ptk, // [OUT] Put mdTypeRef here.
1627 eCheckDups eCheck=eCheckDefault); // [IN] Specifies whether to check for duplicates.
1628
1629 // Define MethodSemantics
1630 HRESULT _DefineMethodSemantics( // S_OK or error.
1631 USHORT usAttr, // [IN] CorMethodSemanticsAttr
1632 mdMethodDef md, // [IN] Method
1633 mdToken tkAssoc, // [IN] Association
1634 BOOL bClear); // [IN] Specifies whether to delete the existing records.
1635
1636 HRESULT _SaveToStream( // S_OK or error.
1637 IStream *pIStream, // [IN] A writable stream to save to.
1638 DWORD dwSaveFlags); // [IN] Flags for the save.
1639
1640 HRESULT _SetRVA( // [IN] S_OK or error.
1641 mdToken md, // [IN] Member for which to set offset
1642 ULONG ulCodeRVA, // [IN] The offset
1643 DWORD dwImplFlags);
1644
1645 HRESULT _DefineEvent( // Return hresult.
1646 mdTypeDef td, // [IN] the class/interface on which the event is being defined
1647 LPCWSTR szEvent, // [IN] Name of the event
1648 DWORD dwEventFlags, // [IN] CorEventAttr
1649 mdToken tkEventType, // [IN] a reference (mdTypeRef or mdTypeRef) to the Event class
1650 mdEvent *pmdEvent); // [OUT] output event token
1651
1652 // Creates and sets a row in the InterfaceImpl table. Optionally clear
1653 // pre-existing records for the owning class.
1654 HRESULT _SetImplements( // S_OK or error.
1655 mdToken rTk[], // Array of TypeRef or TypeDef tokens for implemented interfaces.
1656 mdTypeDef td, // Implementing TypeDef.
1657 BOOL bClear); // Specifies whether to clear the existing records.
1658
1659 // Sets flags, name and constraints for a single GenericParam record
1660 HRESULT _SetGenericParamProps( // S_OK or error.
1661 mdGenericParam tkGP, // [IN] Formal parameter token
1662 GenericParamRec *pGenericParam, // [IN] GenericParam record ptr
1663 DWORD dwParamFlags, // [IN] Flags, for future use (e.g. variance)
1664 LPCWSTR szName, // [IN] Optional name
1665 DWORD reserved, // [IN] For future use (e.g. non-type parameters)
1666 mdToken rtkConstraints[]); // [IN] Array of type constraints (TypeDef,TypeRef,TypeSpec)
1667
1668 HRESULT _SetTypeDefProps( // S_OK or error.
1669 mdTypeDef td, // [IN] The TypeDef.
1670 DWORD dwTypeDefFlags, // [IN] TypeDef flags.
1671 mdToken tkExtends, // [IN] Base TypeDef or TypeRef.
1672 mdToken rtkImplements[]); // [IN] Implemented interfaces.
1673
1674 HRESULT _SetEventProps1( // Return hresult.
1675 mdEvent ev, // [IN] Event token.
1676 DWORD dwEventFlags, // [IN] Event flags.
1677 mdToken tkEventType); // [IN] Event type class.
1678
1679 HRESULT _SetEventProps2( // Return hresult.
1680 mdEvent ev, // [IN] Event token.
1681 mdMethodDef mdAddOn, // [IN] Add method.
1682 mdMethodDef mdRemoveOn, // [IN] Remove method.
1683 mdMethodDef mdFire, // [IN] Fire method.
1684 mdMethodDef rmdOtherMethods[], // [IN] An array of other methods.
1685 BOOL bClear); // [IN] Specifies whether to clear the existing MethodSemantics records.
1686
1687 HRESULT _SetPermissionSetProps( // Return hresult.
1688 mdPermission tkPerm, // [IN] Permission token.
1689 DWORD dwAction, // [IN] CorDeclSecurity.
1690 void const *pvPermission, // [IN] Permission blob.
1691 ULONG cbPermission); // [IN] Count of bytes of pvPermission.
1692
1693 HRESULT _DefinePinvokeMap( // Return hresult.
1694 mdToken tk, // [IN] FieldDef or MethodDef.
1695 DWORD dwMappingFlags, // [IN] Flags used for mapping.
1696 LPCWSTR szImportName, // [IN] Import name.
1697 mdModuleRef mrImportDLL); // [IN] ModuleRef token for the target DLL.
1698
1699 HRESULT _DefineSetConstant( // Return hresult.
1700 mdToken tk, // [IN] Parent token.
1701 DWORD dwCPlusTypeFlag, // [IN] Flag for the value type, selected ELEMENT_TYPE_*
1702 void const *pValue, // [IN] Constant value.
1703 ULONG cchString, // [IN] Size of string in wide chars, or -1 for default.
1704 BOOL bSearch); // [IN] Specifies whether to search for an existing record.
1705
1706 HRESULT _SetMethodProps( // S_OK or error.
1707 mdMethodDef md, // [IN] The MethodDef.
1708 DWORD dwMethodFlags, // [IN] Method attributes.
1709 ULONG ulCodeRVA, // [IN] Code RVA.
1710 DWORD dwImplFlags); // [IN] MethodImpl flags.
1711
1712 HRESULT _SetFieldProps( // S_OK or error.
1713 mdFieldDef fd, // [IN] The FieldDef.
1714 DWORD dwFieldFlags, // [IN] Field attributes.
1715 DWORD dwCPlusTypeFlag, // [IN] Flag for the value type, selected ELEMENT_TYPE_*
1716 void const *pValue, // [IN] Constant value.
1717 ULONG cchValue); // [IN] size of constant value (string, in wide chars).
1718
1719 HRESULT _SetClassLayout( // S_OK or error.
1720 mdTypeDef td, // [IN] The class.
1721 ULONG dwPackSize, // [IN] The packing size.
1722 ULONG ulClassSize); // [IN, OPTIONAL] The class size.
1723
1724 HRESULT _SetFieldOffset( // S_OK or error.
1725 mdFieldDef fd, // [IN] The field.
1726 ULONG ulOffset); // [IN] The offset of the field.
1727
1728 HRESULT _SetPropertyProps( // S_OK or error.
1729 mdProperty pr, // [IN] Property token.
1730 DWORD dwPropFlags, // [IN] CorPropertyAttr.
1731 DWORD dwCPlusTypeFlag, // [IN] Flag for value type, selected ELEMENT_TYPE_*
1732 void const *pValue, // [IN] Constant value.
1733 ULONG cchValue, // [IN] size of constant value (string, in wide chars).
1734 mdMethodDef mdSetter, // [IN] Setter of the property.
1735 mdMethodDef mdGetter, // [IN] Getter of the property.
1736 mdMethodDef rmdOtherMethods[]); // [IN] Array of other methods.
1737
1738 HRESULT _SetParamProps( // Return code.
1739 mdParamDef pd, // [IN] Param token.
1740 LPCWSTR szName, // [IN] Param name.
1741 DWORD dwParamFlags, // [IN] Param flags.
1742 DWORD dwCPlusTypeFlag, // [IN] Flag for value type. selected ELEMENT_TYPE_*.
1743 void const *pValue, // [OUT] Constant value.
1744 ULONG cchValue); // [IN] size of constant value (string, in wide chars).
1745
1746 HRESULT _SetAssemblyProps( // S_OK or error.
1747 mdAssembly pma, // [IN] Assembly token.
1748 const void *pbOriginator, // [IN] Originator of the assembly.
1749 ULONG cbOriginator, // [IN] Count of bytes in the Originator blob.
1750 ULONG ulHashAlgId, // [IN] Hash Algorithm.
1751 LPCWSTR szName, // [IN] Name of the assembly.
1752 const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData.
1753 DWORD dwAssemblyFlags); // [IN] Flags.
1754
1755 HRESULT _SetAssemblyRefProps( // S_OK or error.
1756 mdAssemblyRef ar, // [IN] AssemblyRefToken.
1757 const void *pbPublicKeyOrToken, // [IN] Public key or token of the assembly.
1758 ULONG cbPublicKeyOrToken, // [IN] Count of bytes in the public key or token.
1759 LPCWSTR szName, // [IN] Name of the assembly being referenced.
1760 const ASSEMBLYMETADATA *pMetaData, // [IN] Assembly MetaData.
1761 const void *pbHashValue, // [IN] Hash Blob.
1762 ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob.
1763 DWORD dwAssemblyRefFlags); // [IN] Token for Execution Location.
1764
1765 HRESULT _SetFileProps( // S_OK or error.
1766 mdFile file, // [IN] File token.
1767 const void *pbHashValue, // [IN] Hash Blob.
1768 ULONG cbHashValue, // [IN] Count of bytes in the Hash Blob.
1769 DWORD dwFileFlags) ; // [IN] Flags.
1770
1771 HRESULT _SetExportedTypeProps( // S_OK or error.
1772 mdExportedType ct, // [IN] ExportedType token.
1773 mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the ExportedType.
1774 mdTypeDef tkTypeDef, // [IN] TypeDef token within the file.
1775 DWORD dwExportedTypeFlags); // [IN] Flags.
1776
1777 HRESULT _SetManifestResourceProps( // S_OK or error.
1778 mdManifestResource mr, // [IN] ManifestResource token.
1779 mdToken tkImplementation, // [IN] mdFile or mdAssemblyRef that provides the resource.
1780 DWORD dwOffset, // [IN] Offset to the beginning of the resource within the file.
1781 DWORD dwResourceFlags); // [IN] Flags.
1782
1783 HRESULT _DefineTypeDef( // S_OK or error.
1784 LPCWSTR szTypeDef, // [IN] Name of TypeDef
1785 DWORD dwTypeDefFlags, // [IN] CustomAttribute flags
1786 mdToken tkExtends, // [IN] extends this TypeDef or typeref
1787 mdToken rtkImplements[], // [IN] Implements interfaces
1788 mdTypeDef tdEncloser, // [IN] TypeDef token of the Enclosing Type.
1789 mdTypeDef *ptd); // [OUT] Put TypeDef token here
1790
1791 HRESULT _SetFieldMarshal(
1792 mdToken tk, // [IN] given a fieldDef or paramDef token
1793 PCCOR_SIGNATURE pvNativeType, // [IN] native type specification
1794 ULONG cbNativeType); // [IN] count of bytes of pvNativeType
1795
1796 HRESULT _IsKnownCustomAttribute( // S_OK, S_FALSE, or error.
1797 mdToken tkType, // [IN] Token of custom attribute's type.
1798 int *pca); // [OUT] Put value from KnownCustAttr enum here.
1799
1800 HRESULT _DefineModuleRef( // S_OK or error.
1801 LPCWSTR szName, // [IN] DLL name
1802 mdModuleRef *pmur); // [OUT] returned module ref token
1803
1804 HRESULT _HandleKnownCustomAttribute( // S_OK or error.
1805 mdToken tkObj, // [IN] Object being attributed.
1806 const void *pData, // [IN] Custom Attribute data blob.
1807 ULONG cbData, // [IN] Count of bytes in the data.
1808 int ca, // [IN] Value from KnownCustAttr enum.
1809 int *bKeep); // [OUT} Keep the known CA?
1810
1811 HRESULT _HandleNativeTypeCustomAttribute(// S_OK or error.
1812 mdToken tkObj, // Object being attributed.
1813 CaArg *pArgs, // Pointer to args.
1814 CaNamedArg *pNamedArgs, // Pointer to named args.
1815 CQuickArray<BYTE> &qNativeType); // Native type is built here.
1816
1817 // Find a given param of a Method.
1818 HRESULT _FindParamOfMethod( // S_OK or error.
1819 mdMethodDef md, // [IN] The owning method of the param.
1820 ULONG iSeq, // [IN] The sequence # of the param.
1821 mdParamDef *pParamDef); // [OUT] Put ParamDef token here.
1822
1823 // Given the signature, return the token for signature.
1824 HRESULT _GetTokenFromSig( // S_OK or error.
1825 PCCOR_SIGNATURE pvSig, // [IN] Signature to define.
1826 ULONG cbSig, // [IN] Size of signature data.
1827 mdSignature *pmsig); // [OUT] returned signature token.
1828
1829 // Turn the specified internal flags on.
1830 HRESULT _TurnInternalFlagsOn( // S_OK or error.
1831 mdToken tkObj, // [IN] Target object whose internal flags are targeted.
1832 DWORD flags); // [IN] Specifies flags to be turned on.
1833
1834 // This routine eliminates duplicates from the given list of InterfaceImpl tokens
1835 // to be defined. It checks for duplicates against the database only if the
1836 // TypeDef for which these tokens are being defined is not a new one.
1837 HRESULT _InterfaceImplDupProc( // S_OK or error.
1838 mdToken rTk[], // Array of TypeRef or TypeDef tokens for implemented interfaces.
1839 mdTypeDef td, // Implementing TypeDef.
1840 CQuickBytes *pcqbTk); // Quick Byte object for placing the array of unique tokens.
1841
1842 // Helper : convert a text field signature to a com format
1843 HRESULT _ConvertTextElementTypeToComSig(// Return hresult.
1844 IMetaDataEmit *emit, // [IN] emit interface.
1845 BOOL fCreateTrIfNotFound, // [IN] create typeref if not found or fail out?
1846 LPCSTR *ppOneArgSig, // [IN|OUT] class file format signature. On exit, it will be next arg starting point
1847 CQuickBytes *pqbNewSig, // [OUT] place holder for COM+ signature
1848 ULONG cbStart, // [IN] bytes that are already in pqbNewSig
1849 ULONG *pcbCount); // [OUT] count of bytes put into the QuickBytes buffer
1850
1851 HRESULT _CheckCmodForCallConv( // S_OK, -1 if found, or error.
1852 PCCOR_SIGNATURE pbSig, // [IN] Signature to check.
1853 ULONG *pcbTotal, // [OUT] Put bytes consumed here.
1854 ULONG *pCallConv); // [OUT] If found, put calling convention here.
1855
1856 HRESULT _SearchOneArgForCallConv( // S_OK, -1 if found, or error.
1857 PCCOR_SIGNATURE pbSig, // [IN] Signature to check.
1858 ULONG *pcbTotal, // [OUT] Put bytes consumed here.
1859 ULONG *pCallConv); // [OUT] If found, put calling convention here.
1860
1861
1862
1863 int inline IsGlobalMethodParent(mdTypeDef *ptd)
1864 {
1865 if (IsGlobalMethodParentTk(*ptd))
1866 {
1867 *ptd = m_tdModule;
1868 return (true);
1869 }
1870 return (false);
1871 }
1872
1873 int inline IsGlobalMethodParentToken(mdTypeDef td)
1874 {
1875 return (!IsNilToken(m_tdModule) && td == m_tdModule);
1876 }
1877
1878 FORCEINLINE BOOL IsENCOn()
1879 {
1880 _ASSERTE( ((m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateENC) ==
1881 m_pStgdb->m_MiniMd.IsENCOn() );
1882 return (m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateENC;
1883 }
1884
1885 FORCEINLINE BOOL IsIncrementalOn()
1886 {
1887 return (m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateIncremental;
1888 }
1889
1890 FORCEINLINE BOOL CheckDups(CorCheckDuplicatesFor checkdup)
1891 {
1892 return ((m_OptionValue.m_DupCheck & checkdup) ||
1893 (m_OptionValue.m_UpdateMode == MDUpdateIncremental ||
1894 m_OptionValue.m_UpdateMode == MDUpdateENC) );
1895 }
1896
1897 FORCEINLINE HRESULT UpdateENCLog(mdToken tk, CMiniMdRW::eDeltaFuncs funccode = CMiniMdRW::eDeltaFuncDefault)
1898 {
1899 _ASSERTE( ((m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateENC) ==
1900 m_pStgdb->m_MiniMd.IsENCOn() );
1901 return m_pStgdb->m_MiniMd.UpdateENCLog(tk, funccode);
1902 }
1903
1904 FORCEINLINE HRESULT UpdateENCLog2(ULONG ixTbl, ULONG iRid, CMiniMdRW::eDeltaFuncs funccode = CMiniMdRW::eDeltaFuncDefault)
1905 {
1906 _ASSERTE( ((m_OptionValue.m_UpdateMode & MDUpdateMask) == MDUpdateENC) ==
1907 m_pStgdb->m_MiniMd.IsENCOn() );
1908 return m_pStgdb->m_MiniMd.UpdateENCLog2(ixTbl, iRid, funccode);
1909 }
1910
1911 FORCEINLINE bool IsCallerDefine() { return m_SetAPICaller == DEFINE_API; }
1912 FORCEINLINE void SetCallerDefine() { m_SetAPICaller = DEFINE_API; }
1913 FORCEINLINE bool IsCallerExternal() { return m_SetAPICaller == EXTERNAL_CALLER; }
1914 FORCEINLINE void SetCallerExternal() { m_SetAPICaller = EXTERNAL_CALLER; }
1915
1916#ifdef FEATURE_METADATA_RELEASE_MEMORY_ON_REOPEN
1917 bool IsSafeToDeleteStgdb()
1918 {
1919 return m_safeToDeleteStgdb && m_pStgdb->m_MiniMd.IsSafeToDelete();
1920 }
1921
1922 FORCEINLINE void MarkUnsafeToDeleteStgdb() { m_safeToDeleteStgdb = false; }
1923 FORCEINLINE void MarkSafeToDeleteStgdb() { m_safeToDeleteStgdb = true; }
1924#endif
1925
1926 // Define Validate methods for all tables.
1927#undef MiniMdTable
1928#define MiniMdTable(x) HRESULT Validate##x(RID rid);
1929 MiniMdTables()
1930
1931 // Validate a record in a generic sense using Meta-Meta data.
1932 STDMETHODIMP ValidateRecord(ULONG ixTbl, ULONG ulRow);
1933
1934 // Validate if the signature is properly formed with regards to the
1935 // compression scheme.
1936 STDMETHODIMP ValidateSigCompression(
1937 mdToken tk, // [IN] Token whose signature needs to be validated.
1938 PCCOR_SIGNATURE pbSig, // [IN] Signature.
1939 ULONG cbSig); // [IN] Size in bytes of the signature.
1940
1941 // Validate one argument given the offset to the beginning of the
1942 // argument, size of the full signature and the currentl offset value.
1943 STDMETHODIMP ValidateOneArg(
1944 mdToken tk, // [IN] Token whose signature is being processed.
1945 PCCOR_SIGNATURE &pbSig, // [IN] Pointer to the beginning of argument.
1946 ULONG cbSig, // [IN] Size in bytes of the full signature.
1947 ULONG *pulCurByte, // [IN/OUT] Current offset into the signature..
1948 ULONG *pulNSentinels, // [IN/OUT] Number of sentinels
1949 BOOL bNoVoidAllowed); // [IN] Flag indicating whether "void" is disallowed for this arg
1950
1951 // Validate the given Method signature.
1952 STDMETHODIMP ValidateMethodSig(
1953 mdToken tk, // [IN] Token whose signature needs to be validated.
1954 PCCOR_SIGNATURE pbSig, // [IN] Signature.
1955 ULONG cbSig, // [IN] Size in bytes of the signature.
1956 DWORD dwFlags); // [IN] Method flags.
1957
1958 // Validate the given Field signature.
1959 STDMETHODIMP ValidateFieldSig(
1960 mdToken tk, // [IN] Token whose signature needs to be validated.
1961 PCCOR_SIGNATURE pbSig, // [IN] Signature.
1962 ULONG cbSig); // [IN] Size in bytes of the signature.
1963
1964 // Validate the given MethodSpec signature.
1965 STDMETHODIMP ValidateMethodSpecSig(
1966 mdMethodSpec tk, // [IN] Token whose signature needs to be validated.
1967 PCCOR_SIGNATURE pbSig, // [IN] Signature.
1968 ULONG cbSig, // [IN] Size in bytes of the signature.
1969 ULONG *ulArity); // [OUT] Arity of the instantiation.
1970
1971
1972protected:
1973
1974 // This scope's Stgdb. This stores the actual data which the class then exposes.
1975 // This storage may be shared by an internal metadata object too.
1976 // This is read-write so that the RegMeta class can implement the emit interfaces.
1977 CLiteWeightStgdbRW *m_pStgdb;
1978
1979 CLiteWeightStgdbRW *m_pStgdbFreeList; // This scope's Stgdb.
1980 mdTypeDef m_tdModule; // The global module.
1981 IUnknown *m_pUnk; // The IUnknown that owns the Stgdb.
1982 FilterManager *m_pFilterManager; // Contains helper functions for marking
1983
1984#ifdef FEATURE_METADATA_INTERNAL_APIS
1985 // Pointer to internal interface. This is a weak reference (it doesn't addref/release).
1986 IMDInternalImport *m_pInternalImport;
1987#endif //FEATURE_METADATA_INTERNAL_APIS
1988
1989 UTSemReadWrite *m_pSemReadWrite;
1990 bool m_fOwnSem;
1991
1992 unsigned m_bRemap : 1; // If true, there is a token mapper.
1993 unsigned m_bSaveOptimized : 1; // If true, save optimization has been done.
1994 unsigned m_hasOptimizedRefToDef : 1; // true if we have performed ref to def optimization
1995 IUnknown *m_pHandler;
1996 bool m_fIsTypeDefDirty; // This flag is set when the TypeRef to TypeDef map is not valid
1997 bool m_fIsMemberDefDirty; // This flag is set when the MemberRef to MemberDef map is not valid
1998 bool m_fStartedEE; // Set when EE runtime has been started up.
1999 IUnknown *m_pAppDomain; // AppDomain in which managed security code will be run.
2000
2001private:
2002 ULONG m_OpenFlags; // Open time flags.
2003
2004 LONG m_cRef; // Ref count.
2005 IUnknown *m_pFreeThreadedMarshaler; // FreeThreadedMarshaler
2006
2007#ifdef FEATURE_METADATA_PERF_STATS
2008 MDCompilerPerf m_MDCompilerPerf; // Compiler perf object to store all stats.
2009#endif
2010
2011 // If true, cached in list of global scopes. This is very dangerous because it may allow
2012 // unpredictable state sharing between seemingly unrelated dispensers.
2013 bool m_bCached;
2014
2015 OptionValue m_OptionValue;
2016
2017 mdTypeRef m_trLanguageType;
2018
2019 // Specifies whether the caller of the Set API is one of the Define functions
2020 // or an external API. This allows for performance optimization in the Set APIs
2021 // by not checking for Duplicates in certain cases.
2022 SetAPICallerType m_SetAPICaller;
2023
2024 CorValidatorModuleType m_ModuleType;
2025 CCustAttrHash m_caHash; // Hashed list of custom attribute types seen.
2026
2027 bool m_bKeepKnownCa; // Should all known CA's be kept?
2028
2029 CorProfileData *m_pCorProfileData;
2030
2031 MetaDataReorderingOptions m_ReorderingOptions;
2032
2033#ifdef FEATURE_METADATA_RELEASE_MEMORY_ON_REOPEN
2034 bool m_safeToDeleteStgdb; // This starts out true, but gets set to FALSE if we detect
2035 // a RegMeta API call that might have given out an internal pointer.
2036 // There is an equivalent state in MiniMD, and both must be
2037 // TRUE in order to delete safely.
2038#endif
2039
2040private:
2041 // Returns pointer to zeros of size (cbSize).
2042 // Used by public APIs to return compatible values with previous releases.
2043 static const BYTE *GetPublicApiCompatibilityZerosOfSize(UINT32 cbSize);
2044 // Returns pointer to zeros typed as type T.
2045 // Used by public APIs to return compatible values with previous releases.
2046 template<class T>
2047 T *GetPublicApiCompatibilityZeros()
2048 {
2049 static_assert_no_msg(sizeof(T) <= sizeof(s_rgMetaDataPublicApiCompatibilityZeros));
2050 return reinterpret_cast<T *>(s_rgMetaDataPublicApiCompatibilityZeros);
2051 }
2052 // Zeros used by public APIs as return value (or pointer to this memory) for invalid input.
2053 // It is used by methods:
2054 // * code:RegMeta::GetPublicApiCompatibilityZeros, and
2055 // * code:RegMeta::GetPublicApiCompatibilityZerosOfSize.
2056 static const BYTE s_rgMetaDataPublicApiCompatibilityZeros[64];
2057
2058}; // class RegMeta
2059
2060
2061#endif // __RegMeta__h__
2062