Nikolay Sivov : combase: Expose ROT access helpers.

Alexandre Julliard julliard at winehq.org
Mon Aug 24 15:58:51 CDT 2020


Module: wine
Branch: master
Commit: 33606dbcc5f59f3da72b925dab7c9b1ecfa50797
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=33606dbcc5f59f3da72b925dab7c9b1ecfa50797

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Aug 24 14:27:59 2020 +0300

combase: Expose ROT access helpers.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/combase/combase.c         |   2 +-
 dlls/combase/combase.spec      |  14 +++---
 dlls/combase/combase_private.h |   2 +-
 dlls/combase/irpcss.idl        |   1 +
 dlls/combase/rpc.c             | 108 +++++++++++++++++++++++++++++++++--------
 5 files changed, 98 insertions(+), 29 deletions(-)

diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index df97799fe0..80d6ece266 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -2245,7 +2245,7 @@ DWORD WINAPI CoGetCurrentProcess(void)
         return 0;
 
     if (!tlsdata->thread_seqid)
-        tlsdata->thread_seqid = rpcss_get_next_seqid();
+        rpcss_get_next_seqid(&tlsdata->thread_seqid);
 
     return tlsdata->thread_seqid;
 }
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index a88c5d66fe..9038d5fa8b 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -255,13 +255,13 @@
 @ stub InternalFillLocalOXIDInfo
 @ stub InternalFreeObjRef
 @ stub InternalGetWindowPropInterface
-@ stub InternalIrotEnumRunning
-@ stub InternalIrotGetObject
-@ stub InternalIrotGetTimeOfLastChange
-@ stub InternalIrotIsRunning
-@ stub InternalIrotNoteChangeTime
-@ stub InternalIrotRegister
-@ stub InternalIrotRevoke
+@ stdcall InternalIrotEnumRunning(ptr)
+@ stdcall InternalIrotGetObject(ptr ptr ptr)
+@ stdcall InternalIrotGetTimeOfLastChange(ptr ptr)
+@ stdcall InternalIrotIsRunning(ptr)
+@ stdcall InternalIrotNoteChangeTime(long ptr)
+@ stdcall InternalIrotRegister(ptr ptr ptr ptr long ptr ptr)
+@ stdcall InternalIrotRevoke(long ptr ptr ptr)
 @ stub InternalIsApartmentInitialized
 @ stub InternalIsProcessInitialized
 @ stub InternalMarshalObjRef
diff --git a/dlls/combase/combase_private.h b/dlls/combase/combase_private.h
index e910166fff..7d7583282e 100644
--- a/dlls/combase/combase_private.h
+++ b/dlls/combase/combase_private.h
@@ -90,4 +90,4 @@ static inline struct apartment* com_get_current_apt(void)
 }
 
 /* RpcSs interface */
-DWORD rpcss_get_next_seqid(void) DECLSPEC_HIDDEN;
+HRESULT rpcss_get_next_seqid(DWORD *id) DECLSPEC_HIDDEN;
diff --git a/dlls/combase/irpcss.idl b/dlls/combase/irpcss.idl
index 65078167de..fab69f7310 100644
--- a/dlls/combase/irpcss.idl
+++ b/dlls/combase/irpcss.idl
@@ -18,4 +18,5 @@
 
 #pragma makedep client
 
+#include "wine/irot.idl"
 #include "wine/irpcss.idl"
diff --git a/dlls/combase/rpc.c b/dlls/combase/rpc.c
index 2fbccfd740..3b53166172 100644
--- a/dlls/combase/rpc.c
+++ b/dlls/combase/rpc.c
@@ -127,29 +127,97 @@ static RPC_BINDING_HANDLE get_irpcss_handle(void)
     return irpcss_handle;
 }
 
-DWORD rpcss_get_next_seqid(void)
+static RPC_BINDING_HANDLE get_irot_handle(void)
 {
-    DWORD id = 0;
-    HRESULT hr;
+    static RPC_BINDING_HANDLE irot_handle;
 
-    for (;;)
+    if (!irot_handle)
     {
-        __TRY
-        {
-            hr = irpcss_get_thread_seq_id(get_irpcss_handle(), &id);
-        }
-        __EXCEPT(rpc_filter)
-        {
-            hr = HRESULT_FROM_WIN32(GetExceptionCode());
-        }
-        __ENDTRY
-        if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-        {
-            if (start_rpcss())
-                continue;
-        }
-        break;
+        unsigned short protseq[] = IROT_PROTSEQ;
+        unsigned short endpoint[] = IROT_ENDPOINT;
+
+        RPC_BINDING_HANDLE new_handle = get_rpc_handle(protseq, endpoint);
+        if (InterlockedCompareExchangePointer(&irot_handle, new_handle, NULL))
+            /* another thread beat us to it */
+            RpcBindingFree(&new_handle);
     }
+    return irot_handle;
+}
+
+#define RPCSS_CALL_START \
+    HRESULT hr; \
+    for (;;) { \
+        __TRY {
+
+#define RPCSS_CALL_END \
+        } __EXCEPT(rpc_filter) { \
+            hr = HRESULT_FROM_WIN32(GetExceptionCode()); \
+        } \
+        __ENDTRY \
+        if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE)) { \
+            if (start_rpcss()) \
+                continue; \
+        } \
+        break; \
+    } \
+    return hr;
+
+HRESULT rpcss_get_next_seqid(DWORD *id)
+{
+    RPCSS_CALL_START
+    hr = irpcss_get_thread_seq_id(get_irpcss_handle(), id);
+    RPCSS_CALL_END
+}
+
+HRESULT WINAPI InternalIrotRegister(const MonikerComparisonData *moniker_data,
+        const InterfaceData *object, const InterfaceData *moniker,
+        const FILETIME *time, DWORD flags, IrotCookie *cookie, IrotContextHandle *ctxt_handle)
+{
+    RPCSS_CALL_START
+    hr = IrotRegister(get_irot_handle(), moniker_data, object, moniker, time, flags, cookie, ctxt_handle);
+    RPCSS_CALL_END
+}
+
+HRESULT WINAPI InternalIrotIsRunning(const MonikerComparisonData *moniker_data)
+{
+    RPCSS_CALL_START
+    hr = IrotIsRunning(get_irot_handle(), moniker_data);
+    RPCSS_CALL_END
+}
+
+HRESULT WINAPI InternalIrotGetObject(const MonikerComparisonData *moniker_data, PInterfaceData *obj,
+        IrotCookie *cookie)
+{
+    RPCSS_CALL_START
+    hr = IrotGetObject(get_irot_handle(), moniker_data, obj, cookie);
+    RPCSS_CALL_END
+}
+
+HRESULT WINAPI InternalIrotNoteChangeTime(IrotCookie cookie, const FILETIME *time)
+{
+    RPCSS_CALL_START
+    hr = IrotNoteChangeTime(get_irot_handle(), cookie, time);
+    RPCSS_CALL_END
+}
 
-    return id;
+HRESULT WINAPI InternalIrotGetTimeOfLastChange(const MonikerComparisonData *moniker_data, FILETIME *time)
+{
+    RPCSS_CALL_START
+    hr = IrotGetTimeOfLastChange(get_irot_handle(), moniker_data, time);
+    RPCSS_CALL_END
+}
+
+HRESULT WINAPI InternalIrotEnumRunning(PInterfaceList *list)
+{
+    RPCSS_CALL_START
+    hr = IrotEnumRunning(get_irot_handle(), list);
+    RPCSS_CALL_END
+}
+
+HRESULT WINAPI InternalIrotRevoke(IrotCookie cookie, IrotContextHandle *ctxt_handle, PInterfaceData *object,
+        PInterfaceData *moniker)
+{
+    RPCSS_CALL_START
+    hr = IrotRevoke(get_irot_handle(), cookie, ctxt_handle, object, moniker);
+    RPCSS_CALL_END
 }




More information about the wine-cvs mailing list