diff options
Diffstat (limited to 'src/vm/oletls.h')
-rw-r--r-- | src/vm/oletls.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/src/vm/oletls.h b/src/vm/oletls.h new file mode 100644 index 0000000000..de507951a6 --- /dev/null +++ b/src/vm/oletls.h @@ -0,0 +1,210 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +//+--------------------------------------------------------------------------- +// +// File: oletls.h +// + +// +// Purpose: manage thread local storage for OLE +// +// Notes: The gTlsIndex is initialized at process attach time. +// The per-thread data is allocated in CoInitialize in +// single-threaded apartments or on first use in +// multi-threaded apartments. +// +//---------------------------------------------------------------------------- + +#ifndef _OLETLS_H_ +#define _OLETLS_H_ + +#ifndef FEATURE_COMINTEROP_APARTMENT_SUPPORT +#error FEATURE_COMINTEROP_APARTMENT_SUPPORT is required for this file +#endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT + +//+--------------------------------------------------------------------------- +// +// forward declarations (in order to avoid type casting when accessing +// data members of the SOleTlsData structure). +// +//+--------------------------------------------------------------------------- + +class CAptCallCtrl; // see callctrl.hxx +class CSrvCallState; // see callctrl.hxx +class CObjServer; // see sobjact.hxx +class CSmAllocator; // see stg\h\smalloc.hxx +class CMessageCall; // see call.hxx +class CClientCall; // see call.hxx +class CAsyncCall; // see call.hxx +class CClipDataObject; // see ole232\clipbrd\clipdata.h +class CSurrogatedObjectList; // see com\inc\comsrgt.hxx +class CCtxCall; // see PSTable.hxx +class CPolicySet; // see PSTable.hxx +class CObjectContext; // see context.hxx +class CComApartment; // see aprtmnt.hxx + +//+------------------------------------------------------------------- +// +// Struct: CallEntry +// +// Synopsis: Call Table Entry. +// +//+------------------------------------------------------------------- +typedef struct tagCallEntry +{ + void *pNext; // ptr to next entry + void *pvObject; // Entry object +} CallEntry; + + + +//+--------------------------------------------------------------------------- +// +// Enum: OLETLSFLAGS +// +// Synopsys: bit values for dwFlags field of SOleTlsData. If you just want +// to store a BOOL in TLS, use this enum and the dwFlag field. +// +//+--------------------------------------------------------------------------- +typedef enum tagOLETLSFLAGS +{ + OLETLS_LOCALTID = 0x01, // This TID is in the current process. + OLETLS_UUIDINITIALIZED = 0x02, // This Logical thread is init'd. + OLETLS_INTHREADDETACH = 0x04, // This is in thread detach. Needed + // due to NT's special thread detach + // rules. + OLETLS_CHANNELTHREADINITIALZED = 0x08,// This channel has been init'd + OLETLS_WOWTHREAD = 0x10, // This thread is a 16-bit WOW thread. + OLETLS_THREADUNINITIALIZING = 0x20, // This thread is in CoUninitialize. + OLETLS_DISABLE_OLE1DDE = 0x40, // This thread can't use a DDE window. + OLETLS_APARTMENTTHREADED = 0x80, // This is an STA apartment thread + OLETLS_MULTITHREADED = 0x100, // This is an MTA apartment thread + OLETLS_IMPERSONATING = 0x200, // This thread is impersonating + OLETLS_DISABLE_EVENTLOGGER = 0x400, // Prevent recursion in event logger + OLETLS_INNEUTRALAPT = 0x800, // This thread is in the NTA + OLETLS_DISPATCHTHREAD = 0x1000, // This is a dispatch thread + OLETLS_HOSTTHREAD = 0x2000, // This is a host thread + OLETLS_ALLOWCOINIT = 0x4000, // This thread allows inits + OLETLS_PENDINGUNINIT = 0x8000, // This thread has pending uninit + OLETLS_FIRSTMTAINIT = 0x10000,// First thread to attempt an MTA init + OLETLS_FIRSTNTAINIT = 0x20000,// First thread to attempt an NTA init + OLETLS_APTINITIALIZING = 0x40000 // Apartment Object is initializing +} OLETLSFLAGS; + + +//+--------------------------------------------------------------------------- +// +// Structure: SOleTlsData +// +// Synopsis: structure holding per thread state needed by OLE32 +// +//+--------------------------------------------------------------------------- +typedef struct tagSOleTlsData +{ +#if !defined(_CHICAGO_) + // Docfile multiple allocator support + void *pvThreadBase; // per thread base pointer + CSmAllocator *pSmAllocator; // per thread docfile allocator +#endif + DWORD dwApartmentID; // Per thread "process ID" + DWORD dwFlags; // see OLETLSFLAGS above + + LONG TlsMapIndex; // index in the global TLSMap + void **ppTlsSlot; // Back pointer to the thread tls slot + DWORD cComInits; // number of per-thread inits + DWORD cOleInits; // number of per-thread OLE inits + + DWORD cCalls; // number of outstanding calls + CMessageCall *pCallInfo; // channel call info + CAsyncCall *pFreeAsyncCall; // ptr to available call object for this thread. + CClientCall *pFreeClientCall; // ptr to available call object for this thread. + + CObjServer *pObjServer; // Activation Server Object for this apartment. + DWORD dwTIDCaller; // TID of current calling app + CObjectContext *pCurrentCtx; // Current context + CObjectContext *pEmptyCtx; // Empty context + + CObjectContext *pNativeCtx; // Native context + CComApartment *pNativeApt; // Native apartment for the thread. + IUnknown *pCallContext; // call context object + CCtxCall *pCtxCall; // Context call object + + CPolicySet *pPS; // Policy set + PVOID pvPendingCallsFront;// Per Apt pending async calls + PVOID pvPendingCallsBack; + CAptCallCtrl *pCallCtrl; // call control for RPC for this apartment + + CSrvCallState *pTopSCS; // top server-side callctrl state + IMessageFilter *pMsgFilter; // temp storage for App MsgFilter + HWND hwndSTA; // STA server window same as poxid->hServerSTA + // ...needed on Win95 before oxid registration + LONG cORPCNestingLevel; // call nesting level (DBG only) + + DWORD cDebugData; // count of bytes of debug data in call + ULONG cPreRegOidsAvail; // count of server-side OIDs avail + unsigned hyper *pPreRegOids; // ptr to array of pre-reg OIDs + + UUID LogicalThreadId; // current logical thread id + + HANDLE hThread; // Thread handle used for cancel + HANDLE hRevert; // Token before first impersonate. + IUnknown *pAsyncRelease; // Controlling unknown for async release + // DDE data + HWND hwndDdeServer; // Per thread Common DDE server + + HWND hwndDdeClient; // Per thread Common DDE client + ULONG cServeDdeObjects; // non-zero if objects DDE should serve + // ClassCache data + LPVOID pSTALSvrsFront; // Chain of LServers registers in this thread if STA + // upper layer data + HWND hwndClip; // Clipboard window + + IDataObject *pDataObjClip; // Current Clipboard DataObject + DWORD dwClipSeqNum; // Clipboard Sequence # for the above DataObject + DWORD fIsClipWrapper; // Did we hand out the wrapper Clipboard DataObject? + IUnknown *punkState; // Per thread "state" object + // cancel data + DWORD cCallCancellation; // count of CoEnableCallCancellation + // async sends data + DWORD cAsyncSends; // count of async sends outstanding + + CAsyncCall* pAsyncCallList; // async calls outstanding + CSurrogatedObjectList *pSurrogateList; // Objects in the surrogate + + LockEntry lockEntry; // Locks currently held by the thread + CallEntry CallEntry; // client-side call chain for this thread + +#ifdef WX86OLE + IUnknown *punkStateWx86; // Per thread "state" object for Wx86 +#endif + void *pDragCursors; // Per thread drag cursor table. + +#ifdef _CHICAGO_ + LPVOID pWcstokContext; // Scan context for wcstok +#endif + + IUnknown *punkError; // Per thread error object. + ULONG cbErrorData; // Maximum size of error data. + +#if(_WIN32_WINNT >= 0x0500) + IUnknown *punkActiveXSafetyProvider; +#endif //(_WIN32_WINNT >= 0x0500) + +#if DBG==1 + LONG cTraceNestingLevel; // call nesting level for OLETRACE +#endif + +} SOleTlsData; + +#ifdef INITGUID +#include "initguid.h" +#endif + +#define DEFINE_OLEGUID(name, l, w1, w2) \ + DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46) + +DEFINE_OLEGUID(IID_IStdIdentity, 0x0000001bL, 0, 0); +DEFINE_OLEGUID(IID_IStdWrapper, 0x000001caL, 0, 0); + +#endif // _OLETLS_H_ |