📄 rpc_binding.c
字号:
} 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 + -