diff --git a/include/Makefile.in b/include/Makefile.in index e671fab5a3..a3fde3208b 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -101,6 +101,7 @@ INSTALLED_INCLUDES = \ rpcdcep.h \ rpcndr.h \ rpcnterr.h \ + rpcproxy.h \ servprov.h \ setupapi.h \ shellapi.h \ diff --git a/include/rpcdce.h b/include/rpcdce.h index d809577378..acb9b51a2e 100644 --- a/include/rpcdce.h +++ b/include/rpcdce.h @@ -15,6 +15,27 @@ typedef RPC_BINDING_HANDLE handle_t; #define rpc_binding_handle_t RPC_BINDING_HANDLE #define RPC_MGR_EPV void +typedef struct _RPC_BINDING_VECTOR +{ + unsigned long Count; + RPC_BINDING_HANDLE BindingH[1]; +} RPC_BINDING_VECTOR; +#define rpc_binding_vector_t RPC_BINDING_VECTOR + +typedef struct _UUID_VECTOR +{ + unsigned long Count; + UUID *Uuid[1]; +} UUID_VECTOR; +#define uuid_vector_t UUID_VECTOR + +typedef struct _RPC_IF_ID +{ + UUID Uuid; + unsigned short VersMajor; + unsigned short VersMinor; +} RPC_IF_ID; + #define RPC_C_BINDING_INFINITE_TIMEOUT 10 #define RPC_C_BINDING_MIN_TIMEOUT 0 #define RPC_C_BINDING_DEFAULT_TIMEOUT 5 @@ -42,7 +63,7 @@ typedef RPC_BINDING_HANDLE handle_t; typedef RPC_STATUS RPC_ENTRY RPC_IF_CALLBACK_FN( RPC_IF_HANDLE InterfaceUuid, LPVOID Context ); -typedef void (__RPC_USER * RPC_AUTH_KEY_RETRIEVAL_FN)( LPVOID Arg, LPWSTR ServerPrincName, +typedef void __RPC_USER (* RPC_AUTH_KEY_RETRIEVAL_FN)( LPVOID Arg, LPWSTR ServerPrincName, ULONG KeyVer, LPVOID* Key, RPC_STATUS* status ); typedef struct _RPC_POLICY @@ -53,6 +74,33 @@ typedef struct _RPC_POLICY } RPC_POLICY, *PRPC_POLICY; +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingCopy( RPC_BINDING_HANDLE SourceBinding, RPC_BINDING_HANDLE* DestinationBinding ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingFree( RPC_BINDING_HANDLE Binding ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingFromStringBindingA( LPSTR StringBinding, RPC_BINDING_HANDLE* Binding ); +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingFromStringBindingW( LPWSTR StringBinding, RPC_BINDING_HANDLE* Binding ); +#define RpcBindingFromStringBinding WINELIB_NAME_AW(RpcBindingFromStringBinding) + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingToStringBindingA( RPC_BINDING_HANDLE Binding, LPSTR* StringBinding ); +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingToStringBindingW( RPC_BINDING_HANDLE Binding, LPWSTR* StringBinding ); +#define RpcBindingFromStringBinding WINELIB_NAME_AW(RpcBindingFromStringBinding) + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingVectorFree( RPC_BINDING_VECTOR** BindingVector ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcServerInqBindings( RPC_BINDING_VECTOR** BindingVector ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait ); + RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerRegisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv ); @@ -68,6 +116,7 @@ RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpA( LPSTR Protseq, UINT MaxCalls, LPSTR Endpoint, LPVOID SecurityDescriptor ); RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpW( LPWSTR Protseq, UINT MaxCalls, LPWSTR Endpoint, LPVOID SecurityDescriptor ); +#define RpcServerUseProtseqEp WINELIB_NAME_AW(RpcServerUseProtseqEp) RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpExA( LPSTR Protseq, UINT MaxCalls, LPSTR Endpoint, LPVOID SecurityDescriptor, @@ -75,8 +124,6 @@ RPCRTAPI RPC_STATUS RPC_ENTRY RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerUseProtseqEpExW( LPWSTR Protseq, UINT MaxCalls, LPWSTR Endpoint, LPVOID SecurityDescriptor, PRPC_POLICY Policy ); - -#define RpcServerUseProtseqEp WINELIB_NAME_AW(RpcServerUseProtseqEp) #define RpcServerUseProtseqEpEx WINELIB_NAME_AW(RpcServerUseProtseqEpEx) RPCRTAPI RPC_STATUS RPC_ENTRY @@ -85,7 +132,6 @@ RPCRTAPI RPC_STATUS RPC_ENTRY RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerRegisterAuthInfoW( LPWSTR ServerPrincName, ULONG AuthnSvc, RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn, LPVOID Arg ); - #define RpcServerRegisterAuthInfo WINELIB_NAME_AW(RpcServerRegisterAuthInfo) RPCRTAPI RPC_STATUS RPC_ENTRY @@ -97,18 +143,25 @@ RPCRTAPI RPC_STATUS RPC_ENTRY RPCRTAPI RPC_STATUS RPC_ENTRY RpcStringBindingComposeW( LPWSTR ObjUuid, LPWSTR Protseq, LPWSTR NetworkAddr, LPWSTR Endpoint, LPWSTR Options, LPWSTR* StringBinding ); - #define RpcStringBindingCompose WINELIB_NAME_AW(RpcStringBindingCompose) RPCRTAPI RPC_STATUS RPC_ENTRY - RpcBindingFromStringBindingA( LPSTR StringBinding, RPC_BINDING_HANDLE* Binding ); + RpcStringFreeA(unsigned char** String); RPCRTAPI RPC_STATUS RPC_ENTRY - RpcBindingFromStringBindingW( LPWSTR StringBinding, RPC_BINDING_HANDLE* Binding ); + RpcStringFreeW(unsigned short** String); +#define RpcStringFree WINELIB_NAME_AW(RpcStringFree) -#define RpcBindingFromStringBinding WINELIB_NAME_AW(RpcBindingFromStringBinding) +RPCRTAPI RPC_STATUS RPC_ENTRY + UuidCreate( UUID* Uuid ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + UuidToStringA( UUID* Uuid, unsigned char** StringUuid ); +RPCRTAPI RPC_STATUS RPC_ENTRY + UuidToStringW( UUID* Uuid, unsigned short** StringUuid ); +#define UuidToString WINELIB_NAME_AW(UuidToString) RPCRTAPI unsigned short RPC_ENTRY - UuidHash(UUID *, RPC_STATUS*); + UuidHash(UUID* Uuid, RPC_STATUS* Status_ ); #include "rpcdcep.h" diff --git a/include/rpcndr.h b/include/rpcndr.h index a33de66874..0117367aba 100644 --- a/include/rpcndr.h +++ b/include/rpcndr.h @@ -7,8 +7,236 @@ #endif // __RPCNDR_H_VERSION__ typedef unsigned char byte; +typedef __int64 hyper; +typedef __uint64 MIDL_uhyper; +/* 'boolean' tend to conflict, let's call it _wine_boolean */ +typedef unsigned char _wine_boolean; +/* typedef _wine_boolean boolean; */ + +typedef struct +{ + void *pad[2]; + void *userContext; +} *NDR_SCONTEXT; + +#define NDRSContextValue(hContext) (&(hContext)->userContext) +#define cbNDRContext 20 + +typedef void __RPC_USER (*NDR_RUNDOWN)(void *context); +typedef void __RPC_USER (*NDR_NOTIFY_ROUTINE)(void); +typedef void __RPC_USER (*NDR_NOTIFY2_ROUTINE)(_wine_boolean flag); #define DECLSPEC_UUID(x) #define MIDL_INTERFACE(x) struct +struct _MIDL_STUB_MESSAGE; +struct _MIDL_STUB_DESC; +struct _FULL_PTR_XLAT_TABLES; + +typedef void __RPC_USER (*EXPR_EVAL)(struct _MIDL_STUB_MESSAGE *); +typedef const unsigned char *PFORMAT_STRING; + +typedef struct +{ + long Dimension; + unsigned long *BufferConformanceMark; + unsigned long *BufferVarianceMark; + unsigned long *MaxCountArray; + unsigned long *OffsetArray; + unsigned long *ActualCountArray; +} ARRAY_INFO, *PARRAY_INFO; + +typedef struct _NDR_PIPE_DESC *PNDR_PIPE_DESC; +typedef struct _NDR_PIPE_MESSAGE *PNDR_PIPE_MESSAGE; +typedef struct _NDR_ASYNC_MESSAGE *PNDR_ASYNC_MESSAGE; +typedef struct _NDR_CORRELATION_INFO *PNDR_CORRELATION_INFO; + +typedef struct _MIDL_STUB_MESSAGE +{ + PRPC_MESSAGE RpcMsg; + unsigned char *Buffer; + unsigned char *BufferStart; + unsigned char *BufferEnd; + unsigned char *BufferMark; + unsigned long BufferLength; + unsigned long MemorySize; + unsigned char *Memory; + int IsClient; + int ReuseBuffer; + unsigned char *AllocAllNodesMemory; + unsigned char *AllocAllNodesMemoryEnd; + int IgnoreEmbeddedPointers; + unsigned char *PointerBufferMark; + unsigned char fBufferValid; + unsigned char uFlags; + ULONG_PTR MaxCount; + unsigned long Offset; + unsigned long ActualCount; + void * __RPC_API (*pfnAllocate)(size_t); + void __RPC_API (*pfnFree)(void *); + unsigned char *StackTop; + unsigned char *pPresentedType; + unsigned char *pTransmitType; + handle_t SavedHandle; + const struct _MIDL_STUB_DESC *StubDesc; + struct _FULL_PTR_XLAT_TABLES *FullPtrXlatTables; + unsigned long FullPtrRefId; + unsigned long ulUnused1; + int fInDontFree:1; + int fDontCallFreeInst:1; + int fInOnlyParam:1; + int fHasReturn:1; + int fHasExtensions:1; + int fHasNewCorrDesc:1; + int fUnused:10; + unsigned long dwDestContext; + void *pvDestContext; + NDR_SCONTEXT *SavedContextHandles; + long ParamNumber; + struct IRpcChannelBuffer *pRpcChannelBuffer; + PARRAY_INFO pArrayInfo; + unsigned long *SizePtrCountArray; + unsigned long *SizePtrOffsetArray; + unsigned long *SizePtrLengthArray; + void *pArgQueue; + unsigned long dwStubPhase; + PNDR_PIPE_DESC pPipeDesc; + PNDR_ASYNC_MESSAGE pAsyncMsg; + PNDR_CORRELATION_INFO pCorrInfo; + unsigned char *pCorrMemory; + void *pMemoryList; + ULONG_PTR w2kReserved[5]; +} MIDL_STUB_MESSAGE, *PMIDL_STUB_MESSAGE; + +typedef struct _GENERIC_BINDING_ROUTINE_PAIR GENERIC_BINDING_ROUTINE_PAIR, *PGENERIC_BINDING_ROUTINE_PAIR; + +typedef struct __GENERIC_BINDING_INFO GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO; + +typedef struct _XMIT_ROUTINE_QUINTUPLE XMIT_ROUTINE_QUINTUPLE, *PXMIT_ROUTINE_QUINTUPLE; + +typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE USER_MARSHAL_ROUTINE_QUADRUPLE; + +typedef struct _MALLOC_FREE_STRUCT MALLOC_FREE_STRUCT; + +typedef struct _COMM_FAULT_OFFSETS COMM_FAULT_OFFSETS; + +typedef struct _MIDL_STUB_DESC +{ + void *RpcInterfaceInformation; + void * __RPC_API (*pfnAllocate)(size_t); + void __RPC_API (*pfnFree)(void *); + union { + handle_t *pAutoHandle; + handle_t *pPrimitiveHandle; + PGENERIC_BINDING_INFO pGenericBindingInfo; + } IMPLICIT_HANDLE_INFO; + const NDR_RUNDOWN *apfnNdrRundownRoutines; + const GENERIC_BINDING_ROUTINE_PAIR *aGenericBindingRoutinePairs; + const EXPR_EVAL *apfnExprEval; + const XMIT_ROUTINE_QUINTUPLE *aXmitQuintuple; + const unsigned char *pFormatTypes; + int fCheckBounds; + unsigned long Version; + MALLOC_FREE_STRUCT *pMallocFreeStruct; + long MIDLVersion; + const COMM_FAULT_OFFSETS *CommFaultOffsets; + const USER_MARSHAL_ROUTINE_QUADRUPLE *aUserMarshalQuadruple; + const NDR_NOTIFY_ROUTINE *NotifyRoutineTable; + ULONG_PTR mFlags; + ULONG_PTR Reserved3; + ULONG_PTR Reserved4; + ULONG_PTR Reserved5; +} MIDL_STUB_DESC; +typedef const MIDL_STUB_DESC *PMIDL_STUB_DESC; + +typedef struct _MIDL_FORMAT_STRING +{ + short Pad; +#if defined(__GNUC__) + unsigned char Format[0]; +#else + unsigned char Format[1]; +#endif +} MIDL_FORMAT_STRING; + +typedef void __RPC_API (*STUB_THUNK)( PMIDL_STUB_MESSAGE ); + +typedef long __RPC_API (*SERVER_ROUTINE)(); + +typedef struct _MIDL_SERVER_INFO_ +{ + PMIDL_STUB_DESC pStubDesc; + const SERVER_ROUTINE *DispatchTable; + PFORMAT_STRING ProcString; + const unsigned short *FmtStringOffset; + const STUB_THUNK *ThunkTable; + PFORMAT_STRING LocalFormatTypes; + PFORMAT_STRING LocalProcString; + const unsigned short *LocalFmtStringOffset; +} MIDL_SERVER_INFO, *PMIDL_SERVER_INFO; + +typedef enum { + STUB_UNMARSHAL, + STUB_CALL_SERVER, + STUB_MARSHAL, + STUB_CALL_SERVER_NO_HRESULT +} STUB_PHASE; + +typedef enum { + PROXY_CALCSIZE, + PROXY_GETBUFFER, + PROXY_MARSHAL, + PROXY_SENDRECEIVE, + PROXY_UNMARSHAL +} PROXY_PHASE; + +struct IRpcStubBuffer; + +RPCRTAPI void RPC_ENTRY + NdrSimpleTypeMarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, unsigned char FormatChar ); +RPCRTAPI void RPC_ENTRY + NdrSimpleTypeUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, unsigned char FormatChar ); + +/* while MS declares each prototype separately, I prefer to use macros for this kind of thing instead */ +#define TYPE_MARSHAL(type) \ +RPCRTAPI unsigned char* RPC_ENTRY \ + Ndr##type##Marshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat ); \ +RPCRTAPI unsigned char* RPC_ENTRY \ + Ndr##type##Unmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char** ppMemory, PFORMAT_STRING pFormat, unsigned char fMustAlloc ); \ +RPCRTAPI void RPC_ENTRY \ + Ndr##type##BufferSize( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat ); \ +RPCRTAPI unsigned long RPC_ENTRY \ + Ndr##type##MemorySize( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat ); \ +RPCRTAPI void RPC_ENTRY \ + Ndr##type##Free( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat ); + +TYPE_MARSHAL(Pointer) +TYPE_MARSHAL(SimpleStruct) +TYPE_MARSHAL(ConformantStruct) +TYPE_MARSHAL(ConformantVaryingStruct) +TYPE_MARSHAL(ComplexStruct) +TYPE_MARSHAL(FixedArray) +TYPE_MARSHAL(ConformantArray) +TYPE_MARSHAL(ConformantVaryingArray) +TYPE_MARSHAL(VaryingArray) +TYPE_MARSHAL(ComplexArray) +TYPE_MARSHAL(EncapsulatedUnion) +TYPE_MARSHAL(NonEncapsulatedUnion) +TYPE_MARSHAL(ByteCountPointer) +TYPE_MARSHAL(XmitOrRepAs) +TYPE_MARSHAL(UserMarshal) +TYPE_MARSHAL(InterfacePointer) + +#undef TYPE_MARSHAL + +RPCRTAPI void RPC_ENTRY + NdrConvert2( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, long NumberParams ); +RPCRTAPI void RPC_ENTRY + NdrConvert( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat ); + +RPCRTAPI void* RPC_ENTRY + NdrOleAllocate( size_t Size ); +RPCRTAPI void RPC_ENTRY + NdrOleFree( void* NodeToFree ); + #endif /*__WINE_RPCNDR_H */ diff --git a/include/rpcproxy.h b/include/rpcproxy.h new file mode 100644 index 0000000000..947dbe6c58 --- /dev/null +++ b/include/rpcproxy.h @@ -0,0 +1,159 @@ +#ifndef __WINE_RPCPROXY_H +#define __WINE_RPCPROXY_H + +#include "basetsd.h" +#include "guiddef.h" + +typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList; +typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList; +typedef const char *PCInterfaceName; +typedef int __stdcall IIDLookupRtn( const IID *pIID, int *pIndex ); +typedef IIDLookupRtn *PIIDLookup; + +typedef struct tagProxyFileInfo +{ + const PCInterfaceProxyVtblList *pProxyVtblList; + const PCInterfaceStubVtblList *pStubVtblList; + const PCInterfaceName *pNamesArray; + const IID **pDelegatedIIDs; + const PIIDLookup pIIDLookupRtn; + unsigned short TableSize; + unsigned short TableVersion; + const IID **pAsyncIIDLookup; + LONG_PTR Filler2; + LONG_PTR Filler3; + LONG_PTR Filler4; +} ProxyFileInfo; + +typedef ProxyFileInfo ExtendedProxyFileInfo; + +#include "rpc.h" +#include "rpcndr.h" + +typedef struct tagCInterfaceProxyHeader +{ +#ifdef USE_STUBLESS_PROXY + const void *pStublessProxyInfo; +#endif + const IID *piid; +} CInterfaceProxyHeader; + +#define CINTERFACE_PROXY_VTABLE(n) \ + struct \ + { \ + CInterfaceProxyHeader header; \ + void *Vtbl[n]; \ + } + +typedef struct tagCInterfaceProxyVtbl +{ + CInterfaceProxyHeader header; +#if defined(__GNUC__) + void *Vtbl[0]; +#else + void *Vtbl[1]; +#endif +} CInterfaceProxyVtbl; + +typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *pdwStubPhase); + +typedef struct tagCInterfaceStubHeader +{ + const IID *piid; + const MIDL_SERVER_INFO *pServerInfo; + unsigned long DispatchTableCount; + const PRPC_STUB_FUNCTION *pDispatchTable; +} CInterfaceStubHeader; + +typedef struct tagCInterfaceStubVtbl +{ + CInterfaceStubHeader header; + ICOM_VTABLE(IRpcStubBuffer) Vtbl; +} CInterfaceStubVtbl; + +typedef struct tagCStdStubBuffer +{ + const ICOM_VTABLE(IRpcStubBuffer) *lpVtbl; + long RefCount; + struct IUnknown *pvServerObject; + const struct ICallFactoryVtbl *pCallFactoryVtbl; + const IID *pAsyncIID; + struct IPSFactoryBuffer *pPSFactory; +} CStdStubBuffer; + +typedef struct tagCStdPSFactoryBuffer +{ + const IPSFactoryBufferVtbl *lpVtbl; + long RefCount; + const ProxyFileInfo **pProxyFileList; + long Filler1; +} CStdPSFactoryBuffer; + +HRESULT WINAPI + CStdStubBuffer_QueryInterface( IRpcStubBuffer *This, REFIID riid, void **ppvObject ); +ULONG WINAPI + CStdStubBuffer_AddRef( IRpcStubBuffer *This ); +ULONG WINAPI + CStdStubBuffer_Release( IRpcStubBuffer *This ); +ULONG WINAPI + NdrCStdStubBuffer_Release( IRpcStubBuffer *This, IPSFactoryBuffer *pPSF ); +HRESULT WINAPI + CStdStubBuffer_Connect( IRpcStubBuffer *This, IUnknown *pUnkServer ); +void WINAPI + CStdStubBuffer_Disconnect( IRpcStubBuffer *This ); +HRESULT WINAPI + CStdStubBuffer_Invoke( IRpcStubBuffer *This, RPCOLEMESSAGE *pRpcMsg, IRpcChannelBuffer *pRpcChannelBuffer ); +IRpcStubBuffer * WINAPI + CStdStubBuffer_IsIIDSupported( IRpcStubBuffer *This, REFIID riid ); +ULONG WINAPI + CStdStubBuffer_CountRefs( IRpcStubBuffer *This ); +HRESULT WINAPI + CStdStubBuffer_DebugServerQueryInterface( IRpcStubBuffer *This, void **ppv ); +void WINAPI + CStdStubBuffer_DebugServerRelease( IRpcStubBuffer *This, void *pv ); + +#define CStdStubBuffer_METHODS \ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE \ + CStdStubBuffer_QueryInterface, \ + CStdStubBuffer_AddRef, \ + CStdStubBuffer_Release, \ + CStdStubBuffer_Connect, \ + CStdStubBuffer_Disconnect, \ + CStdStubBuffer_Invoke, \ + CStdStubBuffer_IsIIDSupported, \ + CStdStubBuffer_CountRefs, \ + CStdStubBuffer_DebugServerQueryInterface, \ + CStdStubBuffer_DebugServerRelease + +RPCRTAPI HRESULT RPC_ENTRY + NdrDllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv, const ProxyFileInfo **pProxyFileList, + const CLSID *pclsid, CStdPSFactoryBuffer *pPSFactoryBuffer ); +RPCRTAPI HRESULT RPC_ENTRY + NdrDllCanUnloadNow( CStdPSFactoryBuffer *pPSFactoryBuffer ); + +RPCRTAPI HRESULT RPC_ENTRY + NdrDllRegisterProxy( HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid ); +RPCRTAPI HRESULT RPC_ENTRY + NdrDllUnregisterProxy( HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid ); + +#define CSTDSTUBBUFFERRELEASE(pFactory) \ +ULONG WINAPI CStdStubBuffer_Release(IRpcStubBuffer *This) \ + { return NdrCStdStubBuffer_Release(This, (IPSFactoryBuffer *)pFactory); } + +#if defined(__WINE__) && defined(__WINE_WINE_OBJ_OLEAUT_H) +/* see http://msdn.microsoft.com/library/en-us/dnmsj99/html/com0199.asp?frame=true */ + +RPCRTAPI HRESULT RPC_ENTRY + CreateProxyFromTypeInfo( LPTYPEINFO pTypeInfo, LPUNKNOWN pUnkOuter, REFIID riid, + LPRPCPROXYBUFFER *ppProxy, LPVOID *ppv ); +RPCRTAPI HRESULT RPC_ENTRY + CreateStubFromTypeInfo( LPTYPEINFO pTypeInfo, REFIID riid, LPUNKNOWN pUnkServer, + LPRPCSTUBBUFFER *ppStub ); + +#endif + +#endif /*__WINE_RPCDCE_H */