ReactOS 0.4.16-dev-1946-g52006dd
rpc_assoc.h File Reference
#include "rpc_binding.h"
#include "wine/list.h"
Include dependency graph for rpc_assoc.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _RpcAssoc
 

Typedefs

typedef struct _RpcAssoc RpcAssoc
 

Functions

RPC_STATUS RPCRT4_GetAssociation (LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc)
 
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)
 
ULONG RpcAssoc_Release (RpcAssoc *assoc)
 
RPC_STATUS RpcServerAssoc_GetAssociation (LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, ULONG assoc_gid, RpcAssoc **assoc_out)
 
RPC_STATUS RpcServerAssoc_AllocateContextHandle (RpcAssoc *assoc, void *CtxGuard, NDR_SCONTEXT *SContext)
 
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)
 
unsigned int RpcServerAssoc_ReleaseContextHandle (RpcAssoc *assoc, NDR_SCONTEXT SContext, BOOL release_lock)
 
void RpcContextHandle_GetUuid (NDR_SCONTEXT SContext, UUID *uuid)
 
BOOL RpcContextHandle_IsGuardCorrect (NDR_SCONTEXT SContext, void *CtxGuard)
 
void RpcAssoc_ConnectionReleased (RpcAssoc *assoc)
 

Typedef Documentation

◆ RpcAssoc

Function Documentation

◆ RpcAssoc_ConnectionReleased()

void RpcAssoc_ConnectionReleased ( RpcAssoc assoc)

Definition at line 447 of file rpc_assoc.c.

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

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 390 of file rpc_assoc.c.

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

Referenced by RPCRT4_OpenBinding().

◆ RpcAssoc_Release()

ULONG RpcAssoc_Release ( RpcAssoc assoc)

Definition at line 187 of file rpc_assoc.c.

188{
189 ULONG refs;
190
192 refs = --assoc->refs;
193 if (!refs)
194 list_remove(&assoc->entry);
196
197 if (!refs)
198 {
199 RpcConnection *Connection, *cursor2;
200 RpcContextHandle *context_handle, *context_handle_cursor;
201
202 TRACE("destroying assoc %p\n", assoc);
203
204 LIST_FOR_EACH_ENTRY_SAFE(Connection, cursor2, &assoc->free_connection_pool, RpcConnection, conn_pool_entry)
205 {
206 list_remove(&Connection->conn_pool_entry);
207 RPCRT4_ReleaseConnection(Connection);
208 }
209
210 LIST_FOR_EACH_ENTRY_SAFE(context_handle, context_handle_cursor, &assoc->context_handle_list, RpcContextHandle, entry)
211 RpcContextHandle_Destroy(context_handle);
212
213 free(assoc->NetworkOptions);
214 free(assoc->Endpoint);
215 free(assoc->NetworkAddr);
216 free(assoc->Protseq);
217
218 assoc->cs.DebugInfo->Spare[0] = 0;
219 DeleteCriticalSection(&assoc->cs);
220
221 free(assoc);
222 }
223
224 return refs;
225}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
#define free
Definition: debug_ros.c:5
uint32_t entry
Definition: isohybrid.c:63
static void RpcContextHandle_Destroy(RpcContextHandle *context_handle)
Definition: rpc_assoc.c:548
static CRITICAL_SECTION assoc_list_cs
Definition: rpc_assoc.c:37
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
PRTL_CRITICAL_SECTION_DEBUG DebugInfo
Definition: rtltypes.h:1450
struct list free_connection_pool
Definition: rpc_assoc.h:45
LONG refs
Definition: rpc_assoc.h:30
struct list context_handle_list
Definition: rpc_assoc.h:49
CRITICAL_SECTION cs
Definition: rpc_assoc.h:41
struct list entry
Definition: rpc_assoc.h:29
struct list conn_pool_entry
Definition: rpc_binding.h:85
uint32_t ULONG
Definition: typedefs.h:59
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

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

◆ RpcAssoc_ReleaseIdleConnection()

void RpcAssoc_ReleaseIdleConnection ( RpcAssoc assoc,
RpcConnection Connection 
)

Definition at line 437 of file rpc_assoc.c.

438{
439 assert(!Connection->server);
440 Connection->async_state = NULL;
441 EnterCriticalSection(&assoc->cs);
442 if (!assoc->assoc_group_id) assoc->assoc_group_id = Connection->assoc_group_id;
444 LeaveCriticalSection(&assoc->cs);
445}
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
#define NULL
Definition: types.h:112
#define assert(x)
Definition: debug.h:53
ULONG assoc_group_id
Definition: rpc_binding.h:86
RPC_ASYNC_STATE * async_state
Definition: rpc_binding.h:87

Referenced by RPCRT4_CloseBinding().

◆ 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:532

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:56

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

◆ RPCRT4_GetAssociation()

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

Definition at line 98 of file rpc_assoc.c.

101{
102 RpcAssoc *assoc;
104
107 {
108 if (!strcmp(Protseq, assoc->Protseq) &&
109 !strcmp(NetworkAddr, assoc->NetworkAddr) &&
110 !strcmp(Endpoint, assoc->Endpoint) &&
111 compare_networkoptions(NetworkOptions, assoc->NetworkOptions))
112 {
113 assoc->refs++;
114 *assoc_out = assoc;
116 TRACE("using existing assoc %p\n", assoc);
117 return RPC_S_OK;
118 }
119 }
120
121 status = RpcAssoc_Alloc(Protseq, NetworkAddr, Endpoint, NetworkOptions, &assoc);
122 if (status != RPC_S_OK)
123 {
125 return status;
126 }
128 *assoc_out = assoc;
129
131
132 TRACE("new assoc %p\n", assoc);
133
134 return RPC_S_OK;
135}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
static BOOL compare_networkoptions(LPCWSTR opts1, LPCWSTR opts2)
Definition: rpc_assoc.c:89
static RPC_STATUS RpcAssoc_Alloc(LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAssoc **assoc_out)
Definition: rpc_assoc.c:64
static struct list client_assoc_list
Definition: rpc_assoc.c:46
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198

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 456 of file rpc_assoc.c.

458{
459 RpcContextHandle *context_handle;
460
461 context_handle = calloc(1, sizeof(*context_handle));
462 if (!context_handle)
463 return RPC_S_OUT_OF_MEMORY;
464
465 context_handle->ctx_guard = CtxGuard;
467 context_handle->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RpcContextHandle.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 EnterCriticalSection(&context_handle->lock);
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}
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
#define calloc
Definition: rosglue.h:14
struct _NDR_SCONTEXT * NDR_SCONTEXT
#define RPC_S_OUT_OF_MEMORY
Definition: rpcnterr.h:24
struct list entry
Definition: rpc_assoc.c:53
unsigned int refs
Definition: rpc_assoc.c:59
CRITICAL_SECTION lock
Definition: rpc_assoc.c:58
#define DWORD_PTR
Definition: treelist.c:76
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1138

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 EnterCriticalSection(&context_handle->lock);
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);
514}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ERR(fmt,...)
Definition: precomp.h:57
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define debugstr_guid
Definition: kernel32.h:35
BOOL RpcContextHandle_IsGuardCorrect(NDR_SCONTEXT SContext, void *CtxGuard)
Definition: rpc_assoc.c:482

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 137 of file rpc_assoc.c.

141{
142 RpcAssoc *assoc;
144
146 if (assoc_gid)
147 {
149 {
150 /* FIXME: NetworkAddr shouldn't be NULL */
151 if (assoc->assoc_group_id == assoc_gid &&
152 !strcmp(Protseq, assoc->Protseq) &&
153 (!NetworkAddr || !assoc->NetworkAddr || !strcmp(NetworkAddr, assoc->NetworkAddr)) &&
154 !strcmp(Endpoint, assoc->Endpoint) &&
155 ((!assoc->NetworkOptions == !NetworkOptions) &&
156 (!NetworkOptions || !wcscmp(NetworkOptions, assoc->NetworkOptions))))
157 {
158 assoc->refs++;
159 *assoc_out = assoc;
161 TRACE("using existing assoc %p\n", assoc);
162 return RPC_S_OK;
163 }
164 }
165 *assoc_out = NULL;
168 }
169
170 status = RpcAssoc_Alloc(Protseq, NetworkAddr, Endpoint, NetworkOptions, &assoc);
171 if (status != RPC_S_OK)
172 {
174 return status;
175 }
178 *assoc_out = assoc;
179
181
182 TRACE("new assoc %p\n", assoc);
183
184 return RPC_S_OK;
185}
static LONG last_assoc_group_id
Definition: rpc_assoc.c:49
static struct list server_assoc_list
Definition: rpc_assoc.c:47
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define RPC_S_NO_CONTEXT_AVAILABLE
Definition: winerror.h:1430

Referenced by process_bind_packet_no_send().

◆ RpcServerAssoc_ReleaseContextHandle()

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

Definition at line 565 of file rpc_assoc.c.

566{
567 RpcContextHandle *context_handle = (RpcContextHandle *)SContext;
568 unsigned int refs;
569
570 if (release_lock)
571 LeaveCriticalSection(&context_handle->lock);
572
573 EnterCriticalSection(&assoc->cs);
574 refs = --context_handle->refs;
575 if (!refs)
576 list_remove(&context_handle->entry);
577 LeaveCriticalSection(&assoc->cs);
578
579 if (!refs)
580 RpcContextHandle_Destroy(context_handle);
581
582 return refs;
583}

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))
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}
int WINAPI UuidIsNil(UUID *Uuid, RPC_STATUS *Status)
Definition: rpcrt4_main.c:293
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:330

Referenced by NDRSContextMarshall2().