2 // Copyright (c) Microsoft. All rights reserved.
3 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5 // ===========================================================================
12 // CEEMAIN.H defines the entrypoints into the Virtual Execution Engine and
13 // gets the load/run process going.
14 // ===========================================================================
19 #include <windef.h> // for HFILE, HANDLE, HMODULE
21 class EEDbgInterfaceImpl;
23 // Ensure the EE is started up.
24 HRESULT EnsureEEStarted(COINITIEE flags);
26 // Wrapper around EnsureEEStarted which also sets startup mode.
27 HRESULT InitializeEE(COINITIEE flags);
29 // Has the EE been started up?
30 BOOL IsRuntimeStarted(DWORD *pdwStartupFlags);
32 // Enum to control what happens at the end of EE shutdown. There are two options:
33 // 1. Call ::ExitProcess to cause the process to terminate gracefully. This is how
34 // shutdown normally ends. "Shutdown" methods that take this action as an argument
35 // do not return when SCA_ExitProcessWhenShutdownComplete is passed.
37 // 2. Return after performing all shutdown processing. This is a special case used
38 // by a shutdown initiated via the Shim, and is used to ensure that all runtimes
39 // loaded SxS are shutdown gracefully. "Shutdown" methods that take this action
40 // as an argument return when SCA_ReturnWhenShutdownComplete is passed.
41 enum ShutdownCompleteAction
43 SCA_ExitProcessWhenShutdownComplete,
44 SCA_ReturnWhenShutdownComplete
47 // Force shutdown of the EE
48 void ForceEEShutdown(ShutdownCompleteAction sca = SCA_ExitProcessWhenShutdownComplete);
49 void InnerCoEEShutDownCOM();
51 // We have an internal class that can be used to expose EE functionality to other CLR
52 // DLLs, via the deliberately obscure IEE DLL exports from the shim and the EE
53 // NOTE: This class must not ever contain any instance variables. The reason for
54 // this is that the IEE function (corhost.cpp) relies on the fact that you
55 // may initialize the object more than once without ill effects. If you
56 // change this class so that this condition is violated, you must rewrite
57 // how the g_pCEE and related variables are initialized.
58 class CExecutionEngine : public IExecutionEngine, public IEEMemoryManager
60 friend struct _DacGlobals;
62 //***************************************************************************
64 //***************************************************************************
67 // Notification of a DLL_THREAD_DETACH or a Thread Terminate.
68 static void ThreadDetaching(void **pTlsData);
70 // Delete on TLS block
71 static void DeleteTLS(void **pTlsData);
73 // Fiber switch notifications
74 static void SwitchIn();
75 static void SwitchOut();
77 static void **CheckThreadState(DWORD slot, BOOL force = TRUE);
78 static void **CheckThreadStateNoCreate(DWORD slot
80 , BOOL fForDestruction = FALSE
84 // Setup FLS simulation block, including ClrDebugState and StressLog.
85 static void SetupTLSForThread(Thread *pThread);
87 static DWORD GetTlsIndex () {return TlsIndex;}
89 static LPVOID* GetTlsData();
90 static BOOL SetTlsData (void** ppTlsInfo);
92 static BOOL HasDetachedTlsInfo();
94 static void CleanupDetachedTlsInfo();
96 static void DetachTlsInfo(void **pTlsData);
98 //***************************************************************************
99 // private implementation:
100 //***************************************************************************
103 // The debugger needs access to the TlsIndex so that we can read it from OOP.
104 friend class EEDbgInterfaceImpl;
106 SVAL_DECL (DWORD, TlsIndex);
108 static PTLS_CALLBACK_FUNCTION Callbacks[MAX_PREDEFINED_TLS_SLOT];
110 //***************************************************************************
112 //***************************************************************************
114 HRESULT STDMETHODCALLTYPE QueryInterface(
118 ULONG STDMETHODCALLTYPE AddRef();
120 ULONG STDMETHODCALLTYPE Release();
122 //***************************************************************************
123 // IExecutionEngine methods for TLS
124 //***************************************************************************
126 // Associate a callback for cleanup with a TLS slot
127 VOID STDMETHODCALLTYPE TLS_AssociateCallback(
129 PTLS_CALLBACK_FUNCTION callback);
131 // Get the TLS block for fast Get/Set operations
132 LPVOID* STDMETHODCALLTYPE TLS_GetDataBlock();
134 // Get the value at a slot
135 LPVOID STDMETHODCALLTYPE TLS_GetValue(DWORD slot);
137 // Get the value at a slot, return FALSE if TLS info block doesn't exist
138 BOOL STDMETHODCALLTYPE TLS_CheckValue(DWORD slot, LPVOID * pValue);
140 // Set the value at a slot
141 VOID STDMETHODCALLTYPE TLS_SetValue(DWORD slot, LPVOID pData);
143 // Free TLS memory block and make callback
144 VOID STDMETHODCALLTYPE TLS_ThreadDetaching();
146 //***************************************************************************
147 // IExecutionEngine methods for locking
148 //***************************************************************************
150 CRITSEC_COOKIE STDMETHODCALLTYPE CreateLock(LPCSTR szTag, LPCSTR level, CrstFlags flags);
152 void STDMETHODCALLTYPE DestroyLock(CRITSEC_COOKIE lock);
154 void STDMETHODCALLTYPE AcquireLock(CRITSEC_COOKIE lock);
156 void STDMETHODCALLTYPE ReleaseLock(CRITSEC_COOKIE lock);
158 EVENT_COOKIE STDMETHODCALLTYPE CreateAutoEvent(BOOL bInitialState);
159 EVENT_COOKIE STDMETHODCALLTYPE CreateManualEvent(BOOL bInitialState);
160 void STDMETHODCALLTYPE CloseEvent(EVENT_COOKIE event);
161 BOOL STDMETHODCALLTYPE ClrSetEvent(EVENT_COOKIE event);
162 BOOL STDMETHODCALLTYPE ClrResetEvent(EVENT_COOKIE event);
163 DWORD STDMETHODCALLTYPE WaitForEvent(EVENT_COOKIE event, DWORD dwMilliseconds, BOOL bAlertable);
164 DWORD STDMETHODCALLTYPE WaitForSingleObject(HANDLE handle, DWORD dwMilliseconds);
166 SEMAPHORE_COOKIE STDMETHODCALLTYPE ClrCreateSemaphore(DWORD dwInitial, DWORD dwMax);
167 void STDMETHODCALLTYPE ClrCloseSemaphore(SEMAPHORE_COOKIE semaphore);
168 DWORD STDMETHODCALLTYPE ClrWaitForSemaphore(SEMAPHORE_COOKIE semaphore, DWORD dwMilliseconds, BOOL bAlertable);
169 BOOL STDMETHODCALLTYPE ClrReleaseSemaphore(SEMAPHORE_COOKIE semaphore, LONG lReleaseCount, LONG *lpPreviousCount);
171 MUTEX_COOKIE STDMETHODCALLTYPE ClrCreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,
174 void STDMETHODCALLTYPE ClrCloseMutex(MUTEX_COOKIE mutex);
175 BOOL STDMETHODCALLTYPE ClrReleaseMutex(MUTEX_COOKIE mutex);
176 DWORD STDMETHODCALLTYPE ClrWaitForMutex(MUTEX_COOKIE mutex,
177 DWORD dwMilliseconds,
180 DWORD STDMETHODCALLTYPE ClrSleepEx(DWORD dwMilliseconds, BOOL bAlertable);
182 BOOL STDMETHODCALLTYPE ClrAllocationDisallowed();
184 void STDMETHODCALLTYPE GetLastThrownObjectExceptionFromThread(void **ppvException);
186 //***************************************************************************
187 // IEEMemoryManager methods for locking
188 //***************************************************************************
189 LPVOID STDMETHODCALLTYPE ClrVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
190 BOOL STDMETHODCALLTYPE ClrVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);
191 SIZE_T STDMETHODCALLTYPE ClrVirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength);
192 BOOL STDMETHODCALLTYPE ClrVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
193 HANDLE STDMETHODCALLTYPE ClrGetProcessHeap();
194 HANDLE STDMETHODCALLTYPE ClrHeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);
195 BOOL STDMETHODCALLTYPE ClrHeapDestroy(HANDLE hHeap);
196 LPVOID STDMETHODCALLTYPE ClrHeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
197 BOOL STDMETHODCALLTYPE ClrHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
198 BOOL STDMETHODCALLTYPE ClrHeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem);
199 HANDLE STDMETHODCALLTYPE ClrGetProcessExecutableHeap();
204 extern void DisableGlobalAllocStore ();
207 void SetLatchedExitCode (INT32 code);
208 INT32 GetLatchedExitCode (void);
210 // Tells whether the garbage collector is fully initialized
211 // Stronger than IsGCHeapInitialized
212 BOOL IsGarbageCollectorFullyInitialized();
214 #ifndef FEATURE_CORECLR
215 //---------------------------------------------------------------------------------------
217 // Class to encapsulate Cor Command line processing
225 // Note: We don't bother with interlocked operations as we manipulate these bits,
226 // because we don't anticipate free-threaded access. (Most of this is used only
227 // during startup / shutdown).
231 // Hold the current (possibly parsed) command line here
232 static DWORD m_NumArgs;
233 static LPWSTR *m_ArgvW;
235 static LPWSTR m_pwszAppFullName;
236 static DWORD m_dwManifestPaths;
237 static LPWSTR *m_ppwszManifestPaths;
238 static DWORD m_dwActivationData;
239 static LPWSTR *m_ppwszActivationData;
243 // parse the command line
244 static HRESULT SetArgvW(LPCWSTR lpCommandLine);
246 // Retrieve the parsed command line
247 static LPWSTR *GetArgvW(DWORD *pNumArgs);
250 static HRESULT ReadClickOnceEnvVariables();
252 #endif // !FEATURE_CORECLR