- NDK 0.98, now with versionned headers. Too many changes to list, see the TinyKRNL...
[reactos.git] / reactos / include / rpcproxy.h
1 /*
2 -DREGISTER_PROXY_DLL Generates DllMain, DllRegisterServer, and DllUnregisterServer
3 -DPROXY_CLSID=clsid Specifies a class ID to be used by the proxy DLL.
4 -DPROXY_CLSID_IS={..} Specifies the class ID to be used by the proxy DLL.
5 -DNT35_STRICT No new features
6 */
7 #ifndef _RPCPROXY_H
8 #define _RPCPROXY_H
9 #if __GNUC__ >=3
10 #pragma GCC system_header
11 #endif
12
13 #if defined __cplusplus && !defined CINTERFACE
14 #warning "rpcproxy type definitions require CINTERFACE"
15 #else
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 #include <rpc.h>
20 #include <rpcndr.h>
21 #include <string.h>
22
23 #ifndef __RPCPROXY_H_VERSION__
24 #define __RPCPROXY_H_VERSION__ 475
25 #endif
26
27 #define CStdStubBuffer_METHODS CStdStubBuffer_QueryInterface,CStdStubBuffer_AddRef,\
28 CStdStubBuffer_Release,CStdStubBuffer_Connect,CStdStubBuffer_Disconnect,CStdStubBuffer_Invoke,\
29 CStdStubBuffer_IsIIDSupported,CStdStubBuffer_CountRefs,CStdStubBuffer_DebugServerQueryInterface,\
30 CStdStubBuffer_DebugServerRelease
31 #define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID,name##_ProxyVtblList[index]->header.piid,16)
32 #define IID_BS_LOOKUP_SETUP int result, low=-1;
33 #define IID_BS_LOOKUP_INITIAL_TEST(name,sz,split) if ((result = name##_CHECK_IID(split))>0) { low=sz-split;} else if (!result) { low = split; goto found_label; }
34 #define IID_BS_LOOKUP_NEXT_TEST(name,split) if ((result = name##_CHECK_IID(low+split))>=0) { low=low+split; if (!result) goto found_label; }
35 #define IID_BS_LOOKUP_RETURN_RESULT(name,sz,index) low+=1; if ((low>=sz )||(result=name##_CHECK_IID(low))) goto not_found_label; found_label: (index)=low; return 1; not_found_label: return 0;
36 #define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \
37 HINSTANCE hProxyDll = 0; \
38 BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) \
39 { \
40 if(fdwReason == DLL_PROCESS_ATTACH) hProxyDll = hinstDLL; \
41 return TRUE; \
42 } \
43 HRESULT STDAPICALLTYPE DllRegisterServer(void) \
44 {\
45 return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \
46 }\
47 HRESULT STDAPICALLTYPE DllUnregisterServer(void)\
48 {\
49 return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID);\
50 }
51 #ifdef PROXY_CLSID
52 #define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;
53 #else
54 #ifdef PROXY_CLSID_IS
55 #define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
56 #define PROXY_CLSID CLSID_PSFactoryBuffer
57 #else
58 #define CLSID_PSFACTORYBUFFER
59 #endif
60 #endif
61 #ifndef PROXY_CLSID
62 #define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] != 0 ? aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
63 #else
64 #define GET_DLL_CLSID &PROXY_CLSID
65 #endif
66 #define EXTERN_PROXY_FILE(name) EXTERN_C const ProxyFileInfo name##_ProxyFileInfo;
67 #define PROXYFILE_LIST_START const ProxyFileInfo * aProxyFileList[] = {
68 #define REFERENCE_PROXY_FILE(name) & name##_ProxyFileInfo
69 #define PROXYFILE_LIST_END 0 };
70 #define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \
71 void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \
72 { *pInfo = pPFList; *pId = pClsid; };
73 #define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) HRESULT STDAPICALLTYPE DllGetClassObject(REFCLSID rclsid,REFIID riid,void **ppv) \
74 { return NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); }
75 #define DLLCANUNLOADNOW(pFactory) HRESULT STDAPICALLTYPE DllCanUnloadNow(void) \
76 { return NdrDllCanUnloadNow( pFactory ); }
77 #define DLLDUMMYPURECALL void __cdecl _purecall(void) { }
78 #define CSTDSTUBBUFFERRELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \
79 { return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); }
80 #ifdef PROXY_DELEGATION
81 #define CSTDSTUBBUFFER2RELEASE(pFactory) ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \
82 { return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); }
83 #else
84 #define CSTDSTUBBUFFER2RELEASE(pFactory)
85 #endif
86
87 #ifdef REGISTER_PROXY_DLL
88 #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID)
89 #else
90 #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID)
91 #endif
92 #define DLLDATA_ROUTINES(pProxyFileList,pClsID) \
93 CLSID_PSFACTORYBUFFER \
94 CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \
95 DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \
96 DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \
97 DLLCANUNLOADNOW(&gPFactory) \
98 CSTDSTUBBUFFERRELEASE(&gPFactory) \
99 CSTDSTUBBUFFER2RELEASE(&gPFactory) \
100 DLLDUMMYPURECALL \
101 DLLREGISTRY_ROUTINES(pProxyFileList, pClsID)
102
103 #define DLLDATA_STANDARD_ROUTINES DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer)
104
105 #define CINTERFACE_PROXY_VTABLE(n) \
106 struct \
107 { \
108 CInterfaceProxyHeader header; \
109 void *Vtbl[n]; \
110 }
111
112 struct tagCInterfaceStubVtbl;
113 struct tagCInterfaceProxyVtbl;
114 typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList;
115 typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList;
116 typedef const char *PCInterfaceName;
117 typedef int __stdcall IIDLookupRtn(const IID*,int*);
118 typedef IIDLookupRtn *PIIDLookup;
119 typedef struct tagProxyFileInfo {
120 const PCInterfaceProxyVtblList *pProxyVtblList;
121 const PCInterfaceStubVtblList *pStubVtblList;
122 const PCInterfaceName * pNamesArray;
123 const IID ** pDelegatedIIDs;
124 const PIIDLookup pIIDLookupRtn;
125 unsigned short TableSize;
126 unsigned short TableVersion;
127 unsigned long Filler1;
128 unsigned long Filler2;
129 unsigned long Filler3;
130 unsigned long Filler4;
131 }ProxyFileInfo;
132 typedef ProxyFileInfo ExtendedProxyFileInfo;
133
134 typedef struct tagCInterfaceProxyHeader {
135 #ifdef USE_STUBLESS_PROXY
136 const void *pStublessProxyInfo;
137 #endif
138 const IID *piid;
139 } CInterfaceProxyHeader;
140 typedef struct tagCInterfaceProxyVtbl {
141 CInterfaceProxyHeader header;
142 #if defined(__WATCOMC__)
143 void *Vtbl[1];
144 #else
145 #ifdef __GNUC__
146 __extension__
147 #endif
148 void *Vtbl[0];
149 #endif
150 } CInterfaceProxyVtbl;
151 typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
152 typedef struct tagCInterfaceStubHeader {
153 const IID *piid;
154 const MIDL_SERVER_INFO *pServerInfo;
155 unsigned long DispatchTableCount;
156 const PRPC_STUB_FUNCTION *pDispatchTable;
157 } CInterfaceStubHeader;
158 typedef struct tagCInterfaceStubVtbl {
159 CInterfaceStubHeader header;
160 IRpcStubBufferVtbl Vtbl;
161 } CInterfaceStubVtbl;
162 typedef struct tagCStdStubBuffer {
163 const struct IRpcStubBufferVtbl * lpVtbl;
164 long RefCount;
165 struct IUnknown *pvServerObject;
166 const struct ICallFactoryVtbl * pCallFactoryVtbl;
167 const IID * pAsyncIID;
168 struct IPSFactoryBuffer * pPSFactory;
169 const struct IReleaseMarshalBuffersVtbl * pRMBVtbl;
170 } CStdStubBuffer;
171 typedef struct tagCStdPSFactoryBuffer {
172 const IPSFactoryBufferVtbl *lpVtbl;
173 long RefCount;
174 const ProxyFileInfo ** pProxyFileList;
175 long Filler1;
176 } CStdPSFactoryBuffer;
177 void RPC_ENTRY NdrProxyInitialize(void*,PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,unsigned int);
178 void RPC_ENTRY NdrProxyGetBuffer(void*,PMIDL_STUB_MESSAGE);
179 void RPC_ENTRY NdrProxySendReceive(void*,MIDL_STUB_MESSAGE*);
180 void RPC_ENTRY NdrProxyFreeBuffer(void*,MIDL_STUB_MESSAGE*);
181 HRESULT RPC_ENTRY NdrProxyErrorHandler(DWORD);
182 void RPC_ENTRY NdrStubInitialize(PRPC_MESSAGE,PMIDL_STUB_MESSAGE,PMIDL_STUB_DESC,IRpcChannelBuffer*);
183 void __RPC_STUB NdrStubForwardingFunction(IRpcStubBuffer*,IRpcChannelBuffer*,PRPC_MESSAGE,DWORD*);
184 void RPC_ENTRY NdrStubGetBuffer(IRpcStubBuffer*,IRpcChannelBuffer*,PMIDL_STUB_MESSAGE);
185 HRESULT RPC_ENTRY NdrStubErrorHandler(DWORD);
186 HRESULT STDMETHODCALLTYPE CStdStubBuffer_QueryInterface(IRpcStubBuffer*,REFIID,void**);
187 ULONG STDMETHODCALLTYPE CStdStubBuffer_AddRef(IRpcStubBuffer*);
188 ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer*);
189 ULONG STDMETHODCALLTYPE NdrCStdStubBuffer_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
190 HRESULT STDMETHODCALLTYPE CStdStubBuffer_Connect(IRpcStubBuffer*,IUnknown*);
191 void STDMETHODCALLTYPE CStdStubBuffer_Disconnect(IRpcStubBuffer*);
192 HRESULT STDMETHODCALLTYPE CStdStubBuffer_Invoke(IRpcStubBuffer*,RPCOLEMESSAGE*,IRpcChannelBuffer*);
193 IRpcStubBuffer* STDMETHODCALLTYPE CStdStubBuffer_IsIIDSupported(IRpcStubBuffer*,REFIID);
194 ULONG STDMETHODCALLTYPE CStdStubBuffer_CountRefs(IRpcStubBuffer*);
195 HRESULT STDMETHODCALLTYPE CStdStubBuffer_DebugServerQueryInterface(IRpcStubBuffer*,void**);
196 void STDMETHODCALLTYPE CStdStubBuffer_DebugServerRelease(IRpcStubBuffer*,void*);
197 HRESULT RPC_ENTRY NdrDllGetClassObject(REFCLSID,REFIID,void**,const ProxyFileInfo**,const CLSID*,CStdPSFactoryBuffer*);
198 HRESULT RPC_ENTRY NdrDllCanUnloadNow(CStdPSFactoryBuffer*);
199 #ifndef NT35_STRICT
200 HRESULT RPC_ENTRY NdrDllRegisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
201 HRESULT RPC_ENTRY NdrDllUnregisterProxy(HMODULE,const ProxyFileInfo**,const CLSID*);
202 #define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction
203 ULONG STDMETHODCALLTYPE
204 CStdStubBuffer2_Release(IRpcStubBuffer*);
205 ULONG STDMETHODCALLTYPE
206 NdrCStdStubBuffer2_Release(IRpcStubBuffer*,IPSFactoryBuffer*);
207 #define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0
208 #endif
209
210 #ifdef __cplusplus
211 }
212 #endif
213 #endif /* defined __cplusplus && !defined CINTERFACE */
214 #endif /* ndef _RPCPROXY_H */
215