1/*
2 * Copyright (c) 2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1.  Redistributions of source code must retain the above copyright
11 *     notice, this list of conditions and the following disclaimer.
12 * 2.  Redistributions in binary form must reproduce the above copyright
13 *     notice, this list of conditions and the following disclaimer in the
14 *     documentation and/or other materials provided with the distribution.
15 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of its
16 *     contributors may be used to endorse or promote products derived from
17 *     this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Portions of this software have been released under the following terms:
31 *
32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC.
33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY
34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION
35 *
36 * To anyone who acknowledges that this file is provided "AS IS"
37 * without any express or implied warranty:
38 * permission to use, copy, modify, and distribute this file for any
39 * purpose is hereby granted without fee, provided that the above
40 * copyright notices and this notice appears in all source code copies,
41 * and that none of the names of Open Software Foundation, Inc., Hewlett-
42 * Packard Company or Digital Equipment Corporation be used
43 * in advertising or publicity pertaining to distribution of the software
44 * without specific, written prior permission.  Neither Open Software
45 * Foundation, Inc., Hewlett-Packard Company nor Digital
46 * Equipment Corporation makes any representations about the suitability
47 * of this software for any purpose.
48 *
49 * Copyright (c) 2007, Novell, Inc. All rights reserved.
50 * Redistribution and use in source and binary forms, with or without
51 * modification, are permitted provided that the following conditions
52 * are met:
53 *
54 * 1.  Redistributions of source code must retain the above copyright
55 *     notice, this list of conditions and the following disclaimer.
56 * 2.  Redistributions in binary form must reproduce the above copyright
57 *     notice, this list of conditions and the following disclaimer in the
58 *     documentation and/or other materials provided with the distribution.
59 * 3.  Neither the name of Novell Inc. nor the names of its contributors
60 *     may be used to endorse or promote products derived from this
61 *     this software without specific prior written permission.
62 *
63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73 *
74 * @APPLE_LICENSE_HEADER_END@
75 */
76
77/* ex: set shiftwidth=4 softtabstop=4 expandtab: */
78#include "compat/mswrappers.h"
79#include "compat/winerror.h"
80#include <stdlib.h>
81#include <errno.h>
82
83#include <config.h>
84
85#if HAVE_WC16STR_H
86#include <wc16str.h>
87#elif HAVE_COREFOUNDATION_CFSTRINGENCODINGCONVERTER_H
88#include "wc16str.h"
89#endif
90
91RPC_STATUS WideChar16ToMultiByte(PWSTR input, idl_char **output);
92RPC_STATUS MultiByteToWideChar16(idl_char *input, PWSTR *output);
93RPC_STATUS RpcCompatReturnLastCode(void);
94extern idl_char *awc16stombs(PWSTR input);
95extern PWSTR ambstowc16s(idl_char *input);
96
97RPC_STATUS WideChar16ToMultiByte(PWSTR input, idl_char **output)
98{
99    if (input == NULL)
100    {
101        *output = NULL;
102    }
103    else
104    {
105        *output = awc16stombs(input);
106        if(*output == NULL)
107        {
108            if(errno == ENOMEM)
109                return rpc_s_no_memory;
110            return rpc_s_invalid_arg;
111        }
112    }
113    return rpc_s_ok;
114}
115
116RPC_STATUS MultiByteToWideChar16(idl_char *input, PWSTR *output)
117{
118    *output = ambstowc16s(input);
119    if(*output == NULL)
120    {
121        if(errno == ENOMEM)
122            return rpc_s_no_memory;
123        return rpc_s_invalid_arg;
124    }
125    return rpc_s_ok;
126}
127
128#define CONVERT_INPUTSTR(var) \
129    idl_char *converted_##var = NULL; \
130    if(status == rpc_s_ok) \
131        status = WideChar16ToMultiByte((var), &converted_##var);
132
133#define DECLARE_OUTPUTSTR(var) \
134    idl_char *temp_##var = NULL; \
135    *(var) = NULL;
136
137#define CONVERT_OUTPUTSTR(var) \
138    if(temp_##var != NULL) \
139    { \
140        RPC_STATUS unused_status; \
141        if(status == rpc_s_ok) \
142            status = MultiByteToWideChar16(temp_##var, (var)); \
143        rpc_string_free(&temp_##var, &unused_status); \
144    }
145
146#define OUTPUTSTR(var)  &temp_##var
147#define INPUTSTR(var)  converted_##var
148
149#define FREE_INPUTSTR(var) \
150    if(converted_##var != NULL) \
151    { \
152        free(converted_##var); \
153        converted_##var = NULL; \
154    }
155
156RPC_STATUS RpcCompatExceptionToCode(dcethread_exc *exc)
157{
158    RPC_STATUS status;
159    if((status = dcethread_exc_getstatus(exc)) == (RPC_STATUS)-1)
160        return RPC_S_INTERNAL_ERROR;
161    return LwMapDCEStatusToWinerror(status);
162}
163
164RPC_STATUS g_lastcode = 0;
165RPC_STATUS RpcCompatReturnLastCode(void)
166{
167    return g_lastcode;
168}
169
170RpcCompatReturnCodeFuncPtr RpcCompatReturnLater(RPC_STATUS value)
171{
172    g_lastcode = value;
173    return RpcCompatReturnLastCode;
174}
175
176RPC_STATUS RpcStringBindingComposeA(
177    /* [in] */ UCHAR *string_object_uuid,
178    /* [in] */ UCHAR *string_protseq,
179    /* [in] */ UCHAR *string_netaddr,
180    /* [in] */ UCHAR *string_endpoint,
181    /* [in] */ UCHAR *string_options,
182    /* [out] */ UCHAR **string_binding
183)
184{
185    RPC_STATUS status;
186    rpc_string_binding_compose((idl_char *)string_object_uuid, (idl_char *)string_protseq, (idl_char *)string_netaddr, (idl_char *)string_endpoint, (idl_char *)string_options, (idl_char **)string_binding, &status);
187    return LwMapDCEStatusToWinerror(status);
188}
189
190RPC_STATUS RpcStringBindingComposeW(
191    /* [in] */ PWSTR string_object_uuid,
192    /* [in] */ PWSTR string_protseq,
193    /* [in] */ PWSTR string_netaddr,
194    /* [in] */ PWSTR string_endpoint,
195    /* [in] */ PWSTR string_options,
196    /* [out] */ PWSTR *string_binding
197)
198{
199    RPC_STATUS status = rpc_s_ok;
200    CONVERT_INPUTSTR(string_object_uuid);
201    CONVERT_INPUTSTR(string_protseq);
202    CONVERT_INPUTSTR(string_netaddr);
203    CONVERT_INPUTSTR(string_endpoint);
204    CONVERT_INPUTSTR(string_options);
205    DECLARE_OUTPUTSTR(string_binding);
206
207    if(status == rpc_s_ok)
208    {
209        rpc_string_binding_compose(INPUTSTR(string_object_uuid),
210                INPUTSTR(string_protseq),
211                INPUTSTR(string_netaddr),
212                INPUTSTR(string_endpoint),
213                INPUTSTR(string_options),
214                OUTPUTSTR(string_binding),
215		&status);
216    }
217
218    FREE_INPUTSTR(string_object_uuid);
219    FREE_INPUTSTR(string_protseq);
220    FREE_INPUTSTR(string_netaddr);
221    FREE_INPUTSTR(string_endpoint);
222    FREE_INPUTSTR(string_options);
223    CONVERT_OUTPUTSTR(string_binding);
224
225    return LwMapDCEStatusToWinerror(status);
226}
227
228RPC_STATUS RpcBindingFromStringBindingA(
229    /* [in] */ UCHAR *string_binding,
230    /* [out] */ RPC_BINDING_HANDLE *binding_handle
231)
232{
233    RPC_STATUS status;
234    rpc_binding_from_string_binding((idl_char *)string_binding, binding_handle, &status);
235    return LwMapDCEStatusToWinerror(status);
236}
237
238RPC_STATUS RpcBindingFromStringBindingW(
239    /* [in] */ PWSTR string_binding,
240    /* [out] */ RPC_BINDING_HANDLE *binding_handle
241)
242{
243    RPC_STATUS status = rpc_s_ok;
244    CONVERT_INPUTSTR(string_binding);
245
246    if(status == rpc_s_ok)
247    {
248        rpc_binding_from_string_binding(
249                INPUTSTR(string_binding),
250                binding_handle,
251                &status);
252    }
253
254    FREE_INPUTSTR(string_binding);
255
256    return LwMapDCEStatusToWinerror(status);
257}
258
259RPC_STATUS RpcBindingSetAuthInfoA(
260    /* [in] */ RPC_BINDING_HANDLE binding_h,
261    /* [in] */ UCHAR* server_princ_name,
262    /* [in] */ DWORD authn_level,
263    /* [in] */ DWORD authn_protocol,
264    /* [in] */ RPC_AUTH_IDENTITY_HANDLE auth_identity,
265    /* [in] */ DWORD authz_protocol
266)
267{
268    RPC_STATUS status;
269    rpc_binding_set_auth_info(
270            binding_h,
271            (unsigned_char_p_t)server_princ_name,
272            authn_level,
273            authn_protocol,
274            auth_identity,
275            authz_protocol,
276            &status);
277    return LwMapDCEStatusToWinerror(status);
278}
279
280RPC_STATUS RpcBindingSetAuthInfoW(
281    /* [in] */ RPC_BINDING_HANDLE binding_h,
282    /* [in] */ PWSTR server_princ_name,
283    /* [in] */ DWORD authn_level,
284    /* [in] */ DWORD authn_protocol,
285    /* [in] */ RPC_AUTH_IDENTITY_HANDLE auth_identity,
286    /* [in] */ DWORD authz_protocol
287)
288{
289    RPC_STATUS status = rpc_s_ok;
290    CONVERT_INPUTSTR(server_princ_name);
291
292    if (status == rpc_s_ok)
293    {
294        rpc_binding_set_auth_info(
295                binding_h,
296                INPUTSTR(server_princ_name),
297                authn_level,
298                authn_protocol,
299                auth_identity,
300                authz_protocol,
301                &status);
302    }
303
304    FREE_INPUTSTR(server_princ_name);
305
306    return LwMapDCEStatusToWinerror(status);
307}
308
309RPC_STATUS RpcStringFreeA(
310    /* [in, out] */ PUCHAR *string
311)
312{
313    RPC_STATUS status = rpc_s_ok;
314    rpc_string_free((idl_char **)string, &status);
315    return LwMapDCEStatusToWinerror(status);
316}
317
318RPC_STATUS RpcStringFreeW(
319    /* [in, out] */ PWSTR *string
320)
321{
322    //We allocated this string, not dce rpc
323    if(*string != NULL)
324    {
325        free(*string);
326        *string = NULL;
327    }
328    return ERROR_SUCCESS;
329}
330
331RPC_STATUS RpcBindingFree(
332    /* [in, out] */ RPC_BINDING_HANDLE *binding_handle
333)
334{
335    RPC_STATUS status = rpc_s_ok;
336    rpc_binding_free(binding_handle, &status);
337    return LwMapDCEStatusToWinerror(status);
338}
339
340RPC_STATUS RpcServerUseProtseqEpA(
341    /* [in] */ PUCHAR protseq,
342    /* [in] */ unsigned int max_call_requests,
343    /* [in] */ PUCHAR endpoint,
344    void *security ATTRIBUTE_UNUSED
345)
346{
347    RPC_STATUS status = rpc_s_ok;
348    rpc_server_use_protseq_ep((idl_char *)protseq, max_call_requests, (idl_char *)endpoint, &status);
349    return LwMapDCEStatusToWinerror(status);
350}
351
352RPC_STATUS RpcServerUseProtseqEpW(
353    /* [in] */ PWSTR protseq,
354    /* [in] */ unsigned int max_call_requests,
355    /* [in] */ PWSTR endpoint,
356    void *security ATTRIBUTE_UNUSED
357)
358{
359    RPC_STATUS status = rpc_s_ok;
360    CONVERT_INPUTSTR(protseq);
361    CONVERT_INPUTSTR(endpoint);
362
363    if(status == rpc_s_ok)
364    {
365        rpc_server_use_protseq_ep(INPUTSTR(protseq),
366                max_call_requests,
367                INPUTSTR(endpoint),
368                &status);
369    }
370
371    FREE_INPUTSTR(protseq);
372    FREE_INPUTSTR(endpoint);
373
374    return LwMapDCEStatusToWinerror(status);
375}
376
377RPC_STATUS RpcServerRegisterIf(
378    /* [in] */ RPC_IF_HANDLE if_spec,
379    /* [in] */ UUID *mgr_type_uuid,
380    /* [in] */ RPC_MGR_EPV *mgr_epv
381)
382{
383    RPC_STATUS status = rpc_s_ok;
384    rpc_server_register_if(if_spec, mgr_type_uuid, mgr_epv, &status);
385    return LwMapDCEStatusToWinerror(status);
386}
387
388RPC_STATUS RpcServerListen(
389    unsigned32 minimum_call_threads ATTRIBUTE_UNUSED,
390    /* [in] */ unsigned32 max_calls_exec,
391    unsigned32 dont_wait  ATTRIBUTE_UNUSED
392)
393{
394    RPC_STATUS status = rpc_s_ok;
395    rpc_server_listen(max_calls_exec, &status);
396    return LwMapDCEStatusToWinerror(status);
397}
398
399RPC_STATUS LwMapDCEStatusToWinerror(
400    RPC_STATUS dceStatus
401)
402{
403    switch(dceStatus)
404    {
405        case rpc_s_ok:
406            return RPC_S_OK;
407        case rpc_s_op_rng_error:
408            return RPC_S_PROCNUM_OUT_OF_RANGE;
409        case rpc_s_not_in_call:
410            return RPC_S_NO_CALL_ACTIVE;
411        case rpc_s_no_port:
412            return RPC_S_OUT_OF_RESOURCES;
413        case rpc_s_invalid_string_binding:
414            return RPC_S_INVALID_STRING_BINDING;
415        case rpc_s_wrong_kind_of_binding:
416            return RPC_S_WRONG_KIND_OF_BINDING;
417        case rpc_s_invalid_binding:
418            return RPC_S_INVALID_BINDING;
419        case rpc_s_protseq_not_supported:
420            return RPC_S_PROTSEQ_NOT_SUPPORTED;
421        case rpc_s_invalid_rpc_protseq:
422            return RPC_S_INVALID_RPC_PROTSEQ;
423        case uuid_s_invalid_string_uuid:
424            return RPC_S_INVALID_STRING_UUID;
425        case rpc_s_invalid_endpoint_format:
426            return RPC_S_INVALID_ENDPOINT_FORMAT;
427        case rpc_s_inval_net_addr:
428            return RPC_S_INVALID_NET_ADDR;
429        case rpc_s_endpoint_not_found:
430            return RPC_S_NO_ENDPOINT_FOUND;
431        case rpc_s_invalid_timeout:
432            return RPC_S_INVALID_TIMEOUT;
433        case rpc_s_object_not_found:
434            return RPC_S_OBJECT_NOT_FOUND;
435        case rpc_s_already_registered:
436            return RPC_S_ALREADY_REGISTERED;
437        case rpc_s_type_already_registered:
438            return RPC_S_TYPE_ALREADY_REGISTERED;
439        case rpc_s_already_listening:
440            return RPC_S_ALREADY_LISTENING;
441        case rpc_s_no_protseqs_registered:
442            return RPC_S_NO_PROTSEQS_REGISTERED;
443        case rpc_s_not_listening:
444            return RPC_S_NOT_LISTENING;
445        case rpc_s_unknown_mgr_type:
446            return RPC_S_UNKNOWN_MGR_TYPE;
447        case rpc_s_unknown_if:
448            return RPC_S_UNKNOWN_IF;
449        case rpc_s_no_bindings:
450            return RPC_S_NO_BINDINGS;
451        case rpc_s_no_protseqs:
452            return RPC_S_NO_PROTSEQS;
453        case rpc_s_no_rem_endpoint:
454            return RPC_S_CANT_CREATE_ENDPOINT;
455        case rpc_s_connect_no_resources:
456            return RPC_S_OUT_OF_RESOURCES;
457        case ept_s_server_unavailable:
458            return RPC_S_SERVER_UNAVAILABLE;
459        case rpc_s_server_too_busy:
460            return RPC_S_SERVER_TOO_BUSY;
461        case rpc_s_invalid_call_opt:
462            return RPC_S_INVALID_NETWORK_OPTIONS;
463        case rpc_s_call_failed:
464            return RPC_S_CALL_FAILED;
465        case rpc_s_call_faulted:
466            return RPC_S_CALL_FAILED_DNE;
467        case rpc_s_protocol_error:
468            return RPC_S_PROTOCOL_ERROR;
469        case rpc_s_tsyntaxes_unsupported:
470            return RPC_S_UNSUPPORTED_TRANS_SYN;
471        case rpc_s_unsupported_type:
472            return RPC_S_UNSUPPORTED_TYPE;
473        case rpc_s_fault_invalid_tag:
474            return RPC_S_INVALID_TAG;
475        case rpc_s_fault_invalid_bound:
476            return RPC_S_INVALID_BOUND;
477        case rpc_s_no_entry_name:
478            return RPC_S_NO_ENTRY_NAME;
479        case rpc_s_invalid_name_syntax:
480            return RPC_S_INVALID_NAME_SYNTAX;
481        case rpc_s_unsupported_name_syntax:
482            return RPC_S_UNSUPPORTED_NAME_SYNTAX;
483        case uuid_s_no_address:
484            return RPC_S_UUID_NO_ADDRESS;
485        case ept_s_cant_access:
486            return RPC_S_DUPLICATE_ENDPOINT;
487        case rpc_s_unsupported_auth_subtype:
488            return RPC_S_UNKNOWN_AUTHN_TYPE;
489        case rpc_s_max_calls_too_small:
490            return RPC_S_MAX_CALLS_TOO_SMALL;
491        case rpc_s_string_too_long:
492            return RPC_S_STRING_TOO_LONG;
493        case rpc_s_binding_has_no_auth:
494            return RPC_S_BINDING_HAS_NO_AUTH;
495        case rpc_s_unknown_authn_service:
496            return RPC_S_UNKNOWN_AUTHN_SERVICE;
497        case rpc_s_authn_authz_mismatch:
498            return RPC_S_UNKNOWN_AUTHZ_SERVICE;
499        case rpc_s_nothing_to_export:
500            return RPC_S_NOTHING_TO_EXPORT;
501        case rpc_s_incomplete_name:
502            return RPC_S_INCOMPLETE_NAME;
503        case rpc_s_invalid_vers_option:
504            return RPC_S_INVALID_VERS_OPTION;
505        case rpc_s_no_more_members:
506            return RPC_S_NO_MORE_MEMBERS;
507        case rpc_s_not_all_objs_unexported:
508            return RPC_S_NOT_ALL_OBJS_UNEXPORTED;
509        case rpc_s_interface_not_found:
510            return RPC_S_INTERFACE_NOT_FOUND;
511        case rpc_s_entry_already_exists:
512            return RPC_S_ENTRY_ALREADY_EXISTS;
513        case rpc_s_entry_not_found:
514            return RPC_S_ENTRY_NOT_FOUND;
515        case rpc_s_name_service_unavailable:
516            return RPC_S_NAME_SERVICE_UNAVAILABLE;
517        case rpc_s_invalid_naf_id:
518            return RPC_S_INVALID_NAF_ID;
519        case rpc_s_not_supported:
520            return RPC_S_CANNOT_SUPPORT;
521        case rpc_s_context_id_not_found:
522            return RPC_S_NO_CONTEXT_AVAILABLE;
523        case uuid_s_internal_error:
524            return RPC_S_INTERNAL_ERROR;
525        case rpc_s_fault_int_div_by_zero:
526            return RPC_S_ZERO_DIVIDE;
527        case rpc_s_cant_bind_socket:
528            return RPC_S_ADDRESS_ERROR;
529        case rpc_s_fault_fp_div_by_zero:
530            return RPC_S_FP_DIV_ZERO;
531        case rpc_s_fault_fp_underflow:
532            return RPC_S_FP_UNDERFLOW;
533        case rpc_s_fault_fp_overflow:
534            return RPC_S_FP_OVERFLOW;
535        case rpc_s_call_queued:
536            return RPC_S_CALL_IN_PROGRESS;
537        case rpc_s_no_more_bindings:
538            return RPC_S_NO_MORE_BINDINGS;
539        case rpc_s_no_interfaces:
540            return RPC_S_NO_INTERFACES;
541        case rpc_s_call_cancelled:
542            return RPC_S_CALL_CANCELLED;
543        case rpc_s_binding_incomplete:
544            return RPC_S_BINDING_INCOMPLETE;
545        case rpc_s_comm_failure:
546            return RPC_S_COMM_FAILURE;
547        case rpc_s_auth_method:
548            return RPC_S_INVALID_AUTH_IDENTITY;
549        case rpc_s_unsupported_authn_level:
550            return RPC_S_UNSUPPORTED_AUTHN_LEVEL;
551        case rpc_s_invalid_credentials:
552            return RPC_S_NO_PRINC_NAME;
553        case rpc_s_unknown_error:
554            return RPC_S_NOT_RPC_ERROR;
555        case rpc_m_cant_create_uuid:
556            return RPC_S_UUID_LOCAL_ONLY;
557        case rpc_s_cancel_timeout:
558            return RPC_S_NOT_CANCELLED;
559        case rpc_s_group_member_not_found:
560            return RPC_S_GROUP_MEMBER_NOT_FOUND;
561        case rpc_s_invalid_object:
562            return RPC_S_INVALID_OBJECT;
563        case rpc_s_wrong_pickle_type:
564            return RPC_S_ENTRY_TYPE_MISMATCH;
565        case rpc_s_no_interfaces_exported:
566            return RPC_S_INTERFACE_NOT_EXPORTED;
567        case rpc_s_profile_not_found:
568            return RPC_S_PROFILE_NOT_ADDED;
569
570        case ept_s_invalid_entry:
571            return EPT_S_INVALID_ENTRY;
572        case ept_s_cant_perform_op:
573            return EPT_S_CANT_PERFORM_OP;
574        case ept_s_not_registered:
575            return EPT_S_NOT_REGISTERED;
576        case ept_s_cant_create:
577            return EPT_S_CANT_CREATE;
578
579        case uuid_s_no_memory:
580        case rpc_s_no_memory:
581        case ept_s_no_memory:
582        case dce_cs_c_cannot_allocate_memory:
583            return ERROR_OUTOFMEMORY;
584
585        case rpc_s_rpcd_comm_failure:
586        case rpc_s_cannot_connect:
587            return ERROR_CONNECTION_REFUSED;
588        case rpc_s_connection_aborted:
589            return ERROR_CONNECTION_ABORTED;
590        case rpc_s_connection_closed:
591            return ERROR_GRACEFUL_DISCONNECT;
592        case rpc_s_connect_timed_out:
593            return WSAETIMEDOUT;
594        case rpc_s_connect_rejected:
595            return ERROR_CONNECTION_REFUSED;
596        case rpc_s_connect_closed_by_rem:
597            return WSAEDISCON;
598        case rpc_s_cant_create_socket:
599            return ERROR_CANNOT_MAKE;
600
601        case rpc_s_invalid_arg:
602            return RPC_S_INVALID_ARG;
603
604        default:
605            return RPC_S_INTERNAL_ERROR;
606    }
607}
608
609#ifdef __cplusplus
610} //extern C
611#endif
612