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
|
// 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_
|