/*
 *  rpcdcep.h   RPC Distributed Computing Environment (DCE) private functions
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2010 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef __RPCDCEP_H__
#define __RPCDCEP_H__

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* Private RPC primitive data types */
typedef void    *I_RPC_MUTEX;

/* RPC context handle special value */
#define RPC_CONTEXT_HANDLE_DEFAULT_GUARD    0xFFFFF00DL

/* RPC context handle flags */
#define RPC_CONTEXT_HANDLE_DEFAULT_FLAGS    0x00000000L
#define RPC_CONTEXT_HANDLE_FLAGS            0x30000000L
#define RPC_CONTEXT_HANDLE_SERIALIZE        0x10000000L
#define RPC_CONTEXT_HANDLE_DONT_SERIALIZE   0x20000000L
#if (NTDDI_VERSION >= 0x06000000)
    #define RPC_TYPE_STRICT_CONTEXT_HANDLE  0x40000000L
#endif

/* RPC function call types */
#define RPC_NCA_FLAGS_DEFAULT               0x00000000L
#define RPC_NCA_FLAGS_IDEMPOTENT            0x00000001L
#define RPC_NCA_FLAGS_BROADCAST             0x00000002L
#define RPC_NCA_FLAGS_MAYBE                 0x00000004L
#if (NTDDI_VERSION >= 0x06000000)
    #define RPCFLG_HAS_GUARANTEE            0x00000010L
#endif
#define RPC_BUFFER_COMPLETE                 0x00001000L
#define RPC_BUFFER_PARTIAL                  0x00002000L
#define RPC_BUFFER_EXTRA                    0x00004000L
#define RPC_BUFFER_ASYNC                    0x00008000L
#define RPC_BUFFER_NONOTIFY                 0x00010000L
#define RPCFLG_MESSAGE                      0x01000000L
#define RPCFLG_AUTO_COMPLETE                0x08000000L
#define RPCFLG_LOCAL_CALL                   0x10000000L
#define RPCFLG_INPUT_SYNCHRONOUS            0x20000000L
#define RPCFLG_ASYNCHRONOUS                 0x40000000L
#define RPCFLG_NON_NDR                      0x80000000L
#if (NTDDI_VERSION >= 0x05010000)
    #define RPCFLG_HAS_MULTI_SYNTAXES       0x02000000L
    #define RPCFLG_HAS_CALLBACKS            0x04000000L
#endif
#if (NTDDI_VERSION >= 0x06000000)
    #define RPCFLG_ACCESSIBILITY_BIT1       0x00100000L
    #define RPCFLG_ACCESSIBILITY_BIT2       0x00200000L
    #define RPCFLG_ACCESS_LOCAL             0x00400000L
    #define NDR_CUSTOM_OR_DEFAULT_ALLOCATOR 0x10000000L
    #define NDR_DEFAULT_ALLOCATOR           0x20000000L
#endif
#define RPC_FLAGS_VALID_BIT                 0x00008000L

/* RPC interface flags */
#define RPC_INTERFACE_HAS_PIPES 0x00000001

/* RPC proxy connection types */
#define RPC_PROXY_CONNECTION_TYPE_IN_PROXY  0
#define RPC_PROXY_CONNECTION_TYPE_OUT_PROXY 1

/* RPC binding options */
#if (NTDDI_VERSION >= 0x05020000)
    #define RPC_C_OPT_SESSION_ID            6L
    #define RPC_C_OPT_COOKIE_AUTH           7L
    #define RPC_C_OPT_RESOURCE_TYPE_UUID    8L
#endif

/* RPC address change types */
enum RPC_ADDRESS_CHANGE_TYPE {
    PROTOCOL_NOT_LOADED     = 1,
    PROTOCOL_LOADED         = 2,
    PROTOCOL_ADDRESS_CHANGE = 3
};

/* RPC version */
typedef struct _RPC_VERSION {
    unsigned short  MajorVersion;
    unsigned short  MinorVersion;
} RPC_VERSION;

/* RPC syntax identifier */
typedef struct _RPC_SYNTAX_IDENTIFIER {
    GUID        SyntaxGUID;
    RPC_VERSION SyntaxVersion;
} RPC_SYNTAX_IDENTIFIER;
typedef RPC_SYNTAX_IDENTIFIER   *PRPC_SYNTAX_IDENTIFIER;

/* RPC message */
typedef struct _RPC_MESSAGE {
    RPC_BINDING_HANDLE      Handle;
    unsigned long           DataRepresentation;
    void                    *Buffer;
    unsigned int            BufferLength;
    unsigned int            ProcNum;
    PRPC_SYNTAX_IDENTIFIER  TransferSyntax;
    void                    *RpcInterfaceInformation;
    void                    *ReservedForRuntime;
    RPC_MGR_EPV             *ManagerEpv;
    void                    *ImportContext;
    unsigned long           RpcFlags;
} RPC_MESSAGE;
typedef RPC_MESSAGE *PRPC_MESSAGE;

/* RPC private callbacks */
typedef RPC_STATUS (RPC_ENTRY RPC_FORWARD_FUNCTION)( UUID *, RPC_VERSION *, UUID *, unsigned char *, void ** );
typedef void (RPC_ENTRY RPC_ADDRESS_CHANGE_FN)( void * );
typedef void (RPC_ENTRY RPC_DISPATCH_FUNCTION)( PRPC_MESSAGE );
typedef void (RPC_ENTRY *PRPC_RUNDOWN)( void * );
typedef void (RPC_ENTRY *RPCLT_PDU_FILTER_FUNC)( void *, unsigned int, int );
typedef void (__cdecl *RPC_SETFILTER_FUNC)( RPCLT_PDU_FILTER_FUNC );
typedef RPC_STATUS (RPC_ENTRY *RPC_BLOCKING_FN)( void *, void *, void * );

/* RPC dispatch table */
typedef struct {
    unsigned int            DispatchTableCount;
    RPC_DISPATCH_FUNCTION   *DispatchTable;
    LONG_PTR                Reserved;
} RPC_DISPATCH_TABLE;
typedef RPC_DISPATCH_TABLE  *PRPC_DISPATCH_TABLE;

/* RPC protocol sequence endpoint */
typedef struct _RPC_PROTSEQ_ENDPOINT {
    unsigned char   *RpcProtocolSequence;
    unsigned char   *Endpoint;
} RPC_PROTSEQ_ENDPOINT;
typedef RPC_PROTSEQ_ENDPOINT    *PRPC_PROTSEQ_ENDPOINT;

/* RPC server interface */
typedef struct _RPC_SERVER_INTERFACE {
    unsigned int            Length;
    RPC_SYNTAX_IDENTIFIER   InterfaceId;
    RPC_SYNTAX_IDENTIFIER   TransferSyntax;
    PRPC_DISPATCH_TABLE     DispatchTable;
    unsigned int            RpcProtseqEndpointCount;
    PRPC_PROTSEQ_ENDPOINT   RpcProtseqEndpoint;
    RPC_MGR_EPV             *DefaultManagerEpv;
    void const              *InterpreterInfo;
    unsigned int            Flags;
} RPC_SERVER_INTERFACE;
typedef RPC_SERVER_INTERFACE    *PRPC_SERVER_INTERFACE;

/* RPC client interface */
typedef struct _RPC_CLIENT_INTERFACE {
    unsigned int            Length;
    RPC_SYNTAX_IDENTIFIER   InterfaceId;
    RPC_SYNTAX_IDENTIFIER   TransferSyntax;
    PRPC_DISPATCH_TABLE     DispatchTable;
    unsigned int            RpcProtseqEndpointCount;
    PRPC_PROTSEQ_ENDPOINT   RpcProtseqEndpoint;
    ULONG_PTR               Reserved;
    void const              *InterpreterInfo;
    unsigned int            Flags;
} RPC_CLIENT_INTERFACE;
typedef RPC_CLIENT_INTERFACE    *PRPC_CLIENT_INTERFACE;

/* RPC transfer syntax */
typedef struct _RPC_TRANSFER_SYNTAX {
    UUID            Uuid;
    unsigned short  VersMajor;
    unsigned short  VersMinor;
} RPC_TRANSFER_SYNTAX;

/* RPC cookie authentication descriptor */
#if (NTDDI_VERSION >= 0x05020000)
typedef struct _RPC_C_OPT_COOKIE_AUTH_DESCRIPTOR {
    unsigned long   BufferSize;
    char            *Buffer;
} RPC_C_OPT_COOKIE_AUTH_DESCRIPTOR;
#endif

/* RDR callout state */
#if (NTDDI_VERSION >= 0x05020000)
typedef struct _RDR_CALLOUT_STATE {
    RPC_STATUS                      LastError;
    void                            *LastEEInfo;
    RPC_HTTP_REDIRECTOR_STAGE       LastCalledStage;
    unsigned short                  *ServerName;
    unsigned short                  *ServerPort;
    unsigned short                  *RemoteUser;
    unsigned short                  *AuthType;
    unsigned char                   ResourceTypePresent;
    unsigned char                   SessionIdPresent;
    unsigned char                   InterfacePresent;
    UUID                            ResourceType;
    UUID                            SessionId;
    RPC_SYNTAX_IDENTIFIER           Interface;
    void                            *CertContext;
} RDR_CALLOUT_STATE;
#endif

/* RPC proxy performance counters */
#if (NTDDI_VERSION >= 0x06000000)
typedef enum RpcProxyPerfCounters {
    RpcCurrentUniqueUser            = 1,
    RpcBackEndConnectionAttempts    = 2,
    RpcBackEndConnectionFailed      = 3,
    RpcRequestsPerSecond            = 4,
    RpcIncomingConnections          = 5,
    RpcIncomingBandwidth            = 6,
    RpcAttemptedLbsDecisions        = 7,
    RpcFailedLbsDecisions           = 8,
    RpcAttemptedLbsMessages         = 9,
    RpcFailedLbsMessages            = 10,
    RpcLastCounter                  = 11
} RpcPerfCounters;
#endif

/* RPC proxy callback functions */
#if (NTDDI_VERSION >= 0x05010000)
typedef RPC_STATUS  (RPC_ENTRY *I_RpcProxyIsValidMachineFn)( RPC_WSTR, RPC_WSTR, unsigned long );
typedef RPC_STATUS  (RPC_ENTRY *I_RpcProxyGetClientAddressFn)( void *, char *, unsigned long );
typedef RPC_STATUS  (RPC_ENTRY *I_RpcProxyGetConnectionTimeoutFn)( unsigned long * );
#endif
#if (NTDDI_VERSION >= 0x05020000)
typedef RPC_STATUS  (RPC_ENTRY *I_RpcPerformCalloutFn)( void *, RDR_CALLOUT_STATE *, RPC_HTTP_REDIRECTOR_STAGE );
typedef RPC_STATUS  (RPC_ENTRY *I_RpcFreeCalloutStateFn)( RDR_CALLOUT_STATE * );
typedef RPC_STATUS  (RPC_ENTRY *I_RpcProxyGetClientSessionAndResourceUUID)( void *, int *, UUID *, int *, UUID * );
#endif
#if (NTDDI_VERSION >= 0x06000000)
typedef RPC_STATUS  (RPC_ENTRY *I_RpcProxyFilterIfFn)( void *, UUID *, unsigned short, int * );
typedef void        (RPC_ENTRY *I_RpcProxyUpdatePerfCounterFn)( RpcPerfCounters, int, unsigned long );
typedef void        (RPC_ENTRY *I_RpcProxyUpdatePerfCounterBackendServerFn)( unsigned short *, int );
#endif

/* RPC proxy callback interface */
#if (NTDDI_VERSION >= 0x05010000)
typedef struct tagI_RpcProxyCallbackInterface {
    I_RpcProxyIsValidMachineFn                  IsValidMachineFn;
    I_RpcProxyGetClientAddressFn                GetClientAddressFn;
    I_RpcProxyGetConnectionTimeoutFn            GetConnectionTimeoutFn;
#if (NTDDI_VERSION >= 0x05020000)
    I_RpcPerformCalloutFn                       PerformCalloutFn;
    I_RpcFreeCalloutStateFn                     FreeCalloutStateFn;
    I_RpcProxyGetClientSessionAndResourceUUID   GetClientSessionAndResourceUUID;
#endif
#if (NTDDI_VERSION >= 0x06000000)
    I_RpcProxyFilterIfFn                        ProxyFilterIfFn;
    I_RpcProxyUpdatePerfCounterFn               RpcProxyUpdatePerfCounterFn;
    I_RpcProxyUpdatePerfCounterBackendServerFn  RpcProxyUpdatePerfCounterBackendServerFn;
#endif
} I_RpcProxyCallbackInterface;
#endif

/* Functions in RPCRT4.DLL */
RPCRTAPI void * RPC_ENTRY       I_RpcAllocate( unsigned int );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingCopy( RPC_BINDING_HANDLE, RPC_BINDING_HANDLE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingCreateNP( RPC_WSTR, RPC_WSTR, RPC_WSTR, RPC_BINDING_HANDLE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqConnId( RPC_BINDING_HANDLE, void **, int * );  
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqDynamicEndpointA( RPC_BINDING_HANDLE, RPC_CSTR * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqDynamicEndpointW( RPC_BINDING_HANDLE, RPC_WSTR * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqSecurityContext( RPC_BINDING_HANDLE, void ** );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqTransportType( RPC_BINDING_HANDLE, unsigned int * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqWireIdForSnego( RPC_BINDING_HANDLE, RPC_CSTR );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingIsClientLocal( RPC_BINDING_HANDLE, unsigned int * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingSetAsync( RPC_BINDING_HANDLE, RPC_BLOCKING_FN, unsigned long );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingToStaticStringBindingW( RPC_BINDING_HANDLE, unsigned short ** );
RPCRTAPI void RPC_ENTRY         I_RpcClearMutex( I_RPC_MUTEX );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcConnectionInqSockBuffSize( unsigned long *, unsigned long * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcConnectionSetSockBuffSize( unsigned long, unsigned long );
RPCRTAPI void RPC_ENTRY         I_RpcDeleteMutex( I_RPC_MUTEX );
RPCRTAPI void RPC_ENTRY         I_RpcFree( void * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcFreeBuffer( RPC_MESSAGE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcFreePipeBuffer( RPC_MESSAGE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcGetAssociationContext( RPC_BINDING_HANDLE, void ** );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcGetBuffer( RPC_MESSAGE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcGetBufferWithObject( RPC_MESSAGE *, UUID * );
RPCRTAPI RPC_BINDING_HANDLE RPC_ENTRY   I_RpcGetCurrentCallHandle( void );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcGetExtendedError( void );
RPCRTAPI void * RPC_ENTRY       I_RpcGetServerContextList( RPC_BINDING_HANDLE );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcIfInqTransferSyntaxes( RPC_IF_HANDLE, RPC_TRANSFER_SYNTAX *, unsigned int, unsigned int * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcMapWin32Status( RPC_STATUS );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcMonitorAssociation( RPC_BINDING_HANDLE, PRPC_RUNDOWN, void * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcNsBindingSetEntryNameA( RPC_BINDING_HANDLE, unsigned long, RPC_CSTR );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcNsBindingSetEntryNameW( RPC_BINDING_HANDLE, unsigned long, RPC_WSTR );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcNsInterfaceExported( unsigned long, unsigned short *, RPC_SERVER_INTERFACE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcNsInterfaceUnexported( unsigned long, unsigned short *, RPC_SERVER_INTERFACE * );
RPCRTAPI void RPC_ENTRY         I_RpcPauseExecution( unsigned long );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcReallocPipeBuffer( PRPC_MESSAGE, unsigned int );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcReceive( PRPC_MESSAGE, unsigned int );
RPCRTAPI void RPC_ENTRY         I_RpcRequestMutex( I_RPC_MUTEX * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcSend( PRPC_MESSAGE );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcSendReceive( RPC_MESSAGE * );
RPCRTAPI RPC_ADDRESS_CHANGE_FN * RPC_ENTRY  I_RpcServerInqAddressChangeFn( void );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerInqTransportType( unsigned int * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerRegisterForwardFunction( RPC_FORWARD_FUNCTION * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerSetAddressChangeFn( RPC_ADDRESS_CHANGE_FN * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerStartListening( void * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerStartService( RPC_WSTR, RPC_WSTR, RPC_IF_HANDLE );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerStopListening( void );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerUseProtseq2A( RPC_CSTR, RPC_CSTR, unsigned int, void *, void * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerUseProtseq2W( RPC_WSTR, RPC_WSTR, unsigned int, void *, void * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerUseProtseqEp2A( RPC_CSTR, RPC_CSTR, unsigned int, RPC_CSTR, void *, void * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerUseProtseqEp2W( RPC_WSTR, RPC_WSTR, unsigned int, RPC_WSTR, void *, void * );
RPCRTAPI void RPC_ENTRY         I_RpcSetServerContextList( RPC_BINDING_HANDLE, void * );
RPCRTAPI void RPC_ENTRY         I_RpcSsDontSerializeContext( void );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcStopMonitorAssociation( RPC_BINDING_HANDLE );
RPCRTAPI unsigned int RPC_ENTRY I_RpcWindowProc( void *, unsigned int, unsigned int, unsigned long );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_UuidCreate( UUID * );
#if (NTDDI_VERSION >= 0x05010000)
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingHandleToAsyncHandle( RPC_BINDING_HANDLE, void ** );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqLocalClientPID( RPC_BINDING_HANDLE, unsigned long * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcNegotiateTransferSyntax( RPC_MESSAGE * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerCheckClientRestriction( RPC_BINDING_HANDLE );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerInqLocalConnAddress( RPC_BINDING_HANDLE, void *, unsigned long *, unsigned long * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcServerInqRemoteConnAddress( RPC_BINDING_HANDLE, void *, unsigned long *, unsigned long * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcSessionStrictContextHandle( void );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcTurnOnEEInfoPropagation( void );
#endif
#if (NTDDI_VERSION >= 0x05020000)
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqMarshalledTargetInfo( RPC_BINDING_HANDLE, unsigned long *, RPC_CSTR * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcRecordCalloutFailure( RPC_STATUS, RDR_CALLOUT_STATE *, unsigned short * );
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcReplyToClientWithStatus( void *, RPC_STATUS );
#endif
#if (NTDDI_VERSION >= 0x06000000)
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcBindingInqSecurityContextKeyInfo( RPC_BINDING_HANDLE, void * );
#endif
#if (NTDDI_VERSION >= 0x06010000)
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcMgmtEnableDedicatedThreadPool();
#endif

/* Functions in RPCRT4.DLL that are defined differently on different versions
 * of Windows.
 */
#if (NTDDI_VERSION >= 0x05020000)
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcProxyNewConnection( unsigned long, unsigned short *, unsigned short *, unsigned short *, void *, RDR_CALLOUT_STATE *, I_RpcProxyCallbackInterface * );
#elif (NTDDI_VERSION >= 0x05010000)
RPCRTAPI RPC_STATUS RPC_ENTRY   I_RpcProxyNewConnection( unsigned long, unsigned short *, unsigned short *, void *, I_RpcProxyCallbackInterface * );
#endif

/* Map generic function names to the appropriate ANSI or Unicode version. */
#ifdef UNICODE
    #define I_RpcBindingInqDynamicEndpoint  I_RpcBindingInqDynamicEndpointW
    #define I_RpcNsBindingSetEntryName      I_RpcNsBindingSetEntryNameW
    #define I_RpcServerUnregisterEndpoint   I_RpcServerUnregisterEndpointW
    #define I_RpcServerUseProtseq2          I_RpcServerUseProtseq2W
    #define I_RpcServerUseProtseqEp2        I_RpcServerUseProtseqEp2W
#else
    #define I_RpcBindingInqDynamicEndpoint  I_RpcBindingInqDynamicEndpointA
    #define I_RpcNsBindingSetEntryName      I_RpcNsBindingSetEntryNameA
    #define I_RpcServerUnregisterEndpoint   I_RpcServerUnregisterEndpointA
    #define I_RpcServerUseProtseq2          I_RpcServerUseProtseq2A
    #define I_RpcServerUseProtseqEp2        I_RpcServerUseProtseqEp2A
#endif

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __RPCDCEP_H__ */
