PageRenderTime 27ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/include/rpcproxy.h

https://github.com/wesgarner/wine
C Header | 373 lines | 296 code | 49 blank | 28 comment | 4 complexity | 7a4418975bb5010b239c85230e875474 MD5 | raw file
  1. /*
  2. * Copyright (C) 2001 Ove Kaaven
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with this library; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  17. */
  18. #ifndef __RPCPROXY_H_VERSION__
  19. /* FIXME: Find an appropriate version number. I guess something is better than nothing */
  20. #define __RPCPROXY_H_VERSION__ ( 399 )
  21. #endif
  22. #ifndef __WINE_RPCPROXY_H
  23. #define __WINE_RPCPROXY_H
  24. #define __midl_proxy
  25. #include <basetsd.h>
  26. #ifndef GUID_DEFINED
  27. #include <guiddef.h>
  28. #endif
  29. #include <rpc.h>
  30. #include <rpcndr.h>
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. typedef struct tagCInterfaceStubVtbl *PCInterfaceStubVtblList;
  35. typedef struct tagCInterfaceProxyVtbl *PCInterfaceProxyVtblList;
  36. typedef const char *PCInterfaceName;
  37. typedef int __stdcall IIDLookupRtn( const IID *pIID, int *pIndex );
  38. typedef IIDLookupRtn *PIIDLookup;
  39. typedef struct tagProxyFileInfo
  40. {
  41. const PCInterfaceProxyVtblList *pProxyVtblList;
  42. const PCInterfaceStubVtblList *pStubVtblList;
  43. const PCInterfaceName *pNamesArray;
  44. const IID **pDelegatedIIDs;
  45. const PIIDLookup pIIDLookupRtn;
  46. unsigned short TableSize;
  47. unsigned short TableVersion;
  48. const IID **pAsyncIIDLookup;
  49. LONG_PTR Filler2;
  50. LONG_PTR Filler3;
  51. LONG_PTR Filler4;
  52. } ProxyFileInfo;
  53. typedef ProxyFileInfo ExtendedProxyFileInfo;
  54. typedef struct tagCInterfaceProxyHeader
  55. {
  56. #ifdef USE_STUBLESS_PROXY
  57. const void *pStublessProxyInfo;
  58. #endif
  59. const IID *piid;
  60. } CInterfaceProxyHeader;
  61. #define CINTERFACE_PROXY_VTABLE(n) \
  62. struct \
  63. { \
  64. CInterfaceProxyHeader header; \
  65. void *Vtbl[n]; \
  66. }
  67. typedef struct tagCInterfaceProxyVtbl
  68. {
  69. CInterfaceProxyHeader header;
  70. #if defined(__GNUC__)
  71. void *Vtbl[0];
  72. #else
  73. void *Vtbl[1];
  74. #endif
  75. } CInterfaceProxyVtbl;
  76. typedef void (__RPC_STUB *PRPC_STUB_FUNCTION)(
  77. IRpcStubBuffer *This,
  78. IRpcChannelBuffer *_pRpcChannelBuffer,
  79. PRPC_MESSAGE _pRpcMessage,
  80. DWORD *pdwStubPhase);
  81. typedef struct tagCInterfaceStubHeader
  82. {
  83. const IID *piid;
  84. const MIDL_SERVER_INFO *pServerInfo;
  85. ULONG DispatchTableCount;
  86. const PRPC_STUB_FUNCTION *pDispatchTable;
  87. } CInterfaceStubHeader;
  88. typedef struct tagCInterfaceStubVtbl
  89. {
  90. CInterfaceStubHeader header;
  91. IRpcStubBufferVtbl Vtbl;
  92. } CInterfaceStubVtbl;
  93. typedef struct tagCStdStubBuffer
  94. {
  95. const IRpcStubBufferVtbl *lpVtbl;
  96. LONG RefCount;
  97. struct IUnknown *pvServerObject;
  98. const struct ICallFactoryVtbl *pCallFactoryVtbl;
  99. const IID *pAsyncIID;
  100. struct IPSFactoryBuffer *pPSFactory;
  101. } CStdStubBuffer;
  102. typedef struct tagCStdPSFactoryBuffer
  103. {
  104. const IPSFactoryBufferVtbl *lpVtbl;
  105. LONG RefCount;
  106. const ProxyFileInfo **pProxyFileList;
  107. LONG Filler1;
  108. } CStdPSFactoryBuffer;
  109. #define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction
  110. ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) DECLSPEC_HIDDEN;
  111. ULONG STDMETHODCALLTYPE NdrCStdStubBuffer2_Release(IRpcStubBuffer *This, IPSFactoryBuffer *pPSF);
  112. #define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0
  113. HRESULT WINAPI
  114. CStdStubBuffer_QueryInterface( IRpcStubBuffer *This, REFIID riid, void **ppvObject );
  115. ULONG WINAPI
  116. CStdStubBuffer_AddRef( IRpcStubBuffer *This );
  117. ULONG WINAPI
  118. CStdStubBuffer_Release( IRpcStubBuffer *This ) DECLSPEC_HIDDEN;
  119. ULONG WINAPI
  120. NdrCStdStubBuffer_Release( IRpcStubBuffer *This, IPSFactoryBuffer *pPSF );
  121. HRESULT WINAPI
  122. CStdStubBuffer_Connect( IRpcStubBuffer *This, IUnknown *pUnkServer );
  123. void WINAPI
  124. CStdStubBuffer_Disconnect( IRpcStubBuffer *This );
  125. HRESULT WINAPI
  126. CStdStubBuffer_Invoke( IRpcStubBuffer *This, RPCOLEMESSAGE *pRpcMsg, IRpcChannelBuffer *pRpcChannelBuffer );
  127. IRpcStubBuffer * WINAPI
  128. CStdStubBuffer_IsIIDSupported( IRpcStubBuffer *This, REFIID riid );
  129. ULONG WINAPI
  130. CStdStubBuffer_CountRefs( IRpcStubBuffer *This );
  131. HRESULT WINAPI
  132. CStdStubBuffer_DebugServerQueryInterface( IRpcStubBuffer *This, void **ppv );
  133. void WINAPI
  134. CStdStubBuffer_DebugServerRelease( IRpcStubBuffer *This, void *pv );
  135. #define CStdStubBuffer_METHODS \
  136. CStdStubBuffer_QueryInterface, \
  137. CStdStubBuffer_AddRef, \
  138. CStdStubBuffer_Release, \
  139. CStdStubBuffer_Connect, \
  140. CStdStubBuffer_Disconnect, \
  141. CStdStubBuffer_Invoke, \
  142. CStdStubBuffer_IsIIDSupported, \
  143. CStdStubBuffer_CountRefs, \
  144. CStdStubBuffer_DebugServerQueryInterface, \
  145. CStdStubBuffer_DebugServerRelease
  146. RPCRTAPI void RPC_ENTRY
  147. NdrProxyInitialize( void *This, PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg,
  148. PMIDL_STUB_DESC pStubDescriptor, unsigned int ProcNum );
  149. RPCRTAPI void RPC_ENTRY
  150. NdrProxyGetBuffer( void *This, PMIDL_STUB_MESSAGE pStubMsg );
  151. RPCRTAPI void RPC_ENTRY
  152. NdrProxySendReceive( void *This, PMIDL_STUB_MESSAGE pStubMsg );
  153. RPCRTAPI void RPC_ENTRY
  154. NdrProxyFreeBuffer( void *This, PMIDL_STUB_MESSAGE pStubMsg );
  155. RPCRTAPI HRESULT RPC_ENTRY
  156. NdrProxyErrorHandler( DWORD dwExceptionCode );
  157. RPCRTAPI void RPC_ENTRY
  158. NdrStubInitialize( PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg,
  159. PMIDL_STUB_DESC pStubDescriptor, IRpcChannelBuffer *pRpcChannelBuffer );
  160. RPCRTAPI void RPC_ENTRY
  161. NdrStubInitializePartial( PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg,
  162. PMIDL_STUB_DESC pStubDescriptor, IRpcChannelBuffer *pRpcChannelBuffer,
  163. ULONG RequestedBufferSize );
  164. void __RPC_STUB NdrStubForwardingFunction( IRpcStubBuffer *This, IRpcChannelBuffer *pChannel,
  165. PRPC_MESSAGE pMsg, DWORD *pdwStubPhase );
  166. RPCRTAPI void RPC_ENTRY
  167. NdrStubGetBuffer( IRpcStubBuffer *This, IRpcChannelBuffer *pRpcChannelBuffer, PMIDL_STUB_MESSAGE pStubMsg );
  168. RPCRTAPI HRESULT RPC_ENTRY
  169. NdrStubErrorHandler( DWORD dwExceptionCode );
  170. RPCRTAPI HRESULT RPC_ENTRY
  171. NdrDllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv, const ProxyFileInfo **pProxyFileList,
  172. const CLSID *pclsid, CStdPSFactoryBuffer *pPSFactoryBuffer );
  173. RPCRTAPI HRESULT RPC_ENTRY
  174. NdrDllCanUnloadNow( CStdPSFactoryBuffer *pPSFactoryBuffer );
  175. RPCRTAPI HRESULT RPC_ENTRY
  176. NdrDllRegisterProxy( HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid );
  177. RPCRTAPI HRESULT RPC_ENTRY
  178. NdrDllUnregisterProxy( HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid );
  179. #define CSTDSTUBBUFFERRELEASE(pFactory) \
  180. ULONG WINAPI CStdStubBuffer_Release(IRpcStubBuffer *This) \
  181. { return NdrCStdStubBuffer_Release(This, (IPSFactoryBuffer *)pFactory); }
  182. #ifdef PROXY_DELEGATION
  183. #define CSTDSTUBBUFFER2RELEASE(pFactory) \
  184. ULONG WINAPI CStdStubBuffer2_Release(IRpcStubBuffer *This) \
  185. { return NdrCStdStubBuffer2_Release(This, (IPSFactoryBuffer *)pFactory); }
  186. #else
  187. #define CSTDSTUBBUFFER2RELEASE(pFactory)
  188. #endif
  189. #define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp(pIID, name##_ProxyVtblList[index]->header.piid, sizeof(IID))
  190. /*
  191. * In these macros, BS stands for Binary Search. MIDL uses these to
  192. * "unroll" a binary search into the module's IID_Lookup function.
  193. * However, I haven't bothered to reimplement that stuff yet;
  194. * I've just implemented a linear search for now.
  195. */
  196. #define IID_BS_LOOKUP_SETUP \
  197. int c;
  198. #define IID_BS_LOOKUP_INITIAL_TEST(name, sz, split)
  199. #define IID_BS_LOOKUP_NEXT_TEST(name, split)
  200. #define IID_BS_LOOKUP_RETURN_RESULT(name, sz, index) \
  201. for (c=0; c<sz; c++) if (!name##_CHECK_IID(c)) { (index)=c; return 1; } \
  202. return 0;
  203. /* macros used in dlldata.c files */
  204. #define EXTERN_PROXY_FILE(proxy) \
  205. EXTERN_C const ProxyFileInfo proxy##_ProxyFileInfo DECLSPEC_HIDDEN;
  206. #define PROXYFILE_LIST_START \
  207. const ProxyFileInfo * aProxyFileList[] DECLSPEC_HIDDEN = \
  208. {
  209. #define REFERENCE_PROXY_FILE(proxy) \
  210. & proxy##_ProxyFileInfo
  211. #define PROXYFILE_LIST_END \
  212. NULL \
  213. };
  214. /* define PROXY_CLSID to use an existing CLSID */
  215. /* define PROXY_CLSID_IS to specify the CLSID data of the PSFactoryBuffer */
  216. /* define neither to use the GUID of the first interface */
  217. #ifdef PROXY_CLSID
  218. # define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID DECLSPEC_HIDDEN;
  219. #else
  220. # ifdef PROXY_CLSID_IS
  221. # define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer DECLSPEC_HIDDEN; \
  222. const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
  223. # define PROXY_CLSID CLSID_PSFactoryBuffer
  224. # else
  225. # define CLSID_PSFACTORYBUFFER
  226. # endif
  227. #endif
  228. #ifndef PROXY_CLSID
  229. # define GET_DLL_CLSID (aProxyFileList[0]->pStubVtblList[0] ? \
  230. aProxyFileList[0]->pStubVtblList[0]->header.piid : NULL)
  231. #else
  232. # define GET_DLL_CLSID &PROXY_CLSID
  233. #endif
  234. #ifdef ENTRY_PREFIX
  235. # define __rpc_macro_expand2(a, b) a##b
  236. # define __rpc_macro_expand(a, b) __rpc_macro_expand2(a, b)
  237. # define DLLREGISTERSERVER_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllRegisterServer)
  238. # define DLLUNREGISTERSERVER_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllUnregisterServer)
  239. # define DLLMAIN_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllMain)
  240. # define DLLGETCLASSOBJECT_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllGetClassObject)
  241. # define DLLCANUNLOADNOW_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllCanUnloadNow)
  242. #else
  243. # define DLLREGISTERSERVER_ENTRY DllRegisterServer
  244. # define DLLUNREGISTERSERVER_ENTRY DllUnregisterServer
  245. # define DLLMAIN_ENTRY DllMain
  246. # define DLLGETCLASSOBJECT_ENTRY DllGetClassObject
  247. # define DLLCANUNLOADNOW_ENTRY DllCanUnloadNow
  248. #endif
  249. #define DLLDATA_GETPROXYDLLINFO(pfl, rclsid) \
  250. void RPC_ENTRY GetProxyDllInfo(const ProxyFileInfo ***ppProxyFileInfo, \
  251. const CLSID **ppClsid) DECLSPEC_HIDDEN; \
  252. void RPC_ENTRY GetProxyDllInfo(const ProxyFileInfo ***ppProxyFileInfo, \
  253. const CLSID **ppClsid) \
  254. { \
  255. *ppProxyFileInfo = (pfl); \
  256. *ppClsid = (rclsid); \
  257. }
  258. #define DLLGETCLASSOBJECTROUTINE(pfl, factory_clsid, factory) \
  259. HRESULT WINAPI DLLGETCLASSOBJECT_ENTRY(REFCLSID rclsid, REFIID riid, void **ppv) DECLSPEC_HIDDEN; \
  260. HRESULT WINAPI DLLGETCLASSOBJECT_ENTRY(REFCLSID rclsid, REFIID riid, \
  261. void **ppv) \
  262. { \
  263. return NdrDllGetClassObject(rclsid, riid, ppv, (pfl), \
  264. (factory_clsid), factory); \
  265. }
  266. #define DLLCANUNLOADNOW(factory) \
  267. HRESULT WINAPI DLLCANUNLOADNOW_ENTRY(void) DECLSPEC_HIDDEN; \
  268. HRESULT WINAPI DLLCANUNLOADNOW_ENTRY(void) \
  269. { \
  270. return NdrDllCanUnloadNow((factory)); \
  271. }
  272. #define REGISTER_PROXY_DLL_ROUTINES(pfl, factory_clsid) \
  273. HINSTANCE hProxyDll DECLSPEC_HIDDEN = NULL; \
  274. \
  275. BOOL WINAPI DLLMAIN_ENTRY(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DECLSPEC_HIDDEN; \
  276. BOOL WINAPI DLLMAIN_ENTRY(HINSTANCE hinstDLL, DWORD fdwReason, \
  277. LPVOID lpvReserved) \
  278. { \
  279. if (fdwReason == DLL_PROCESS_ATTACH) \
  280. { \
  281. DisableThreadLibraryCalls(hinstDLL); \
  282. hProxyDll = hinstDLL; \
  283. } \
  284. return TRUE; \
  285. } \
  286. \
  287. HRESULT WINAPI DLLREGISTERSERVER_ENTRY(void) DECLSPEC_HIDDEN; \
  288. HRESULT WINAPI DLLREGISTERSERVER_ENTRY(void) \
  289. { \
  290. return NdrDllRegisterProxy(hProxyDll, (pfl), (factory_clsid)); \
  291. } \
  292. \
  293. HRESULT WINAPI DLLUNREGISTERSERVER_ENTRY(void) DECLSPEC_HIDDEN; \
  294. HRESULT WINAPI DLLUNREGISTERSERVER_ENTRY(void) \
  295. { \
  296. return NdrDllUnregisterProxy(hProxyDll, (pfl), (factory_clsid)); \
  297. }
  298. #ifdef REGISTER_PROXY_DLL
  299. # define DLLREGISTRY_ROUTINES(pfl, factory_clsid) \
  300. REGISTER_PROXY_DLL_ROUTINES(pfl, factory_clsid)
  301. #else
  302. # define DLLREGISTRY_ROUTINES(pfl, factory_clsid)
  303. #endif
  304. #define DLLDATA_ROUTINES(pfl, factory_clsid) \
  305. CLSID_PSFACTORYBUFFER \
  306. CStdPSFactoryBuffer DECLSPEC_HIDDEN gPFactory = { NULL, 0, NULL, 0 }; \
  307. DLLDATA_GETPROXYDLLINFO(pfl, factory_clsid) \
  308. DLLGETCLASSOBJECTROUTINE(pfl, factory_clsid, &gPFactory) \
  309. DLLCANUNLOADNOW(&gPFactory) \
  310. CSTDSTUBBUFFERRELEASE(&gPFactory) \
  311. CSTDSTUBBUFFER2RELEASE(&gPFactory) \
  312. DLLREGISTRY_ROUTINES(pfl, factory_clsid)
  313. #if 0
  314. RPCRTAPI HRESULT RPC_ENTRY
  315. CreateProxyFromTypeInfo( LPTYPEINFO pTypeInfo, LPUNKNOWN pUnkOuter, REFIID riid,
  316. LPRPCPROXYBUFFER *ppProxy, LPVOID *ppv );
  317. RPCRTAPI HRESULT RPC_ENTRY
  318. CreateStubFromTypeInfo( LPTYPEINFO pTypeInfo, REFIID riid, LPUNKNOWN pUnkServer,
  319. LPRPCSTUBBUFFER *ppStub );
  320. #endif
  321. #ifdef __cplusplus
  322. }
  323. #endif
  324. #endif /*__WINE_RPCPROXY_H */