[PATCH 1/5] combase: Add a function to allocate OLE thread data.

Nikolay Sivov nsivov at codeweavers.com
Mon Aug 17 02:20:49 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/combase/combase.c         | 16 +++++++++++++
 dlls/combase/combase.spec      |  2 +-
 dlls/combase/combase_private.h | 42 ++++++++++++++++++++++++++++++++++
 dlls/ole32/compobj_private.h   | 11 ++++-----
 4 files changed, 64 insertions(+), 7 deletions(-)
 create mode 100644 dlls/combase/combase_private.h

diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index 8d8d83005bc..cceb36a5931 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -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.@)
  */
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 0f34dc6918e..1298fedd9ec 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -274,7 +274,7 @@
 @ stub InternalSetAptCallCtrlOnTlsIfRequired
 @ stub InternalSetOleThunkWowPtr
 @ stub InternalStubInvoke
-@ stub InternalTlsAllocData
+@ stdcall InternalTlsAllocData(ptr)
 @ stub InternalUnmarshalObjRef
 @ stub IsErrorPropagationEnabled
 @ stub NdrExtStubInitialize
diff --git a/dlls/combase/combase_private.h b/dlls/combase/combase_private.h
new file mode 100644
index 00000000000..5ba9c84650e
--- /dev/null
+++ b/dlls/combase/combase_private.h
@@ -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;
+};
diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h
index b64dfbf4f4a..5d7bf50b73f 100644
--- a/dlls/ole32/compobj_private.h
+++ b/dlls/ole32/compobj_private.h
@@ -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;
 }
-- 
2.28.0




More information about the wine-devel mailing list