combase: Add a function to allocate OLE thread data.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-08-17 10:20:49 +03:00 committed by Alexandre Julliard
parent 6b5579b65f
commit 6153eefcba
4 changed files with 64 additions and 7 deletions

View File

@ -27,6 +27,8 @@
#include "oleauto.h"
#include "winternl.h"
#include "combase_private.h"
#include "wine/debug.h"
#include "wine/heap.h"
@ -223,6 +225,20 @@ static HRESULT open_key_for_clsid(REFCLSID clsid, const WCHAR *keyname, REGSAM a
return S_OK;
}
/***********************************************************************
* InternalTlsAllocData (combase.@)
*/
HRESULT WINAPI InternalTlsAllocData(struct tlsdata **data)
{
if (!(*data = heap_alloc_zero(sizeof(**data))))
return E_OUTOFMEMORY;
list_init(&(*data)->spies);
NtCurrentTeb()->ReservedForOle = *data;
return S_OK;
}
/***********************************************************************
* FreePropVariantArray (combase.@)
*/

View File

@ -274,7 +274,7 @@
@ stub InternalSetAptCallCtrlOnTlsIfRequired
@ stub InternalSetOleThunkWowPtr
@ stub InternalStubInvoke
@ stub InternalTlsAllocData
@ stdcall InternalTlsAllocData(ptr)
@ stub InternalUnmarshalObjRef
@ stub IsErrorPropagationEnabled
@ stub NdrExtStubInitialize

View File

@ -0,0 +1,42 @@
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "wine/list.h"
struct apartment;
/* this is what is stored in TEB->ReservedForOle */
struct tlsdata
{
struct apartment *apt;
IErrorInfo *errorinfo;
DWORD thread_seqid;/* returned with CoGetCurrentProcess */
DWORD apt_mask; /* apartment mask (+0Ch on x86) */
void *unknown0;
DWORD inits; /* number of times CoInitializeEx called */
DWORD ole_inits; /* number of times OleInitialize called */
GUID causality_id; /* unique identifier for each COM call */
LONG pending_call_count_client; /* number of client calls pending */
LONG pending_call_count_server; /* number of server calls pending */
DWORD unknown;
IObjContext *context_token; /* (+38h on x86) */
IUnknown *call_state; /* current call context (+3Ch on x86) */
DWORD unknown2[46];
IUnknown *cancel_object; /* cancel object set by CoSetCancelObject (+F8h on x86) */
IUnknown *state; /* see CoSetState */
struct list spies; /* Spies installed with CoRegisterInitializeSpy */
DWORD spies_lock;
};

View File

@ -269,16 +269,15 @@ APARTMENT *apartment_get_current_or_mta(void) DECLSPEC_HIDDEN;
* Per-thread values are stored in the TEB on offset 0xF80
*/
extern HRESULT WINAPI InternalTlsAllocData(struct oletls **tlsdata);
/* will create if necessary */
static inline struct oletls *COM_CurrentInfo(void)
{
struct oletls *oletls;
if (!NtCurrentTeb()->ReservedForOle)
{
struct oletls *oletls = heap_alloc_zero(sizeof(*oletls));
if (oletls)
list_init(&oletls->spies);
NtCurrentTeb()->ReservedForOle = oletls;
}
InternalTlsAllocData(&oletls);
return NtCurrentTeb()->ReservedForOle;
}