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

📄 rpc_binding.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
    }    if (Options && *Options) {      data += RPCRT4_strcopyA(data, (char*)Options);    }    *data++ = ']';  }  *data = 0;  return RPC_S_OK;}/*********************************************************************** *             RpcStringBindingComposeW (RPCRT4.@) */RPC_STATUS WINAPI RpcStringBindingComposeW( RPC_WSTR ObjUuid, RPC_WSTR Protseq,                                            RPC_WSTR NetworkAddr, RPC_WSTR Endpoint,                                            RPC_WSTR Options, RPC_WSTR* StringBinding ){  DWORD len = 1;  RPC_WSTR data;  TRACE("(%s,%s,%s,%s,%s,%p)\n",       debugstr_w( ObjUuid ), debugstr_w( Protseq ),       debugstr_w( NetworkAddr ), debugstr_w( Endpoint ),       debugstr_w( Options ), StringBinding);  if (ObjUuid && *ObjUuid) len += strlenW(ObjUuid) + 1;  if (Protseq && *Protseq) len += strlenW(Protseq) + 1;  if (NetworkAddr && *NetworkAddr) len += strlenW(NetworkAddr);  if (Endpoint && *Endpoint) len += strlenW(Endpoint) + 2;  if (Options && *Options) len += strlenW(Options) + 2;  data = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));  *StringBinding = data;  if (ObjUuid && *ObjUuid) {    data += RPCRT4_strcopyW(data, ObjUuid);    *data++ = '@';  }  if (Protseq && *Protseq) {    data += RPCRT4_strcopyW(data, Protseq);    *data++ = ':';  }  if (NetworkAddr && *NetworkAddr) {    data += RPCRT4_strcopyW(data, NetworkAddr);  }  if ((Endpoint && *Endpoint) ||      (Options && *Options)) {    *data++ = '[';    if (Endpoint && *Endpoint) {      data += RPCRT4_strcopyW(data, Endpoint);      if (Options && *Options) *data++ = ',';    }    if (Options && *Options) {      data += RPCRT4_strcopyW(data, Options);    }    *data++ = ']';  }  *data = 0;  return RPC_S_OK;}/*********************************************************************** *             RpcStringBindingParseA (RPCRT4.@) */RPC_STATUS WINAPI RpcStringBindingParseA( RPC_CSTR StringBinding, RPC_CSTR *ObjUuid,                                          RPC_CSTR *Protseq, RPC_CSTR *NetworkAddr,                                          RPC_CSTR *Endpoint, RPC_CSTR *Options){  CHAR *data, *next;  static const char ep_opt[] = "endpoint=";  TRACE("(%s,%p,%p,%p,%p,%p)\n", debugstr_a((char*)StringBinding),       ObjUuid, Protseq, NetworkAddr, Endpoint, Options);  if (ObjUuid) *ObjUuid = NULL;  if (Protseq) *Protseq = NULL;  if (NetworkAddr) *NetworkAddr = NULL;  if (Endpoint) *Endpoint = NULL;  if (Options) *Options = NULL;  data = (char*) StringBinding;  next = strchr(data, '@');  if (next) {    if (ObjUuid) *ObjUuid = (unsigned char*)RPCRT4_strndupA(data, next - data);    data = next+1;  }  next = strchr(data, ':');  if (next) {    if (Protseq) *Protseq = (unsigned char*)RPCRT4_strndupA(data, next - data);    data = next+1;  }  next = strchr(data, '[');  if (next) {    CHAR *close, *opt;    if (NetworkAddr) *NetworkAddr = (unsigned char*)RPCRT4_strndupA(data, next - data);    data = next+1;    close = strchr(data, ']');    if (!close) goto fail;    /* tokenize options */    while (data < close) {      next = strchr(data, ',');      if (!next || next > close) next = close;      /* FIXME: this is kind of inefficient */      opt = RPCRT4_strndupA(data, next - data);      data = next+1;      /* parse option */      next = strchr(opt, '=');      if (!next) {        /* not an option, must be an endpoint */        if (*Endpoint) goto fail;        *Endpoint = (unsigned char*) opt;      } else {        if (strncmp(opt, ep_opt, strlen(ep_opt)) == 0) {          /* endpoint option */          if (*Endpoint) goto fail;          *Endpoint = (unsigned char*) RPCRT4_strdupA(next+1);          HeapFree(GetProcessHeap(), 0, opt);        } else {          /* network option */          if (*Options) {            /* FIXME: this is kind of inefficient */            *Options = (unsigned char*) RPCRT4_strconcatA( (char*)*Options, opt);            HeapFree(GetProcessHeap(), 0, opt);          } else 	    *Options = (unsigned char*) opt;        }      }    }    data = close+1;    if (*data) goto fail;  }  else if (NetworkAddr)     *NetworkAddr = (unsigned char*)RPCRT4_strdupA(data);  return RPC_S_OK;fail:  if (ObjUuid) RpcStringFreeA((unsigned char**)ObjUuid);  if (Protseq) RpcStringFreeA((unsigned char**)Protseq);  if (NetworkAddr) RpcStringFreeA((unsigned char**)NetworkAddr);  if (Endpoint) RpcStringFreeA((unsigned char**)Endpoint);  if (Options) RpcStringFreeA((unsigned char**)Options);  return RPC_S_INVALID_STRING_BINDING;}/*********************************************************************** *             RpcStringBindingParseW (RPCRT4.@) */RPC_STATUS WINAPI RpcStringBindingParseW( RPC_WSTR StringBinding, RPC_WSTR *ObjUuid,                                          RPC_WSTR *Protseq, RPC_WSTR *NetworkAddr,                                          RPC_WSTR *Endpoint, RPC_WSTR *Options){  WCHAR *data, *next;  static const WCHAR ep_opt[] = {'e','n','d','p','o','i','n','t','=',0};  TRACE("(%s,%p,%p,%p,%p,%p)\n", debugstr_w(StringBinding),       ObjUuid, Protseq, NetworkAddr, Endpoint, Options);  if (ObjUuid) *ObjUuid = NULL;  if (Protseq) *Protseq = NULL;  if (NetworkAddr) *NetworkAddr = NULL;  if (Endpoint) *Endpoint = NULL;  if (Options) *Options = NULL;  data = StringBinding;  next = strchrW(data, '@');  if (next) {    if (ObjUuid) *ObjUuid = RPCRT4_strndupW(data, next - data);    data = next+1;  }  next = strchrW(data, ':');  if (next) {    if (Protseq) *Protseq = RPCRT4_strndupW(data, next - data);    data = next+1;  }  next = strchrW(data, '[');  if (next) {    WCHAR *close, *opt;    if (NetworkAddr) *NetworkAddr = RPCRT4_strndupW(data, next - data);    data = next+1;    close = strchrW(data, ']');    if (!close) goto fail;    /* tokenize options */    while (data < close) {      next = strchrW(data, ',');      if (!next || next > close) next = close;      /* FIXME: this is kind of inefficient */      opt = RPCRT4_strndupW(data, next - data);      data = next+1;      /* parse option */      next = strchrW(opt, '=');      if (!next) {        /* not an option, must be an endpoint */        if (*Endpoint) goto fail;        *Endpoint = opt;      } else {        if (strncmpW(opt, ep_opt, strlenW(ep_opt)) == 0) {          /* endpoint option */          if (*Endpoint) goto fail;          *Endpoint = RPCRT4_strdupW(next+1);          HeapFree(GetProcessHeap(), 0, opt);        } else {          /* network option */          if (*Options) {            /* FIXME: this is kind of inefficient */            *Options = RPCRT4_strconcatW(*Options, opt);            HeapFree(GetProcessHeap(), 0, opt);          } else 	    *Options = opt;        }      }    }    data = close+1;    if (*data) goto fail;  } else if (NetworkAddr)     *NetworkAddr = RPCRT4_strdupW(data);  return RPC_S_OK;fail:  if (ObjUuid) RpcStringFreeW(ObjUuid);  if (Protseq) RpcStringFreeW(Protseq);  if (NetworkAddr) RpcStringFreeW(NetworkAddr);  if (Endpoint) RpcStringFreeW(Endpoint);  if (Options) RpcStringFreeW(Options);  return RPC_S_INVALID_STRING_BINDING;}/*********************************************************************** *             RpcBindingFree (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingFree( RPC_BINDING_HANDLE* Binding ){  RPC_STATUS status;  TRACE("(%p) = %p\n", Binding, *Binding);  status = RPCRT4_DestroyBinding(*Binding);  if (status == RPC_S_OK) *Binding = 0;  return status;}  /*********************************************************************** *             RpcBindingVectorFree (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingVectorFree( RPC_BINDING_VECTOR** BindingVector ){  RPC_STATUS status;  unsigned long c;  TRACE("(%p)\n", BindingVector);  for (c=0; c<(*BindingVector)->Count; c++) {    status = RpcBindingFree(&(*BindingVector)->BindingH[c]);  }  HeapFree(GetProcessHeap(), 0, *BindingVector);  *BindingVector = NULL;  return RPC_S_OK;}  /*********************************************************************** *             RpcBindingInqObject (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingInqObject( RPC_BINDING_HANDLE Binding, UUID* ObjectUuid ){  RpcBinding* bind = (RpcBinding*)Binding;  TRACE("(%p,%p) = %s\n", Binding, ObjectUuid, debugstr_guid(&bind->ObjectUuid));  memcpy(ObjectUuid, &bind->ObjectUuid, sizeof(UUID));  return RPC_S_OK;}  /*********************************************************************** *             RpcBindingSetObject (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingSetObject( RPC_BINDING_HANDLE Binding, UUID* ObjectUuid ){  RpcBinding* bind = (RpcBinding*)Binding;  TRACE("(%p,%s)\n", Binding, debugstr_guid(ObjectUuid));  if (bind->server) return RPC_S_WRONG_KIND_OF_BINDING;  return RPCRT4_SetBindingObject(Binding, ObjectUuid);}/*********************************************************************** *             RpcBindingFromStringBindingA (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingFromStringBindingA( RPC_CSTR StringBinding, RPC_BINDING_HANDLE* Binding ){  RPC_STATUS ret;  RpcBinding* bind = NULL;  RPC_CSTR ObjectUuid, Protseq, NetworkAddr, Endpoint, Options;  UUID Uuid;  TRACE("(%s,%p)\n", debugstr_a((char*)StringBinding), Binding);  ret = RpcStringBindingParseA(StringBinding, &ObjectUuid, &Protseq,                              &NetworkAddr, &Endpoint, &Options);  if (ret != RPC_S_OK) return ret;  ret = UuidFromStringA(ObjectUuid, &Uuid);  if (ret == RPC_S_OK)    ret = RPCRT4_CreateBindingA(&bind, FALSE, (char*)Protseq);  if (ret == RPC_S_OK)    ret = RPCRT4_SetBindingObject(bind, &Uuid);  if (ret == RPC_S_OK)    ret = RPCRT4_CompleteBindingA(bind, (char*)NetworkAddr, (char*)Endpoint, (char*)Options);  RpcStringFreeA((unsigned char**)&Options);  RpcStringFreeA((unsigned char**)&Endpoint);  RpcStringFreeA((unsigned char**)&NetworkAddr);  RpcStringFreeA((unsigned char**)&Protseq);  RpcStringFreeA((unsigned char**)&ObjectUuid);  if (ret == RPC_S_OK)     *Binding = (RPC_BINDING_HANDLE)bind;  else     RPCRT4_DestroyBinding(bind);  return ret;}/*********************************************************************** *             RpcBindingFromStringBindingW (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingFromStringBindingW( RPC_WSTR StringBinding, RPC_BINDING_HANDLE* Binding ){  RPC_STATUS ret;  RpcBinding* bind = NULL;  RPC_WSTR ObjectUuid, Protseq, NetworkAddr, Endpoint, Options;  UUID Uuid;  TRACE("(%s,%p)\n", debugstr_w(StringBinding), Binding);  ret = RpcStringBindingParseW(StringBinding, &ObjectUuid, &Protseq,                              &NetworkAddr, &Endpoint, &Options);  if (ret != RPC_S_OK) return ret;  ret = UuidFromStringW(ObjectUuid, &Uuid);  if (ret == RPC_S_OK)    ret = RPCRT4_CreateBindingW(&bind, FALSE, Protseq);  if (ret == RPC_S_OK)    ret = RPCRT4_SetBindingObject(bind, &Uuid);  if (ret == RPC_S_OK)    ret = RPCRT4_CompleteBindingW(bind, NetworkAddr, Endpoint, Options);  RpcStringFreeW(&Options);  RpcStringFreeW(&Endpoint);  RpcStringFreeW(&NetworkAddr);  RpcStringFreeW(&Protseq);  RpcStringFreeW(&ObjectUuid);  if (ret == RPC_S_OK)    *Binding = (RPC_BINDING_HANDLE)bind;  else    RPCRT4_DestroyBinding(bind);  return ret;}  /*********************************************************************** *             RpcBindingToStringBindingA (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingToStringBindingA( RPC_BINDING_HANDLE Binding, RPC_CSTR *StringBinding ){  RPC_STATUS ret;  RpcBinding* bind = (RpcBinding*)Binding;  RPC_CSTR ObjectUuid;  TRACE("(%p,%p)\n", Binding, StringBinding);  ret = UuidToStringA(&bind->ObjectUuid, &ObjectUuid);  if (ret != RPC_S_OK) return ret;  ret = RpcStringBindingComposeA(ObjectUuid, (unsigned char*)bind->Protseq, (unsigned char*) bind->NetworkAddr,                                 (unsigned char*) bind->Endpoint, NULL, StringBinding);  RpcStringFreeA(&ObjectUuid);  return ret;}

⌨️ 快捷键说明

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