#ifndef _RPCDCEP_H
#define _RPCDCEP_H
#ifdef __cplusplus
extern "C" {
#endif
#define RPC_NCA_FLAGS_DEFAULT 0
#define RPC_NCA_FLAGS_IDEMPOTENT 1
#define RPC_NCA_FLAGS_BROADCAST 2
#define RPC_NCA_FLAGS_MAYBE 4
#define RPCFLG_ASYNCHRONOUS 0x40000000
#define RPCFLG_INPUT_SYNCHRONOUS 0x20000000
#define RPC_FLAGS_VALID_BIT 0x8000
#define TRANSPORT_TYPE_CN 1
#define TRANSPORT_TYPE_DG 2
#define TRANSPORT_TYPE_LPC 4
#define TRANSPORT_TYPE_WMSG 8

typedef struct _RPC_VERSION {
	unsigned short MajorVersion;
	unsigned short MinorVersion;
} RPC_VERSION;
typedef struct _RPC_SYNTAX_IDENTIFIER {
	GUID SyntaxGUID;
	RPC_VERSION SyntaxVersion;
} RPC_SYNTAX_IDENTIFIER, *PRPC_SYNTAX_IDENTIFIER;
typedef struct _RPC_MESSAGE {
	HANDLE Handle;
	unsigned long DataRepresentation;
	void *Buffer;
	unsigned int BufferLength;
	unsigned int ProcNum;
	PRPC_SYNTAX_IDENTIFIER TransferSyntax;
	void *RpcInterfaceInformation;
	void *ReservedForRuntime;
	void *ManagerEpv;
	void *ImportContext;
	unsigned long RpcFlags;
} RPC_MESSAGE,*PRPC_MESSAGE;
typedef long __stdcall RPC_FORWARD_FUNCTION(GUID*,RPC_VERSION*,GUID*,unsigned char*,void**);
typedef void(__stdcall *RPC_DISPATCH_FUNCTION) ( PRPC_MESSAGE Message);
typedef struct {
	unsigned int DispatchTableCount;
	RPC_DISPATCH_FUNCTION *DispatchTable;
	int Reserved;
} RPC_DISPATCH_TABLE,*PRPC_DISPATCH_TABLE;
typedef struct _RPC_PROTSEQ_ENDPOINT {
	unsigned char *RpcProtocolSequence;
	unsigned char *Endpoint;
} RPC_PROTSEQ_ENDPOINT,*PRPC_PROTSEQ_ENDPOINT;
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;
	void *DefaultManagerEpv;
	void const *InterpreterInfo;
} RPC_SERVER_INTERFACE,*PRPC_SERVER_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;
	unsigned long Reserved;
	void const *InterpreterInfo;
} RPC_CLIENT_INTERFACE,*PRPC_CLIENT_INTERFACE;
typedef void *I_RPC_MUTEX;
typedef struct _RPC_TRANSFER_SYNTAX {
	GUID Uuid;
	unsigned short VersMajor;
	unsigned short VersMinor;
} RPC_TRANSFER_SYNTAX;
typedef long(__stdcall *RPC_BLOCKING_FUNCTION)(void*,void*);

long __stdcall I_RpcGetBuffer(RPC_MESSAGE*);
long __stdcall I_RpcSendReceive(RPC_MESSAGE*);
long __stdcall I_RpcFreeBuffer(RPC_MESSAGE*);
void __stdcall I_RpcRequestMutex(I_RPC_MUTEX*);
void __stdcall I_RpcClearMutex(I_RPC_MUTEX);
void __stdcall I_RpcDeleteMutex(I_RPC_MUTEX);
void* __stdcall I_RpcAllocate(unsigned int);
void __stdcall I_RpcFree(void*);
void __stdcall I_RpcPauseExecution(unsigned long);
typedef void(__stdcall *PRPC_RUNDOWN) (void*);
long __stdcall I_RpcMonitorAssociation(HANDLE,PRPC_RUNDOWN,void*);
long __stdcall I_RpcStopMonitorAssociation(HANDLE);
HANDLE __stdcall I_RpcGetCurrentCallHandle(void);
long __stdcall I_RpcGetAssociationContext(void**);
long __stdcall I_RpcSetAssociationContext(void*);
#ifdef __RPC_NT__
long __stdcall I_RpcNsBindingSetEntryName(HANDLE,unsigned long,unsigned short*);
long __stdcall I_RpcBindingInqDynamicEndpoint(HANDLE, unsigned short**);
#else
long __stdcall I_RpcNsBindingSetEntryName(HANDLE,unsigned long,unsigned char*);
long __stdcall I_RpcBindingInqDynamicEndpoint(HANDLE,unsigned char**);
#endif
long __stdcall I_RpcBindingInqTransportType(HANDLE,unsigned int*);
long __stdcall I_RpcIfInqTransferSyntaxes(HANDLE,RPC_TRANSFER_SYNTAX*,unsigned int,unsigned int*);
long __stdcall I_UuidCreate(GUID*);
long __stdcall I_RpcBindingCopy(HANDLE,HANDLE*);
long __stdcall I_RpcBindingIsClientLocal(HANDLE,unsigned int*);
void __stdcall I_RpcSsDontSerializeContext(void);
long __stdcall I_RpcServerRegisterForwardFunction(RPC_FORWARD_FUNCTION*);
long __stdcall I_RpcConnectionInqSockBuffSize(unsigned long*,unsigned long*);
long __stdcall I_RpcConnectionSetSockBuffSize(unsigned long,unsigned long);
long __stdcall I_RpcBindingSetAsync(HANDLE,RPC_BLOCKING_FUNCTION);
long __stdcall I_RpcAsyncSendReceive(RPC_MESSAGE*,void*);
long __stdcall I_RpcGetThreadWindowHandle(void**);
long __stdcall I_RpcServerThreadPauseListening();
long __stdcall I_RpcServerThreadContinueListening();
long __stdcall I_RpcServerUnregisterEndpointA(unsigned char*,unsigned char*);
long __stdcall I_RpcServerUnregisterEndpointW(unsigned short*,unsigned short*);
#ifdef UNICODE
#define I_RpcServerUnregisterEndpoint I_RpcServerUnregisterEndpointW
#else
#define I_RpcServerUnregisterEndpoint I_RpcServerUnregisterEndpointA
#endif
#ifdef __cplusplus
}
#endif
#endif
