ReactOS  0.4.14-dev-49-gfb4591c
rpc_assoc.c File Reference
#include <stdarg.h>
#include <assert.h>
#include "rpc.h"
#include "rpcndr.h"
#include "wine/winternl.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "rpc_binding.h"
#include "rpc_assoc.h"
#include "rpc_message.h"
Include dependency graph for rpc_assoc.c:

Go to the source code of this file.

Classes

struct  _RpcContextHandle
 

Macros

#define ROUND_UP(value, alignment)   (((value) + ((alignment) - 1)) & ~((alignment)-1))
 

Typedefs

typedef struct _RpcContextHandle RpcContextHandle
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (rpc)
 
static void RpcContextHandle_Destroy (RpcContextHandle *context_handle)
 
static RPC_STATUS RpcAssoc_Alloc (LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc_out)
 
static BOOL compare_networkoptions (LPCWSTR opts1, LPCWSTR opts2)
 
RPC_STATUS RPCRT4_GetAssociation (LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc_out)
 
RPC_STATUS RpcServerAssoc_GetAssociation (LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, ULONG assoc_gid, RpcAssoc **assoc_out)
 
ULONG RpcAssoc_Release (RpcAssoc *assoc)
 
static RPC_STATUS RpcAssoc_BindConnection (const RpcAssoc *assoc, RpcConnection *conn, const RPC_SYNTAX_IDENTIFIER *InterfaceId, const RPC_SYNTAX_IDENTIFIER *TransferSyntax)
 
static RpcConnectionRpcAssoc_GetIdleConnection (RpcAssoc *assoc, const RPC_SYNTAX_IDENTIFIER *InterfaceId, const RPC_SYNTAX_IDENTIFIER *TransferSyntax, const RpcAuthInfo *AuthInfo, const RpcQualityOfService *QOS)
 
RPC_STATUS RpcAssoc_GetClientConnection (RpcAssoc *assoc, const RPC_SYNTAX_IDENTIFIER *InterfaceId, const RPC_SYNTAX_IDENTIFIER *TransferSyntax, RpcAuthInfo *AuthInfo, RpcQualityOfService *QOS, LPCWSTR CookieAuth, RpcConnection **Connection, BOOL *from_cache)
 
void RpcAssoc_ReleaseIdleConnection (RpcAssoc *assoc, RpcConnection *Connection)
 
void RpcAssoc_ConnectionReleased (RpcAssoc *assoc)
 
RPC_STATUS RpcServerAssoc_AllocateContextHandle (RpcAssoc *assoc, void *CtxGuard, NDR_SCONTEXT *SContext)
 
BOOL RpcContextHandle_IsGuardCorrect (NDR_SCONTEXT SContext, void *CtxGuard)
 
RPC_STATUS RpcServerAssoc_FindContextHandle (RpcAssoc *assoc, const UUID *uuid, void *CtxGuard, ULONG Flags, NDR_SCONTEXT *SContext)
 
RPC_STATUS RpcServerAssoc_UpdateContextHandle (RpcAssoc *assoc, NDR_SCONTEXT SContext, void *CtxGuard, NDR_RUNDOWN rundown_routine)
 
void RpcContextHandle_GetUuid (NDR_SCONTEXT SContext, UUID *uuid)
 
unsigned int RpcServerAssoc_ReleaseContextHandle (RpcAssoc *assoc, NDR_SCONTEXT SContext, BOOL release_lock)
 

Variables

static CRITICAL_SECTION assoc_list_cs = { &assoc_list_cs_debug, -1, 0, 0, 0, 0 }
 
static CRITICAL_SECTION_DEBUG assoc_list_cs_debug
 
static struct list client_assoc_list = LIST_INIT(client_assoc_list)
 
static struct list server_assoc_list = LIST_INIT(server_assoc_list)
 
static LONG last_assoc_group_id
 

Macro Definition Documentation

◆ ROUND_UP

#define ROUND_UP (   value,
  alignment 
)    (((value) + ((alignment) - 1)) & ~((alignment)-1))

Definition at line 228 of file rpc_assoc.c.

Typedef Documentation

◆ RpcContextHandle

Function Documentation

◆ compare_networkoptions()

static BOOL compare_networkoptions ( LPCWSTR  opts1,
LPCWSTR  opts2 
)
static

Definition at line 90 of file rpc_assoc.c.

91 {
92  if ((opts1 == NULL) && (opts2 == NULL))
93  return TRUE;
94  if ((opts1 == NULL) || (opts2 == NULL))
95  return FALSE;
96  return !strcmpW(opts1, opts2);
97 }
#define TRUE
Definition: types.h:120
smooth NULL
Definition: ftsmooth.c:416
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
Definition: unicode.h:229

Referenced by RPCRT4_GetAssociation().

◆ RpcAssoc_Alloc()

static RPC_STATUS RpcAssoc_Alloc ( LPCSTR  Protseq,
LPCSTR  NetworkAddr,
LPCSTR  Endpoint,
LPCWSTR  NetworkOptions,
RpcAssoc **  assoc_out 
)
static

Definition at line 65 of file rpc_assoc.c.

68 {
69  RpcAssoc *assoc;
70  assoc = HeapAlloc(GetProcessHeap(), 0, sizeof(*assoc));
71  if (!assoc)
73  assoc->refs = 1;
77  assoc->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RpcAssoc.cs");
78  assoc->Protseq = RPCRT4_strdupA(Protseq);
79  assoc->NetworkAddr = RPCRT4_strdupA(NetworkAddr);
80  assoc->Endpoint = RPCRT4_strdupA(Endpoint);
81  assoc->NetworkOptions = NetworkOptions ? RPCRT4_strdupW(NetworkOptions) : NULL;
82  assoc->assoc_group_id = 0;
83  assoc->connection_cnt = 0;
84  UuidCreate(&assoc->http_uuid);
85  list_init(&assoc->entry);
86  *assoc_out = assoc;
87  return RPC_S_OK;
88 }
struct list entry
Definition: rpc_assoc.h:29
#define DWORD_PTR
Definition: treelist.c:76
struct list context_handle_list
Definition: rpc_assoc.h:49
LPSTR Endpoint
Definition: rpc_assoc.h:34
LONG connection_cnt
Definition: rpc_assoc.h:46
ULONG assoc_group_id
Definition: rpc_assoc.h:38
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
smooth NULL
Definition: ftsmooth.c:416
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LPSTR NetworkAddr
Definition: rpc_assoc.h:33
LONG refs
Definition: rpc_assoc.h:30
PCRITICAL_SECTION_DEBUG DebugInfo
Definition: winbase.h:859
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:306
#define RPCRT4_strdupA(x)
Definition: rpc_binding.h:151
#define RPC_S_OUT_OF_RESOURCES
Definition: winerror.h:1032
struct list free_connection_pool
Definition: rpc_assoc.h:45
LPWSTR NetworkOptions
Definition: rpc_assoc.h:35
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
#define RPCRT4_strdupW(x)
Definition: rpc_binding.h:152
#define RPC_S_OK
Definition: rpcnterr.h:22
UUID http_uuid
Definition: rpc_assoc.h:39
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
Definition: winbase.h:852
LPSTR Protseq
Definition: rpc_assoc.h:32

Referenced by RPCRT4_GetAssociation(), and RpcServerAssoc_GetAssociation().

◆ RpcAssoc_BindConnection()

static RPC_STATUS RpcAssoc_BindConnection ( const RpcAssoc assoc,
RpcConnection conn,
const RPC_SYNTAX_IDENTIFIER InterfaceId,
const RPC_SYNTAX_IDENTIFIER TransferSyntax 
)
static

Definition at line 230 of file rpc_assoc.c.

233 {
234  RpcPktHdr *hdr;
235  RpcPktHdr *response_hdr;
238  unsigned char *auth_data = NULL;
239  ULONG auth_length;
240 
241  TRACE("sending bind request to server\n");
242 
245  assoc->assoc_group_id,
246  InterfaceId, TransferSyntax);
247 
248  status = RPCRT4_Send(conn, hdr, NULL, 0);
250  if (status != RPC_S_OK)
251  return status;
252 
253  status = RPCRT4_ReceiveWithAuth(conn, &response_hdr, &msg, &auth_data, &auth_length);
254  if (status != RPC_S_OK)
255  {
256  ERR("receive failed with error %d\n", status);
257  return status;
258  }
259 
260  switch (response_hdr->common.ptype)
261  {
262  case PKT_BIND_ACK:
263  {
264  RpcAddressString *server_address = msg.Buffer;
265  if ((msg.BufferLength >= FIELD_OFFSET(RpcAddressString, string[0])) ||
266  (msg.BufferLength >= ROUND_UP(FIELD_OFFSET(RpcAddressString, string[server_address->length]), 4)))
267  {
268  unsigned short remaining = msg.BufferLength -
269  ROUND_UP(FIELD_OFFSET(RpcAddressString, string[server_address->length]), 4);
270  RpcResultList *results = (RpcResultList*)((ULONG_PTR)server_address +
271  ROUND_UP(FIELD_OFFSET(RpcAddressString, string[server_address->length]), 4));
272  if ((results->num_results == 1) &&
273  (remaining >= FIELD_OFFSET(RpcResultList, results[results->num_results])))
274  {
275  switch (results->results[0].result)
276  {
277  case RESULT_ACCEPT:
278  /* respond to authorization request */
279  if (auth_length > sizeof(RpcAuthVerifier))
281  auth_data + sizeof(RpcAuthVerifier),
282  auth_length);
283  if (status == RPC_S_OK)
284  {
285  conn->assoc_group_id = response_hdr->bind_ack.assoc_gid;
286  conn->MaxTransmissionSize = response_hdr->bind_ack.max_tsize;
287  conn->ActiveInterface = *InterfaceId;
288  }
289  break;
291  switch (results->results[0].reason)
292  {
294  ERR("syntax %s, %d.%d not supported\n",
295  debugstr_guid(&InterfaceId->SyntaxGUID),
296  InterfaceId->SyntaxVersion.MajorVersion,
297  InterfaceId->SyntaxVersion.MinorVersion);
299  break;
301  ERR("transfer syntax not supported\n");
303  break;
304  case REASON_NONE:
305  default:
307  }
308  break;
310  default:
311  ERR("rejection result %d\n", results->results[0].result);
313  }
314  }
315  else
316  {
317  ERR("incorrect results size\n");
319  }
320  }
321  else
322  {
323  ERR("bind ack packet too small (%d)\n", msg.BufferLength);
325  }
326  break;
327  }
328  case PKT_BIND_NACK:
329  switch (response_hdr->bind_nack.reject_reason)
330  {
333  ERR("server too busy\n");
335  break;
337  ERR("protocol version not supported\n");
339  break;
341  ERR("unknown authentication service\n");
343  break;
345  ERR("invalid checksum\n");
347  break;
348  default:
349  ERR("rejected bind for reason %d\n", response_hdr->bind_nack.reject_reason);
351  }
352  break;
353  default:
354  ERR("wrong packet type received %d\n", response_hdr->common.ptype);
356  break;
357  }
358 
359  I_RpcFree(msg.Buffer);
360  RPCRT4_FreeHeader(response_hdr);
361  HeapFree(GetProcessHeap(), 0, auth_data);
362  return status;
363 }
USHORT MaxTransmissionSize
Definition: rpc_binding.h:71
#define RPC_S_UNKNOWN_IF
Definition: winerror.h:1028
#define ROUND_UP(value, alignment)
Definition: rpc_assoc.c:228
#define RESULT_PROVIDER_REJECTION
Definition: rpc_defs.h:213
#define REASON_NONE
Definition: rpc_defs.h:215
char hdr[14]
Definition: iptest.cpp:33
void WINAPI I_RpcFree(void *Object)
Definition: rpcrt4_main.c:725
unsigned short MajorVersion
Definition: rpcdcep.h:27
RPC_STATUS RPCRT4_ClientConnectionAuth(RpcConnection *conn, BYTE *challenge, ULONG count)
Definition: rpc_message.c:992
#define RESULT_ACCEPT
Definition: rpc_defs.h:211
#define REJECT_LOCAL_LIMIT_EXCEEDED
Definition: rpc_defs.h:222
VOID RPCRT4_FreeHeader(RpcPktHdr *Header)
Definition: rpc_message.c:403
#define RPC_S_SERVER_UNAVAILABLE
Definition: winerror.h:1033
#define REJECT_UNKNOWN_AUTHN_SERVICE
Definition: rpc_defs.h:228
unsigned short length
Definition: rpc_defs.h:91
#define RPC_S_ACCESS_DENIED
Definition: rpcnterr.h:29
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define REJECT_TEMPORARY_CONGESTION
Definition: rpc_defs.h:221
long RPC_STATUS
Definition: rpc.h:52
RpcPktCommonHdr common
Definition: rpc_defs.h:152
unsigned int assoc_gid
Definition: rpc_defs.h:114
ULONG assoc_group_id
Definition: rpc_assoc.h:38
RpcPktBindAckHdr bind_ack
Definition: rpc_defs.h:157
#define RPC_S_CALL_FAILED_DNE
Definition: winerror.h:1038
RPC_VERSION SyntaxVersion
Definition: rpcdcep.h:33
smooth NULL
Definition: ftsmooth.c:416
ULONG assoc_group_id
Definition: rpc_binding.h:86
RpcPktBindNAckHdr bind_nack
Definition: rpc_defs.h:158
unsigned short max_tsize
Definition: rpc_defs.h:112
#define debugstr_guid
Definition: kernel32.h:35
#define RPC_S_PROTOCOL_ERROR
Definition: winerror.h:1039
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
#define REJECT_INVALID_CHECKSUM
Definition: rpc_defs.h:229
RPC_STATUS RPCRT4_ReceiveWithAuth(RpcConnection *Connection, RpcPktHdr **Header, PRPC_MESSAGE pMsg, unsigned char **auth_data_out, ULONG *auth_length_out)
Definition: rpc_message.c:1376
struct _test_info results[8]
Definition: SetCursorPos.c:29
unsigned char ptype
Definition: rpc_defs.h:30
RpcPktHdr * RPCRT4_BuildBindHeader(ULONG DataRepresentation, unsigned short MaxTransmissionSize, unsigned short MaxReceiveSize, ULONG AssocGroupId, const RPC_SYNTAX_IDENTIFIER *AbstractId, const RPC_SYNTAX_IDENTIFIER *TransferId)
Definition: rpc_message.c:186
unsigned short MinorVersion
Definition: rpcdcep.h:28
#define RPC_S_UNKNOWN_AUTHN_SERVICE
Definition: winerror.h:1055
#define RPC_S_SERVER_TOO_BUSY
Definition: winerror.h:1034
#define ERR(fmt,...)
Definition: debug.h:109
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:107
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header, void *Buffer, unsigned int BufferLength)
Definition: rpc_message.c:1223
#define RESULT_USER_REJECTION
Definition: rpc_defs.h:212
#define msg(x)
Definition: auth_time.c:54
#define REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED
Definition: rpc_defs.h:216
#define REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED
Definition: rpc_defs.h:217
#define RPC_MAX_PACKET_SIZE
Definition: rpc_defs.h:184
unsigned int ULONG
Definition: retypes.h:1
unsigned short reject_reason
Definition: rpc_defs.h:126
static SERVICE_STATUS status
Definition: service.c:31
#define REJECT_PROTOCOL_VERSION_NOT_SUPPORTED
Definition: rpc_defs.h:224
#define HeapFree(x, y, z)
Definition: compat.h:394
#define RPC_S_OK
Definition: rpcnterr.h:22
RPC_SYNTAX_IDENTIFIER ActiveInterface
Definition: rpc_binding.h:92
Definition: ps.c:97

Referenced by RpcAssoc_GetClientConnection().

◆ RpcAssoc_ConnectionReleased()

void RpcAssoc_ConnectionReleased ( RpcAssoc assoc)

Definition at line 448 of file rpc_assoc.c.

449 {
451  return;
452 
453  TRACE("Last %p connection released\n", assoc);
454  assoc->assoc_group_id = 0;
455 }
LONG connection_cnt
Definition: rpc_assoc.h:46
ULONG assoc_group_id
Definition: rpc_assoc.h:38
#define TRACE(s)
Definition: solgame.cpp:4
#define InterlockedDecrement
Definition: armddk.h:52

Referenced by RPCRT4_ReleaseConnection().

◆ RpcAssoc_GetClientConnection()

RPC_STATUS RpcAssoc_GetClientConnection ( RpcAssoc assoc,
const RPC_SYNTAX_IDENTIFIER InterfaceId,
const RPC_SYNTAX_IDENTIFIER TransferSyntax,
RpcAuthInfo AuthInfo,
RpcQualityOfService QOS,
LPCWSTR  CookieAuth,
RpcConnection **  Connection,
BOOL from_cache 
)

Definition at line 391 of file rpc_assoc.c.

396 {
397  RpcConnection *NewConnection;
399 
400  *Connection = RpcAssoc_GetIdleConnection(assoc, InterfaceId, TransferSyntax, AuthInfo, QOS);
401  if (*Connection) {
402  TRACE("return idle connection %p for association %p\n", *Connection, assoc);
403  if (from_cache) *from_cache = TRUE;
404  return RPC_S_OK;
405  }
406 
407  /* create a new connection */
408  status = RPCRT4_CreateConnection(&NewConnection, FALSE /* is this a server connection? */,
409  assoc->Protseq, assoc->NetworkAddr,
410  assoc->Endpoint, assoc->NetworkOptions,
411  AuthInfo, QOS, CookieAuth);
412  if (status != RPC_S_OK)
413  return status;
414 
415  NewConnection->assoc = assoc;
416  status = RPCRT4_OpenClientConnection(NewConnection);
417  if (status != RPC_S_OK)
418  {
419  RPCRT4_ReleaseConnection(NewConnection);
420  return status;
421  }
422 
423  status = RpcAssoc_BindConnection(assoc, NewConnection, InterfaceId, TransferSyntax);
424  if (status != RPC_S_OK)
425  {
426  RPCRT4_ReleaseConnection(NewConnection);
427  return status;
428  }
429 
431 
432  TRACE("return new connection %p for association %p\n", *Connection, assoc);
433  *Connection = NewConnection;
434  if (from_cache) *from_cache = FALSE;
435  return RPC_S_OK;
436 }
#define TRUE
Definition: types.h:120
long RPC_STATUS
Definition: rpc.h:52
LPSTR Endpoint
Definition: rpc_assoc.h:34
LONG connection_cnt
Definition: rpc_assoc.h:46
void RPCRT4_ReleaseConnection(RpcConnection *Connection) DECLSPEC_HIDDEN
#define TRACE(s)
Definition: solgame.cpp:4
LPSTR NetworkAddr
Definition: rpc_assoc.h:33
RPC_STATUS RPCRT4_CreateConnection(RpcConnection **Connection, BOOL server, LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAuthInfo *AuthInfo, RpcQualityOfService *QOS, LPCWSTR CookieAuth) DECLSPEC_HIDDEN
static RpcConnection * RpcAssoc_GetIdleConnection(RpcAssoc *assoc, const RPC_SYNTAX_IDENTIFIER *InterfaceId, const RPC_SYNTAX_IDENTIFIER *TransferSyntax, const RpcAuthInfo *AuthInfo, const RpcQualityOfService *QOS)
Definition: rpc_assoc.c:365
#define InterlockedIncrement
Definition: armddk.h:53
RPC_STATUS RPCRT4_OpenClientConnection(RpcConnection *Connection) DECLSPEC_HIDDEN
LPWSTR NetworkOptions
Definition: rpc_assoc.h:35
static RPC_STATUS RpcAssoc_BindConnection(const RpcAssoc *assoc, RpcConnection *conn, const RPC_SYNTAX_IDENTIFIER *InterfaceId, const RPC_SYNTAX_IDENTIFIER *TransferSyntax)
Definition: rpc_assoc.c:230
static SERVICE_STATUS status
Definition: service.c:31
struct _RpcAssoc * assoc
Definition: rpc_binding.h:88
#define RPC_S_OK
Definition: rpcnterr.h:22
LPSTR Protseq
Definition: rpc_assoc.h:32
Definition: ps.c:97

Referenced by RPCRT4_OpenBinding().

◆ RpcAssoc_GetIdleConnection()

static RpcConnection* RpcAssoc_GetIdleConnection ( RpcAssoc assoc,
const RPC_SYNTAX_IDENTIFIER InterfaceId,
const RPC_SYNTAX_IDENTIFIER TransferSyntax,
const RpcAuthInfo AuthInfo,
const RpcQualityOfService QOS 
)
static

Definition at line 365 of file rpc_assoc.c.

369 {
370  RpcConnection *Connection;
371  EnterCriticalSection(&assoc->cs);
372  /* try to find a compatible connection from the connection pool */
373  LIST_FOR_EACH_ENTRY(Connection, &assoc->free_connection_pool, RpcConnection, conn_pool_entry)
374  {
375  if (!memcmp(&Connection->ActiveInterface, InterfaceId,
376  sizeof(RPC_SYNTAX_IDENTIFIER)) &&
377  RpcAuthInfo_IsEqual(Connection->AuthInfo, AuthInfo) &&
378  RpcQualityOfService_IsEqual(Connection->QOS, QOS))
379  {
380  list_remove(&Connection->conn_pool_entry);
381  LeaveCriticalSection(&assoc->cs);
382  TRACE("got connection from pool %p\n", Connection);
383  return Connection;
384  }
385  }
386 
387  LeaveCriticalSection(&assoc->cs);
388  return NULL;
389 }
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
struct list conn_pool_entry
Definition: rpc_binding.h:85
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
smooth NULL
Definition: ftsmooth.c:416
BOOL RpcAuthInfo_IsEqual(const RpcAuthInfo *AuthInfo1, const RpcAuthInfo *AuthInfo2)
Definition: rpc_binding.c:1206
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
Definition: list.h:108
#define TRACE(s)
Definition: solgame.cpp:4
RpcAuthInfo * AuthInfo
Definition: rpc_binding.h:77
struct list free_connection_pool
Definition: rpc_assoc.h:45
BOOL RpcQualityOfService_IsEqual(const RpcQualityOfService *qos1, const RpcQualityOfService *qos2)
Definition: rpc_binding.c:1387
RpcQualityOfService * QOS
Definition: rpc_binding.h:81
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
RPC_SYNTAX_IDENTIFIER ActiveInterface
Definition: rpc_binding.h:92

Referenced by RpcAssoc_GetClientConnection().

◆ RpcAssoc_Release()

ULONG RpcAssoc_Release ( RpcAssoc assoc)

Definition at line 188 of file rpc_assoc.c.

189 {
190  ULONG refs;
191 
193  refs = --assoc->refs;
194  if (!refs)
195  list_remove(&assoc->entry);
197 
198  if (!refs)
199  {
200  RpcConnection *Connection, *cursor2;
201  RpcContextHandle *context_handle, *context_handle_cursor;
202 
203  TRACE("destroying assoc %p\n", assoc);
204 
205  LIST_FOR_EACH_ENTRY_SAFE(Connection, cursor2, &assoc->free_connection_pool, RpcConnection, conn_pool_entry)
206  {
207  list_remove(&Connection->conn_pool_entry);
208  RPCRT4_ReleaseConnection(Connection);
209  }
210 
211  LIST_FOR_EACH_ENTRY_SAFE(context_handle, context_handle_cursor, &assoc->context_handle_list, RpcContextHandle, entry)
212  RpcContextHandle_Destroy(context_handle);
213 
214  HeapFree(GetProcessHeap(), 0, assoc->NetworkOptions);
215  HeapFree(GetProcessHeap(), 0, assoc->Endpoint);
216  HeapFree(GetProcessHeap(), 0, assoc->NetworkAddr);
217  HeapFree(GetProcessHeap(), 0, assoc->Protseq);
218 
219  assoc->cs.DebugInfo->Spare[0] = 0;
220  DeleteCriticalSection(&assoc->cs);
221 
222  HeapFree(GetProcessHeap(), 0, assoc);
223  }
224 
225  return refs;
226 }
struct list entry
Definition: rpc_assoc.h:29
struct list context_handle_list
Definition: rpc_assoc.h:49
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
struct list conn_pool_entry
Definition: rpc_binding.h:85
LPSTR Endpoint
Definition: rpc_assoc.h:34
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
void RPCRT4_ReleaseConnection(RpcConnection *Connection) DECLSPEC_HIDDEN
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
Definition: list.h:108
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
LPSTR NetworkAddr
Definition: rpc_assoc.h:33
LONG refs
Definition: rpc_assoc.h:30
PCRITICAL_SECTION_DEBUG DebugInfo
Definition: winbase.h:859
uint32_t entry
Definition: isohybrid.c:63
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
struct list free_connection_pool
Definition: rpc_assoc.h:45
LPWSTR NetworkOptions
Definition: rpc_assoc.h:35
unsigned int ULONG
Definition: retypes.h:1
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static void RpcContextHandle_Destroy(RpcContextHandle *context_handle)
Definition: rpc_assoc.c:548
#define HeapFree(x, y, z)
Definition: compat.h:394
static CRITICAL_SECTION assoc_list_cs
Definition: rpc_assoc.c:38
DWORD_PTR Spare[8/sizeof(DWORD_PTR)]
Definition: winbase.h:852
LPSTR Protseq
Definition: rpc_assoc.h:32

Referenced by RpcBindingReset(), RPCRT4_ReleaseBinding(), and RPCRT4_ResolveBinding().

◆ RpcAssoc_ReleaseIdleConnection()

void RpcAssoc_ReleaseIdleConnection ( RpcAssoc assoc,
RpcConnection Connection 
)

Definition at line 438 of file rpc_assoc.c.

439 {
440  assert(!Connection->server);
441  Connection->async_state = NULL;
442  EnterCriticalSection(&assoc->cs);
443  if (!assoc->assoc_group_id) assoc->assoc_group_id = Connection->assoc_group_id;
444  list_add_head(&assoc->free_connection_pool, &Connection->conn_pool_entry);
445  LeaveCriticalSection(&assoc->cs);
446 }
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
#define assert(x)
Definition: debug.h:53
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
struct list conn_pool_entry
Definition: rpc_binding.h:85
ULONG assoc_group_id
Definition: rpc_assoc.h:38
smooth NULL
Definition: ftsmooth.c:416
ULONG assoc_group_id
Definition: rpc_binding.h:86
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
RPC_ASYNC_STATE * async_state
Definition: rpc_binding.h:87
struct list free_connection_pool
Definition: rpc_assoc.h:45
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)

Referenced by RPCRT4_CloseBinding().

◆ RpcContextHandle_Destroy()

static void RpcContextHandle_Destroy ( RpcContextHandle context_handle)
static

Definition at line 548 of file rpc_assoc.c.

549 {
550  TRACE("freeing %p\n", context_handle);
551 
552  if (context_handle->user_context && context_handle->rundown_routine)
553  {
554  TRACE("calling rundown routine %p with user context %p\n",
555  context_handle->rundown_routine, context_handle->user_context);
556  context_handle->rundown_routine(context_handle->user_context);
557  }
558 
559  RtlDeleteResource(&context_handle->rw_lock);
560 
561  HeapFree(GetProcessHeap(), 0, context_handle);
562 }
NTSYSAPI VOID NTAPI RtlDeleteResource(_In_ PRTL_RESOURCE Resource)
void * user_context
Definition: rpc_assoc.c:55
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
NDR_RUNDOWN rundown_routine
Definition: rpc_assoc.c:56
RTL_RWLOCK rw_lock
Definition: rpc_assoc.c:59
#define HeapFree(x, y, z)
Definition: compat.h:394

Referenced by RpcAssoc_Release(), and RpcServerAssoc_ReleaseContextHandle().

◆ RpcContextHandle_GetUuid()

void RpcContextHandle_GetUuid ( NDR_SCONTEXT  SContext,
UUID uuid 
)

Definition at line 542 of file rpc_assoc.c.

543 {
544  RpcContextHandle *context_handle = (RpcContextHandle *)SContext;
545  *uuid = context_handle->uuid;
546 }
Definition: msctf.idl:510

Referenced by NDRSContextMarshall2().

◆ RpcContextHandle_IsGuardCorrect()

BOOL RpcContextHandle_IsGuardCorrect ( NDR_SCONTEXT  SContext,
void CtxGuard 
)

Definition at line 482 of file rpc_assoc.c.

483 {
484  RpcContextHandle *context_handle = (RpcContextHandle *)SContext;
485  return context_handle->ctx_guard == CtxGuard;
486 }
void * ctx_guard
Definition: rpc_assoc.c:57

Referenced by NDRSContextMarshall2(), RpcServerAssoc_FindContextHandle(), and RpcServerAssoc_UpdateContextHandle().

◆ RPCRT4_GetAssociation()

RPC_STATUS RPCRT4_GetAssociation ( LPCSTR  Protseq,
LPCSTR  NetworkAddr,
LPCSTR  Endpoint,
LPCWSTR  NetworkOptions,
RpcAssoc **  assoc_out 
)

Definition at line 99 of file rpc_assoc.c.

102 {
103  RpcAssoc *assoc;
105 
108  {
109  if (!strcmp(Protseq, assoc->Protseq) &&
110  !strcmp(NetworkAddr, assoc->NetworkAddr) &&
111  !strcmp(Endpoint, assoc->Endpoint) &&
112  compare_networkoptions(NetworkOptions, assoc->NetworkOptions))
113  {
114  assoc->refs++;
115  *assoc_out = assoc;
117  TRACE("using existing assoc %p\n", assoc);
118  return RPC_S_OK;
119  }
120  }
121 
122  status = RpcAssoc_Alloc(Protseq, NetworkAddr, Endpoint, NetworkOptions, &assoc);
123  if (status != RPC_S_OK)
124  {
126  return status;
127  }
129  *assoc_out = assoc;
130 
132 
133  TRACE("new assoc %p\n", assoc);
134 
135  return RPC_S_OK;
136 }
struct list entry
Definition: rpc_assoc.h:29
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
long RPC_STATUS
Definition: rpc.h:52
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
LPSTR Endpoint
Definition: rpc_assoc.h:34
static BOOL compare_networkoptions(LPCWSTR opts1, LPCWSTR opts2)
Definition: rpc_assoc.c:90
#define TRACE(s)
Definition: solgame.cpp:4
LPSTR NetworkAddr
Definition: rpc_assoc.h:33
LONG refs
Definition: rpc_assoc.h:30
static RPC_STATUS RpcAssoc_Alloc(LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc_out)
Definition: rpc_assoc.c:65
uint32_t entry
Definition: isohybrid.c:63
static struct list client_assoc_list
Definition: rpc_assoc.c:47
LPWSTR NetworkOptions
Definition: rpc_assoc.h:35
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static SERVICE_STATUS status
Definition: service.c:31
#define RPC_S_OK
Definition: rpcnterr.h:22
static CRITICAL_SECTION assoc_list_cs
Definition: rpc_assoc.c:38
LPSTR Protseq
Definition: rpc_assoc.h:32
Definition: ps.c:97

Referenced by RPCRT4_CompleteBindingA(), RPCRT4_CompleteBindingW(), and RPCRT4_ResolveBinding().

◆ RpcServerAssoc_AllocateContextHandle()

RPC_STATUS RpcServerAssoc_AllocateContextHandle ( RpcAssoc assoc,
void CtxGuard,
NDR_SCONTEXT SContext 
)

Definition at line 457 of file rpc_assoc.c.

459 {
460  RpcContextHandle *context_handle;
461 
462  context_handle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*context_handle));
463  if (!context_handle)
464  return RPC_S_OUT_OF_MEMORY;
465 
466  context_handle->ctx_guard = CtxGuard;
467  RtlInitializeResource(&context_handle->rw_lock);
468  context_handle->refs = 1;
469 
470  /* lock here to mirror unmarshall, so we don't need to special-case the
471  * freeing of a non-marshalled context handle */
472  RtlAcquireResourceExclusive(&context_handle->rw_lock, TRUE);
473 
474  EnterCriticalSection(&assoc->cs);
475  list_add_tail(&assoc->context_handle_list, &context_handle->entry);
476  LeaveCriticalSection(&assoc->cs);
477 
478  *SContext = (NDR_SCONTEXT)context_handle;
479  return RPC_S_OK;
480 }
#define TRUE
Definition: types.h:120
struct list context_handle_list
Definition: rpc_assoc.h:49
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
Definition: list.h:102
#define RPC_S_OUT_OF_MEMORY
Definition: rpcnterr.h:24
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
NTSYSAPI VOID NTAPI RtlInitializeResource(_In_ PRTL_RESOURCE Resource)
struct tagNDR_SCONTEXT * NDR_SCONTEXT
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
RTL_RWLOCK rw_lock
Definition: rpc_assoc.c:59
unsigned int refs
Definition: rpc_assoc.c:60
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
struct list entry
Definition: rpc_assoc.c:54
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void * ctx_guard
Definition: rpc_assoc.c:57
#define RPC_S_OK
Definition: rpcnterr.h:22
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)

Referenced by NDRSContextUnmarshall2().

◆ RpcServerAssoc_FindContextHandle()

RPC_STATUS RpcServerAssoc_FindContextHandle ( RpcAssoc assoc,
const UUID uuid,
void CtxGuard,
ULONG  Flags,
NDR_SCONTEXT SContext 
)

Definition at line 488 of file rpc_assoc.c.

490 {
491  RpcContextHandle *context_handle;
492 
493  EnterCriticalSection(&assoc->cs);
495  {
496  if (RpcContextHandle_IsGuardCorrect((NDR_SCONTEXT)context_handle, CtxGuard) &&
497  !memcmp(&context_handle->uuid, uuid, sizeof(*uuid)))
498  {
499  *SContext = (NDR_SCONTEXT)context_handle;
500  if (context_handle->refs++)
501  {
502  LeaveCriticalSection(&assoc->cs);
503  TRACE("found %p\n", context_handle);
504  RtlAcquireResourceExclusive(&context_handle->rw_lock, TRUE);
505  return RPC_S_OK;
506  }
507  }
508  }
509  LeaveCriticalSection(&assoc->cs);
510 
511  ERR("no context handle found for uuid %s, guard %p\n",
512  debugstr_guid(uuid), CtxGuard);
513  return ERROR_INVALID_HANDLE;
514 }
#define TRUE
Definition: types.h:120
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ERROR_INVALID_HANDLE
Definition: compat.h:88
struct list context_handle_list
Definition: rpc_assoc.h:49
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
#define debugstr_guid
Definition: kernel32.h:35
#define TRACE(s)
Definition: solgame.cpp:4
struct tagNDR_SCONTEXT * NDR_SCONTEXT
uint32_t entry
Definition: isohybrid.c:63
#define ERR(fmt,...)
Definition: debug.h:109
Definition: msctf.idl:510
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
BOOL RpcContextHandle_IsGuardCorrect(NDR_SCONTEXT SContext, void *CtxGuard)
Definition: rpc_assoc.c:482
#define RPC_S_OK
Definition: rpcnterr.h:22
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)

Referenced by NDRSContextUnmarshall2().

◆ RpcServerAssoc_GetAssociation()

RPC_STATUS RpcServerAssoc_GetAssociation ( LPCSTR  Protseq,
LPCSTR  NetworkAddr,
LPCSTR  Endpoint,
LPCWSTR  NetworkOptions,
ULONG  assoc_gid,
RpcAssoc **  assoc_out 
)

Definition at line 138 of file rpc_assoc.c.

142 {
143  RpcAssoc *assoc;
145 
147  if (assoc_gid)
148  {
150  {
151  /* FIXME: NetworkAddr shouldn't be NULL */
152  if (assoc->assoc_group_id == assoc_gid &&
153  !strcmp(Protseq, assoc->Protseq) &&
154  (!NetworkAddr || !assoc->NetworkAddr || !strcmp(NetworkAddr, assoc->NetworkAddr)) &&
155  !strcmp(Endpoint, assoc->Endpoint) &&
156  ((!assoc->NetworkOptions == !NetworkOptions) &&
157  (!NetworkOptions || !strcmpW(NetworkOptions, assoc->NetworkOptions))))
158  {
159  assoc->refs++;
160  *assoc_out = assoc;
162  TRACE("using existing assoc %p\n", assoc);
163  return RPC_S_OK;
164  }
165  }
166  *assoc_out = NULL;
169  }
170 
171  status = RpcAssoc_Alloc(Protseq, NetworkAddr, Endpoint, NetworkOptions, &assoc);
172  if (status != RPC_S_OK)
173  {
175  return status;
176  }
179  *assoc_out = assoc;
180 
182 
183  TRACE("new assoc %p\n", assoc);
184 
185  return RPC_S_OK;
186 }
struct list entry
Definition: rpc_assoc.h:29
static LONG last_assoc_group_id
Definition: rpc_assoc.c:50
#define RPC_S_NO_CONTEXT_AVAILABLE
Definition: winerror.h:1073
static struct list server_assoc_list
Definition: rpc_assoc.c:48
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
long RPC_STATUS
Definition: rpc.h:52
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
LPSTR Endpoint
Definition: rpc_assoc.h:34
ULONG assoc_group_id
Definition: rpc_assoc.h:38
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
LPSTR NetworkAddr
Definition: rpc_assoc.h:33
LONG refs
Definition: rpc_assoc.h:30
static RPC_STATUS RpcAssoc_Alloc(LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc_out)
Definition: rpc_assoc.c:65
uint32_t entry
Definition: isohybrid.c:63
#define InterlockedIncrement
Definition: armddk.h:53
LPWSTR NetworkOptions
Definition: rpc_assoc.h:35
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
Definition: unicode.h:229
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static SERVICE_STATUS status
Definition: service.c:31
#define RPC_S_OK
Definition: rpcnterr.h:22
static CRITICAL_SECTION assoc_list_cs
Definition: rpc_assoc.c:38
LPSTR Protseq
Definition: rpc_assoc.h:32
Definition: ps.c:97

Referenced by process_bind_packet_no_send().

◆ RpcServerAssoc_ReleaseContextHandle()

unsigned int RpcServerAssoc_ReleaseContextHandle ( RpcAssoc assoc,
NDR_SCONTEXT  SContext,
BOOL  release_lock 
)

Definition at line 564 of file rpc_assoc.c.

565 {
566  RpcContextHandle *context_handle = (RpcContextHandle *)SContext;
567  unsigned int refs;
568 
569  if (release_lock)
570  RtlReleaseResource(&context_handle->rw_lock);
571 
572  EnterCriticalSection(&assoc->cs);
573  refs = --context_handle->refs;
574  if (!refs)
575  list_remove(&context_handle->entry);
576  LeaveCriticalSection(&assoc->cs);
577 
578  if (!refs)
579  RpcContextHandle_Destroy(context_handle);
580 
581  return refs;
582 }
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
NTSYSAPI VOID NTAPI RtlReleaseResource(_In_ PRTL_RESOURCE Resource)
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
Definition: list.h:108
RTL_RWLOCK rw_lock
Definition: rpc_assoc.c:59
unsigned int refs
Definition: rpc_assoc.c:60
struct list entry
Definition: rpc_assoc.c:54
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static void RpcContextHandle_Destroy(RpcContextHandle *context_handle)
Definition: rpc_assoc.c:548

Referenced by NDRSContextMarshall2(), and process_request_packet().

◆ RpcServerAssoc_UpdateContextHandle()

RPC_STATUS RpcServerAssoc_UpdateContextHandle ( RpcAssoc assoc,
NDR_SCONTEXT  SContext,
void CtxGuard,
NDR_RUNDOWN  rundown_routine 
)

Definition at line 516 of file rpc_assoc.c.

520 {
521  RpcContextHandle *context_handle = (RpcContextHandle *)SContext;
523 
524  if (!RpcContextHandle_IsGuardCorrect((NDR_SCONTEXT)context_handle, CtxGuard))
525  return ERROR_INVALID_HANDLE;
526 
527  EnterCriticalSection(&assoc->cs);
528  if (UuidIsNil(&context_handle->uuid, &status))
529  {
530  /* add a ref for the data being valid */
531  context_handle->refs++;
532  UuidCreate(&context_handle->uuid);
533  context_handle->rundown_routine = rundown_routine;
534  TRACE("allocated uuid %s for context handle %p\n",
535  debugstr_guid(&context_handle->uuid), context_handle);
536  }
537  LeaveCriticalSection(&assoc->cs);
538 
539  return RPC_S_OK;
540 }
#define ERROR_INVALID_HANDLE
Definition: compat.h:88
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
int WINAPI UuidIsNil(UUID *Uuid, RPC_STATUS *Status)
Definition: rpcrt4_main.c:269
long RPC_STATUS
Definition: rpc.h:52
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
#define debugstr_guid
Definition: kernel32.h:35
#define TRACE(s)
Definition: solgame.cpp:4
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:306
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
static SERVICE_STATUS status
Definition: service.c:31
BOOL RpcContextHandle_IsGuardCorrect(NDR_SCONTEXT SContext, void *CtxGuard)
Definition: rpc_assoc.c:482
#define RPC_S_OK
Definition: rpcnterr.h:22
Definition: ps.c:97

Referenced by NDRSContextMarshall2().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( rpc  )

Variable Documentation

◆ assoc_list_cs

static CRITICAL_SECTION assoc_list_cs = { &assoc_list_cs_debug, -1, 0, 0, 0, 0 }
static

◆ assoc_list_cs_debug

CRITICAL_SECTION_DEBUG assoc_list_cs_debug
static
Initial value:
=
{
0, 0, &assoc_list_cs,
0, 0, { (DWORD_PTR)(__FILE__ ": assoc_list_cs") }
}
#define DWORD_PTR
Definition: treelist.c:76
LIST_ENTRY ProcessLocksList
Definition: winbase.h:848
static CRITICAL_SECTION assoc_list_cs
Definition: rpc_assoc.c:38
static CRITICAL_SECTION_DEBUG assoc_list_cs_debug
Definition: rpc_assoc.c:39

Definition at line 39 of file rpc_assoc.c.

◆ client_assoc_list

struct list client_assoc_list = LIST_INIT(client_assoc_list)
static

Definition at line 47 of file rpc_assoc.c.

Referenced by RPCRT4_GetAssociation().

◆ last_assoc_group_id

LONG last_assoc_group_id
static

Definition at line 50 of file rpc_assoc.c.

Referenced by RpcServerAssoc_GetAssociation().

◆ server_assoc_list

struct list server_assoc_list = LIST_INIT(server_assoc_list)
static

Definition at line 48 of file rpc_assoc.c.

Referenced by RpcServerAssoc_GetAssociation().