⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpc_binding.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * RPC binding API * * Copyright 2001 Ove K鍁en, TransGaming Technologies * Copyright 2003 Mike Hearn * Copyright 2004 Filip Navara * Copyright 2006 CodeWeavers * * 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 <stdarg.h>#include <stdio.h>#include <string.h>#include <assert.h>#include "windef.h"#include "winbase.h"#include "winnls.h"#include "winerror.h"#include "winternl.h"#include "wine/unicode.h"#include "rpc.h"#include "rpcndr.h"#include "wine/debug.h"#include "rpc_binding.h"#include "rpc_message.h"WINE_DEFAULT_DEBUG_CHANNEL(rpc);LPSTR RPCRT4_strndupA(LPCSTR src, INT slen){  DWORD len;  LPSTR s;  if (!src) return NULL;  if (slen == -1) slen = strlen(src);  len = slen;  s = HeapAlloc(GetProcessHeap(), 0, len+1);  memcpy(s, src, len);  s[len] = 0;  return s;}LPSTR RPCRT4_strdupWtoA(LPCWSTR src){  DWORD len;  LPSTR s;  if (!src) return NULL;  len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL);  s = HeapAlloc(GetProcessHeap(), 0, len);  WideCharToMultiByte(CP_ACP, 0, src, -1, s, len, NULL, NULL);  return s;}LPWSTR RPCRT4_strdupAtoW(LPCSTR src){  DWORD len;  LPWSTR s;  if (!src) return NULL;  len = MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0);  s = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));  MultiByteToWideChar(CP_ACP, 0, src, -1, s, len);  return s;}static LPWSTR RPCRT4_strndupAtoW(LPCSTR src, INT slen){  DWORD len;  LPWSTR s;  if (!src) return NULL;  len = MultiByteToWideChar(CP_ACP, 0, src, slen, NULL, 0);  s = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));  MultiByteToWideChar(CP_ACP, 0, src, slen, s, len);  return s;}LPWSTR RPCRT4_strndupW(LPCWSTR src, INT slen){  DWORD len;  LPWSTR s;  if (!src) return NULL;  if (slen == -1) slen = strlenW(src);  len = slen;  s = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));  memcpy(s, src, len*sizeof(WCHAR));  s[len] = 0;  return s;}void RPCRT4_strfree(LPSTR src){  HeapFree(GetProcessHeap(), 0, src);}static RPC_STATUS RPCRT4_AllocBinding(RpcBinding** Binding, BOOL server){  RpcBinding* NewBinding;  NewBinding = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcBinding));  NewBinding->refs = 1;  NewBinding->server = server;  *Binding = NewBinding;  return RPC_S_OK;}static RPC_STATUS RPCRT4_CreateBindingA(RpcBinding** Binding, BOOL server, LPCSTR Protseq){  RpcBinding* NewBinding;  RPCRT4_AllocBinding(&NewBinding, server);  NewBinding->Protseq = RPCRT4_strdupA(Protseq);  TRACE("binding: %p\n", NewBinding);  *Binding = NewBinding;  return RPC_S_OK;}static RPC_STATUS RPCRT4_CreateBindingW(RpcBinding** Binding, BOOL server, LPCWSTR Protseq){  RpcBinding* NewBinding;  RPCRT4_AllocBinding(&NewBinding, server);  NewBinding->Protseq = RPCRT4_strdupWtoA(Protseq);  TRACE("binding: %p\n", NewBinding);  *Binding = NewBinding;  return RPC_S_OK;}static RPC_STATUS RPCRT4_CompleteBindingA(RpcBinding* Binding, LPCSTR NetworkAddr,                                          LPCSTR Endpoint, LPCSTR NetworkOptions){  RPC_STATUS status;  TRACE("(RpcBinding == ^%p, NetworkAddr == %s, EndPoint == %s, NetworkOptions == %s)\n", Binding,   debugstr_a(NetworkAddr), debugstr_a(Endpoint), debugstr_a(NetworkOptions));  RPCRT4_strfree(Binding->NetworkAddr);  Binding->NetworkAddr = RPCRT4_strdupA(NetworkAddr);  RPCRT4_strfree(Binding->Endpoint);  if (Endpoint) {    Binding->Endpoint = RPCRT4_strdupA(Endpoint);  } else {    Binding->Endpoint = RPCRT4_strdupA("");  }  HeapFree(GetProcessHeap(), 0, Binding->NetworkOptions);  Binding->NetworkOptions = RPCRT4_strdupAtoW(NetworkOptions);  if (!Binding->Endpoint) ERR("out of memory?\n");  status = RPCRT4_GetAssociation(Binding->Protseq, Binding->NetworkAddr,                                 Binding->Endpoint, Binding->NetworkOptions,                                 &Binding->Assoc);  if (status != RPC_S_OK)      return status;  return RPC_S_OK;}static RPC_STATUS RPCRT4_CompleteBindingW(RpcBinding* Binding, LPCWSTR NetworkAddr,                                          LPCWSTR Endpoint, LPCWSTR NetworkOptions){  RPC_STATUS status;  TRACE("(RpcBinding == ^%p, NetworkAddr == %s, EndPoint == %s, NetworkOptions == %s)\n", Binding,    debugstr_w(NetworkAddr), debugstr_w(Endpoint), debugstr_w(NetworkOptions));  RPCRT4_strfree(Binding->NetworkAddr);  Binding->NetworkAddr = RPCRT4_strdupWtoA(NetworkAddr);  RPCRT4_strfree(Binding->Endpoint);  if (Endpoint) {    Binding->Endpoint = RPCRT4_strdupWtoA(Endpoint);  } else {    Binding->Endpoint = RPCRT4_strdupA("");  }  if (!Binding->Endpoint) ERR("out of memory?\n");  HeapFree(GetProcessHeap(), 0, Binding->NetworkOptions);  Binding->NetworkOptions = RPCRT4_strdupW(NetworkOptions);  status = RPCRT4_GetAssociation(Binding->Protseq, Binding->NetworkAddr,                                 Binding->Endpoint, Binding->NetworkOptions,                                 &Binding->Assoc);  if (status != RPC_S_OK)      return status;  return RPC_S_OK;}RPC_STATUS RPCRT4_ResolveBinding(RpcBinding* Binding, LPCSTR Endpoint){  RPC_STATUS status;  TRACE("(RpcBinding == ^%p, EndPoint == \"%s\"\n", Binding, Endpoint);  RPCRT4_strfree(Binding->Endpoint);  Binding->Endpoint = RPCRT4_strdupA(Endpoint);  RpcAssoc_Release(Binding->Assoc);  Binding->Assoc = NULL;  status = RPCRT4_GetAssociation(Binding->Protseq, Binding->NetworkAddr,                                 Binding->Endpoint, Binding->NetworkOptions,                                 &Binding->Assoc);  if (status != RPC_S_OK)      return status;  return RPC_S_OK;}RPC_STATUS RPCRT4_SetBindingObject(RpcBinding* Binding, const UUID* ObjectUuid){  TRACE("(*RpcBinding == ^%p, UUID == %s)\n", Binding, debugstr_guid(ObjectUuid));   if (ObjectUuid) memcpy(&Binding->ObjectUuid, ObjectUuid, sizeof(UUID));  else UuidCreateNil(&Binding->ObjectUuid);  return RPC_S_OK;}RPC_STATUS RPCRT4_MakeBinding(RpcBinding** Binding, RpcConnection* Connection){  RpcBinding* NewBinding;  TRACE("(RpcBinding == ^%p, Connection == ^%p)\n", Binding, Connection);  RPCRT4_AllocBinding(&NewBinding, Connection->server);  NewBinding->Protseq = RPCRT4_strdupA(rpcrt4_conn_get_name(Connection));  NewBinding->NetworkAddr = RPCRT4_strdupA(Connection->NetworkAddr);  NewBinding->Endpoint = RPCRT4_strdupA(Connection->Endpoint);  NewBinding->FromConn = Connection;  TRACE("binding: %p\n", NewBinding);  *Binding = NewBinding;  return RPC_S_OK;}RPC_STATUS RPCRT4_ExportBinding(RpcBinding** Binding, RpcBinding* OldBinding){  InterlockedIncrement(&OldBinding->refs);  *Binding = OldBinding;  return RPC_S_OK;}RPC_STATUS RPCRT4_DestroyBinding(RpcBinding* Binding){  if (InterlockedDecrement(&Binding->refs))    return RPC_S_OK;  TRACE("binding: %p\n", Binding);  if (Binding->Assoc) RpcAssoc_Release(Binding->Assoc);  RPCRT4_strfree(Binding->Endpoint);  RPCRT4_strfree(Binding->NetworkAddr);  RPCRT4_strfree(Binding->Protseq);  HeapFree(GetProcessHeap(), 0, Binding->NetworkOptions);  if (Binding->AuthInfo) RpcAuthInfo_Release(Binding->AuthInfo);  if (Binding->QOS) RpcQualityOfService_Release(Binding->QOS);  HeapFree(GetProcessHeap(), 0, Binding);  return RPC_S_OK;}RPC_STATUS RPCRT4_OpenBinding(RpcBinding* Binding, RpcConnection** Connection,                              PRPC_SYNTAX_IDENTIFIER TransferSyntax,                              PRPC_SYNTAX_IDENTIFIER InterfaceId){  TRACE("(Binding == ^%p)\n", Binding);  if (!Binding->server) {     return RpcAssoc_GetClientConnection(Binding->Assoc, InterfaceId,         TransferSyntax, Binding->AuthInfo, Binding->QOS, Connection);  } else {    /* we already have a connection with acceptable binding, so use it */    if (Binding->FromConn) {      *Connection = Binding->FromConn;      return RPC_S_OK;    } else {       ERR("no connection in binding\n");       return RPC_S_INTERNAL_ERROR;    }  }}RPC_STATUS RPCRT4_CloseBinding(RpcBinding* Binding, RpcConnection* Connection){  TRACE("(Binding == ^%p)\n", Binding);  if (!Connection) return RPC_S_OK;  if (Binding->server) {    /* don't destroy a connection that is cached in the binding */    if (Binding->FromConn == Connection)      return RPC_S_OK;    return RPCRT4_DestroyConnection(Connection);  }  else {    RpcAssoc_ReleaseIdleConnection(Binding->Assoc, Connection);    return RPC_S_OK;  }}/* utility functions for string composing and parsing */static unsigned RPCRT4_strcopyA(LPSTR data, LPCSTR src){  unsigned len = strlen(src);  memcpy(data, src, len*sizeof(CHAR));  return len;}static unsigned RPCRT4_strcopyW(LPWSTR data, LPCWSTR src){  unsigned len = strlenW(src);  memcpy(data, src, len*sizeof(WCHAR));  return len;}static LPSTR RPCRT4_strconcatA(LPSTR dst, LPCSTR src){  DWORD len = strlen(dst), slen = strlen(src);  LPSTR ndst = HeapReAlloc(GetProcessHeap(), 0, dst, (len+slen+2)*sizeof(CHAR));  if (!ndst)  {    HeapFree(GetProcessHeap(), 0, dst);    return NULL;  }  ndst[len] = ',';  memcpy(ndst+len+1, src, slen+1);  return ndst;}static LPWSTR RPCRT4_strconcatW(LPWSTR dst, LPCWSTR src){  DWORD len = strlenW(dst), slen = strlenW(src);  LPWSTR ndst = HeapReAlloc(GetProcessHeap(), 0, dst, (len+slen+2)*sizeof(WCHAR));  if (!ndst)   {    HeapFree(GetProcessHeap(), 0, dst);    return NULL;  }  ndst[len] = ',';  memcpy(ndst+len+1, src, (slen+1)*sizeof(WCHAR));  return ndst;}/*********************************************************************** *             RpcStringBindingComposeA (RPCRT4.@) */RPC_STATUS WINAPI RpcStringBindingComposeA(RPC_CSTR ObjUuid, RPC_CSTR Protseq,                                           RPC_CSTR NetworkAddr, RPC_CSTR Endpoint,                                           RPC_CSTR Options, RPC_CSTR *StringBinding ){  DWORD len = 1;  LPSTR data;  TRACE( "(%s,%s,%s,%s,%s,%p)\n",        debugstr_a( (char*)ObjUuid ), debugstr_a( (char*)Protseq ),        debugstr_a( (char*)NetworkAddr ), debugstr_a( (char*)Endpoint ),        debugstr_a( (char*)Options ), StringBinding );  if (ObjUuid && *ObjUuid) len += strlen((char*)ObjUuid) + 1;  if (Protseq && *Protseq) len += strlen((char*)Protseq) + 1;  if (NetworkAddr && *NetworkAddr) len += strlen((char*)NetworkAddr);  if (Endpoint && *Endpoint) len += strlen((char*)Endpoint) + 2;  if (Options && *Options) len += strlen((char*)Options) + 2;  data = HeapAlloc(GetProcessHeap(), 0, len);  *StringBinding = (unsigned char*)data;  if (ObjUuid && *ObjUuid) {    data += RPCRT4_strcopyA(data, (char*)ObjUuid);    *data++ = '@';  }  if (Protseq && *Protseq) {    data += RPCRT4_strcopyA(data, (char*)Protseq);    *data++ = ':';  }  if (NetworkAddr && *NetworkAddr)    data += RPCRT4_strcopyA(data, (char*)NetworkAddr);  if ((Endpoint && *Endpoint) ||      (Options && *Options)) {    *data++ = '[';    if (Endpoint && *Endpoint) {      data += RPCRT4_strcopyA(data, (char*)Endpoint);      if (Options && *Options) *data++ = ',';

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -