Rob Shearman : rpcrt4: Implement I_RpcGetCurrentCallHandle.

Alexandre Julliard julliard at winehq.org
Tue Dec 18 13:08:16 CST 2007


Module: wine
Branch: master
Commit: 1cb7df8a9828d0e7db3f10b914e7f000af5f4506
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1cb7df8a9828d0e7db3f10b914e7f000af5f4506

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Dec 18 14:55:57 2007 +0000

rpcrt4: Implement I_RpcGetCurrentCallHandle.

---

 dlls/rpcrt4/rpc_binding.h |    2 ++
 dlls/rpcrt4/rpc_server.c  |    6 ++++--
 dlls/rpcrt4/rpcrt4_main.c |   37 +++++++++++++++++++++++++++++++------
 3 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/dlls/rpcrt4/rpc_binding.h b/dlls/rpcrt4/rpc_binding.h
index d4c4935..b774074 100644
--- a/dlls/rpcrt4/rpc_binding.h
+++ b/dlls/rpcrt4/rpc_binding.h
@@ -187,5 +187,7 @@ RPC_STATUS RpcTransport_GetTopOfTower(unsigned char *tower_data, size_t *tower_s
 RPC_STATUS RpcTransport_ParseTopOfTower(const unsigned char *tower_data, size_t tower_size, char **protseq, char **networkaddr, char **endpoint);
 
 void RPCRT4_SetThreadCurrentConnection(RpcConnection *Connection);
+void RPCRT4_SetThreadCurrentCallHandle(RpcBinding *Binding);
+RpcBinding *RPCRT4_GetThreadCurrentCallHandle(void);
 
 #endif
diff --git a/dlls/rpcrt4/rpc_server.c b/dlls/rpcrt4/rpc_server.c
index a337df2..a1262da 100644
--- a/dlls/rpcrt4/rpc_server.c
+++ b/dlls/rpcrt4/rpc_server.c
@@ -293,6 +293,7 @@ static void RPCRT4_process_packet(RpcConnection* conn, RpcPktHdr* hdr, RPC_MESSA
       exception = FALSE;
 
       /* dispatch */
+      RPCRT4_SetThreadCurrentCallHandle(msg->Handle);
       __TRY {
         if (func) func(msg);
       } __EXCEPT(rpc_filter) {
@@ -304,6 +305,7 @@ static void RPCRT4_process_packet(RpcConnection* conn, RpcPktHdr* hdr, RPC_MESSA
         response = RPCRT4_BuildFaultHeader(msg->DataRepresentation,
                                            RPC2NCA_STATUS(status));
       } __ENDTRY
+      RPCRT4_SetThreadCurrentCallHandle(NULL);
 
       if (!exception)
         response = RPCRT4_BuildResponseHeader(msg->DataRepresentation,
@@ -1127,6 +1129,6 @@ RPC_STATUS WINAPI RpcMgmtSetServerStackSize(ULONG ThreadStackSize)
  */
 RPC_BINDING_HANDLE WINAPI I_RpcGetCurrentCallHandle(void)
 {
-    FIXME("\n");
-    return NULL;
+    TRACE("\n");
+    return RPCRT4_GetThreadCurrentCallHandle();
 }
diff --git a/dlls/rpcrt4/rpcrt4_main.c b/dlls/rpcrt4/rpcrt4_main.c
index 75d7656..887e049 100644
--- a/dlls/rpcrt4/rpcrt4_main.c
+++ b/dlls/rpcrt4/rpcrt4_main.c
@@ -152,6 +152,7 @@ struct threaddata
     CRITICAL_SECTION cs;
     DWORD thread_id;
     RpcConnection *connection;
+    RpcBinding *server_binding;
 };
 
 /***********************************************************************
@@ -188,7 +189,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 
             DeleteCriticalSection(&tdata->cs);
             if (tdata->connection)
-                ERR("tdata->connection should be NULL but is still set to %p\n", tdata);
+                ERR("tdata->connection should be NULL but is still set to %p\n", tdata->connection);
+            if (tdata->server_binding)
+                ERR("tdata->server_binding should be NULL but is still set to %p\n", tdata->server_binding);
             HeapFree(GetProcessHeap(), 0, tdata);
         }
         break;
@@ -886,31 +889,53 @@ RPC_STATUS RPC_ENTRY RpcMgmtSetCancelTimeout(LONG Timeout)
     return RPC_S_OK;
 }
 
-void RPCRT4_SetThreadCurrentConnection(RpcConnection *Connection)
+static struct threaddata *get_or_create_threaddata(void)
 {
     struct threaddata *tdata = NtCurrentTeb()->ReservedForNtRpc;
     if (!tdata)
     {
-        tdata = HeapAlloc(GetProcessHeap(), 0, sizeof(*tdata));
-        if (!tdata) return;
+        tdata = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*tdata));
+        if (!tdata) return NULL;
 
         InitializeCriticalSection(&tdata->cs);
         tdata->thread_id = GetCurrentThreadId();
-        tdata->connection = Connection;
 
         EnterCriticalSection(&threaddata_cs);
         list_add_tail(&threaddata_list, &tdata->entry);
         LeaveCriticalSection(&threaddata_cs);
 
         NtCurrentTeb()->ReservedForNtRpc = tdata;
-        return;
+        return tdata;
     }
+    return tdata;
+}
+
+void RPCRT4_SetThreadCurrentConnection(RpcConnection *Connection)
+{
+    struct threaddata *tdata = get_or_create_threaddata();
+    if (!tdata) return;
 
     EnterCriticalSection(&tdata->cs);
     tdata->connection = Connection;
     LeaveCriticalSection(&tdata->cs);
 }
 
+void RPCRT4_SetThreadCurrentCallHandle(RpcBinding *Binding)
+{
+    struct threaddata *tdata = get_or_create_threaddata();
+    if (!tdata) return;
+
+    tdata->server_binding = Binding;
+}
+
+RpcBinding *RPCRT4_GetThreadCurrentCallHandle(void)
+{
+    struct threaddata *tdata = get_or_create_threaddata();
+    if (!tdata) return NULL;
+
+    return tdata->server_binding;
+}
+
 /******************************************************************************
  * RpcCancelThread   (rpcrt4.@)
  */




More information about the wine-cvs mailing list