1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
|
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
/*============================================================
**
** Header: AssemblyNative.hpp
**
** Purpose: Implements FCalls for managed Assembly class
**
**
**
===========================================================*/
#ifndef _ASSEMBLYNATIVE_H
#define _ASSEMBLYNATIVE_H
class CLRPrivBinderAssemblyLoadContext;
class AssemblyNative
{
friend class Assembly;
friend class BaseDomain;
friend class DomainAssembly;
private:
static Assembly* GetPostPolicyAssembly(PEAssembly *pFile,
BOOL fForIntrospection,
AssemblyLoadSecurity *pLoadSecurity,
BOOL fIsLoadByteArray = FALSE);
static Assembly* LoadFromBuffer(BOOL fForIntrospection,
const BYTE* pAssemblyData,
UINT64 uAssemblyLength,
const BYTE* pPDBData,
UINT64 uPDBLength,
StackCrawlMark* stackMark,
Object * securityUNSAFE,
SecurityContextSource securityContextSource);
public:
// static FCALLs
static
void QCALLTYPE GetEntryAssembly(QCall::ObjectHandleOnStack retAssembly);
static
void QCALLTYPE GetExecutingAssembly(QCall::StackCrawlMarkHandle stackMark, QCall::ObjectHandleOnStack retAssembly);
static FCDECL2(Object*, LoadFile, StringObject* pathUNSAFE,
Object* securityUNSAFE);
static FCDECL6(Object*, LoadImage, U1Array* PEByteArrayUNSAFE, U1Array* SymByteArrayUNSAFE, Object* securityUNSAFE, StackCrawlMark* stackMark, CLR_BOOL fForIntrospection, SecurityContextSource securityContextSource);
#ifdef FEATURE_CORECLR
static
void QCALLTYPE LoadFromUnmanagedArray(CLR_BOOL fForIntrospection,
BYTE* pAssembly,
UINT64 uAssemblyLength,
BYTE* pPDB,
UINT64 uPDBLength,
QCall::StackCrawlMarkHandle stackMark,
QCall::ObjectHandleOnStack retAssembly);
#endif
#ifdef FEATURE_HOSTED_BINDER
static FCDECL9(Object*, Load, AssemblyNameBaseObject* assemblyNameUNSAFE,
StringObject* codeBaseUNSAFE,
Object* securityUNSAFE,
AssemblyBaseObject* requestingAssemblyUNSAFE,
StackCrawlMark* stackMark,
ICLRPrivBinder * pPrivHostBinder,
CLR_BOOL fThrowOnFileNotFound,
CLR_BOOL fForIntrospection,
CLR_BOOL fSuppressSecurityChecks);
#else //!FEATURE_HOSTED_BINDER
static FCDECL8(Object*, Load, AssemblyNameBaseObject* assemblyNameUNSAFE,
StringObject* codeBaseUNSAFE,
Object* securityUNSAFE,
AssemblyBaseObject* requestingAssemblyUNSAFE,
StackCrawlMark* stackMark,
CLR_BOOL fThrowOnFileNotFound,
CLR_BOOL fForIntrospection,
CLR_BOOL fSuppressSecurityChecks);
#endif // FEATURE_HOSTED_BINDER
static FCDECL1(FC_BOOL_RET, IsFrameworkAssembly, AssemblyNameBaseObject* refAssemblyNameUNSAFE);
static FCDECL1(FC_BOOL_RET, IsNewPortableAssembly, AssemblyNameBaseObject* refAssemblyNameUNSAFE);
//
// instance FCALLs
//
static
void QCALLTYPE GetLocale(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
static
INT32 QCALLTYPE GetHashAlgorithm(QCall::AssemblyHandle pAssembly);
#ifndef FEATURE_CORECLR
static
BYTE QCALLTYPE GetSecurityRuleSet(QCall::AssemblyHandle pAssembly);
#endif // !FEATURE_CORECLR
static
void QCALLTYPE GetSimpleName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retSimpleName);
static
void QCALLTYPE GetPublicKey(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retPublicKey);
static
INT32 QCALLTYPE GetFlags(QCall::AssemblyHandle pAssembly);
static
void QCALLTYPE GetFullName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
static
void QCALLTYPE GetLocation(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
static
FCDECL1(FC_BOOL_RET, IsReflectionOnly, AssemblyBaseObject * pAssemblyUNSAFE);
static
void QCALLTYPE GetCodeBase(QCall::AssemblyHandle pAssembly, BOOL fCopiedName, QCall::StringHandleOnStack retString);
static
BYTE * QCALLTYPE GetResource(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, UINT64 * length, QCall::StackCrawlMarkHandle stackMark, BOOL skipSecurityCheck);
static
BOOL QCALLTYPE GetNeutralResourcesLanguageAttribute(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack cultureName, INT16& outFallbackLocation);
static
FCDECL1(FC_BOOL_RET, IsDynamic, AssemblyBaseObject * pAssemblyUNSAFE);
static
void QCALLTYPE GetVersion(QCall::AssemblyHandle pAssembly, INT32* pMajorVersion, INT32* pMinorVersion, INT32*pBuildNumber, INT32* pRevisionNumber);
static
void QCALLTYPE LoadModule(QCall::AssemblyHandle pAssembly,
LPCWSTR wszModuleName,
LPCBYTE pRawModule, INT32 cbModule,
LPCBYTE pRawSymbolStore, INT32 cbSymbolStore,
QCall::ObjectHandleOnStack retModule);
static
void QCALLTYPE GetType(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, BOOL bThrowOnError, BOOL bIgnoreCase, QCall::ObjectHandleOnStack retType);
static
INT32 QCALLTYPE GetManifestResourceInfo(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, QCall::ObjectHandleOnStack retAssembly, QCall::StringHandleOnStack retFileName, QCall::StackCrawlMarkHandle stackMark);
static
BOOL QCALLTYPE UseRelativeBindForSatellites();
static
void QCALLTYPE GetModules(QCall::AssemblyHandle pAssembly, BOOL fLoadIfNotFound, BOOL fGetResourceModules, QCall::ObjectHandleOnStack retModules);
static
void QCALLTYPE GetModule(QCall::AssemblyHandle pAssembly, LPCWSTR wszFileName, QCall::ObjectHandleOnStack retModule);
static
void QCALLTYPE GetExportedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes);
static
void QCALLTYPE GetForwardedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes);
static FCDECL1(Object*, GetManifestResourceNames, AssemblyBaseObject * pAssemblyUNSAFE);
static FCDECL1(Object*, GetReferencedAssemblies, AssemblyBaseObject * pAssemblyUNSAFE);
static
void QCALLTYPE GetEntryPoint(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retMethod);
static FCDECL1(ReflectModuleBaseObject *, GetOnDiskAssemblyModule, AssemblyBaseObject * pAssemblyUNSAFE);
static FCDECL1(ReflectModuleBaseObject *, GetInMemoryAssemblyModule, AssemblyBaseObject * pAssemblyUNSAFE);
#ifndef FEATURE_CORECLR
static
FCDECL1(FC_BOOL_RET, IsGlobalAssemblyCache, AssemblyBaseObject* pAssemblyUNSAFE);
#endif // !FEATURE_CORECLR
static
void QCALLTYPE GetGrantSet(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retGranted, QCall::ObjectHandleOnStack retDenied);
static
BOOL QCALLTYPE IsAllSecurityCritical(QCall::AssemblyHandle pAssembly);
static
BOOL QCALLTYPE IsAllSecuritySafeCritical(QCall::AssemblyHandle pAssembly);
static
BOOL QCALLTYPE IsAllPublicAreaSecuritySafeCritical(QCall::AssemblyHandle pAssembly);
static
BOOL QCALLTYPE IsAllSecurityTransparent(QCall::AssemblyHandle pAssembly);
static
void QCALLTYPE GetImageRuntimeVersion(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
#ifdef FEATURE_LEGACYNETCF
static
BOOL QCALLTYPE GetIsProfileAssembly(QCall::AssemblyHandle pAssembly);
#endif // FEATURE_LEGACYNETCF
static
INT64 QCALLTYPE GetHostContext(QCall::AssemblyHandle pAssembly);
#ifdef FEATURE_CAS_POLICY
static
BOOL QCALLTYPE IsStrongNameVerified(QCall::AssemblyHandle pAssembly);
#endif // FEATURE_CAS_POLICY
//
// AssemblyBuilder FCALLs
//
static
void QCALLTYPE PrepareForSavingManifestToDisk(QCall::AssemblyHandle pAssembly, QCall::ModuleHandle pAssemblyModule);
#ifndef FEATURE_CORECLR
static
void QCALLTYPE SaveManifestToDisk(QCall::AssemblyHandle pAssembly,
LPCWSTR wszManifestFileName,
INT32 entrypoint,
INT32 fileKind,
INT32 portableExecutableKind,
INT32 imageFileMachine);
static
mdExportedType QCALLTYPE AddExportedTypeOnDisk(QCall::AssemblyHandle pAssembly, LPCWSTR wzzCOMTypeName, INT32 tkImpl, INT32 tkTypeDef, INT32 flags);
static
mdExportedType QCALLTYPE AddExportedTypeInMemory(QCall::AssemblyHandle pAssembly, LPCWSTR wzzCOMTypeName, INT32 tkImpl, INT32 tkTypeDef, INT32 flags);
#endif // FEATURE_CORECLR
static
mdFile QCALLTYPE AddFile(QCall::AssemblyHandle pAssembly, LPCWSTR wszFileName);
static
void QCALLTYPE SetFileHashValue(QCall::AssemblyHandle pAssembly, INT32 tkFile, LPCWSTR wszFullFileName);
static
void QCALLTYPE AddStandAloneResource(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, LPCWSTR wszFileName, LPCWSTR wszFullFileName, INT32 iAttribute);
static
void QCALLTYPE AddDeclarativeSecurity(QCall::AssemblyHandle pAssembly, INT32 action, PVOID blob, INT32 length);
#ifndef FEATURE_CORECLR
static
void QCALLTYPE CreateVersionInfoResource(LPCWSTR pwzFilename,
LPCWSTR pwzTitle,
LPCWSTR pwzIconFilename,
LPCWSTR pwzDescription,
LPCWSTR pwzCopyright,
LPCWSTR pwzTrademark,
LPCWSTR pwzCompany,
LPCWSTR pwzProduct,
LPCWSTR pwzProductVersion,
LPCWSTR pwzFileVersion,
INT32 lcid,
BOOL fIsDll,
QCall::StringHandleOnStack retFileName);
#endif // !FEATURE_CORECLR
static
void QCALLTYPE GetRawBytes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retRawBytes);
//
// PEFile QCalls
//
static
void QCALLTYPE ReleaseSafePEFileHandle(PEFile *pPEFile);
#ifdef FEATURE_APPX
static
BOOL QCALLTYPE IsDesignerBindingContext(QCall::AssemblyHandle pAssembly);
#endif
static INT_PTR QCALLTYPE InitializeAssemblyLoadContext(INT_PTR ptrManagedAssemblyLoadContext);
static BOOL QCALLTYPE OverrideDefaultAssemblyLoadContextForCurrentDomain(INT_PTR ptrNativeAssemblyLoadContext);
static BOOL QCALLTYPE CanUseAppPathAssemblyLoadContextInCurrentDomain();
static void QCALLTYPE LoadFromPath(INT_PTR ptrNativeAssemblyLoadContext, LPCWSTR pwzILPath, LPCWSTR pwzNIPath, QCall::ObjectHandleOnStack retLoadedAssembly);
static void QCALLTYPE LoadFromStream(INT_PTR ptrNativeAssemblyLoadContext, INT_PTR ptrAssemblyArray, INT32 cbAssemblyArrayLength, INT_PTR ptrSymbolArray, INT32 cbSymbolArrayLength, QCall::ObjectHandleOnStack retLoadedAssembly);
static Assembly* LoadFromPEImage(CLRPrivBinderAssemblyLoadContext* pBinderContext, PEImage *pILImage, PEImage *pNIImage);
static INT_PTR QCALLTYPE AssemblyNative::GetLoadContextForAssembly(QCall::AssemblyHandle pAssembly);
};
#endif
|