123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637 |
- /*++
- Copyright (c) Microsoft Corporation. All rights reserved.
- Module Name:
- rpcproxy.h
- Abstract:
- Definitions for rpc proxy stubs.
- Compiler switches:
- -DREGISTER_PROXY_DLL
- Generates DllMain, DllRegisterServer, and DllUnregisterServer functions
- for automatically registering a proxy DLL.
- -DPROXY_CLSID=clsid
- Specifies a class ID to be used by the proxy DLL.
- -DPROXY_CLSID_IS={0x6f11fe5c,0x2fc5,0x101b,{0x9e,0x45,0x00,0x00,0x0b,0x65,0xc7,0xef}}
- Specifies the value of the class ID to be used by the proxy DLL.
- -DENTRY_PREFIX=<prefix>
- String to be prepended on all the DllGetClassObject etc routines
- in dlldata.c. This includes: DllGetClassObject, DllCanUnloadNow
- and DllMain, DllRegisterServer, and DllUnregisterServer.
- -DNT35_STRICT
- Specifies that the target platform is Windows NT 3.5. This switch disables
- the new functions added after the Windows NT 3.5 release.
- --*/
- // This version of the rpcndr.h file corresponds to MIDL version 5.0.+
- // used with NT5 beta1+ env from build #1700 on.
- #ifndef __RPCPROXY_H_VERSION__
- #define __RPCPROXY_H_VERSION__ ( 475 )
- #endif // __RPCPROXY_H_VERSION__
- #ifndef __RPCPROXY_H__
- #define __RPCPROXY_H__
- #if _MSC_VER > 1000
- #pragma once
- #endif
- #define __midl_proxy
- #ifdef __REQUIRED_RPCPROXY_H_VERSION__
- #if ( __RPCPROXY_H_VERSION__ < __REQUIRED_RPCPROXY_H_VERSION__ )
- #error incorrect <rpcproxy.h> version. Use the header that matches with the MIDL compiler.
- #endif
- #endif
- // If this is the first file included __RPC_WIN64__ is not defined yet.
- #if defined(_M_IA64) || defined(_M_AMD64)
- #include <pshpack8.h>
- #endif
- #include <basetsd.h>
- #ifndef INC_OLE2
- #define INC_OLE2
- #endif
- #if defined(WIN32) || defined(__RPC_WIN64__)
- //We need to define REFIID, REFCLSID, REFGUID, & REFFMTID here so that the
- //proxy code won't get the const GUID *const definition.
- #ifndef GUID_DEFINED
- #include <guiddef.h>
- #endif /* GUID_DEFINED */
- #if defined(__cplusplus)
- extern "C"
- {
- #endif
- // forward declarations
- struct tagCInterfaceStubVtbl;
- struct tagCInterfaceProxyVtbl;
- typedef struct tagCInterfaceStubVtbl * PCInterfaceStubVtblList;
- typedef struct tagCInterfaceProxyVtbl * PCInterfaceProxyVtblList;
- typedef const char * PCInterfaceName;
- typedef int __stdcall IIDLookupRtn( const IID * pIID, int * pIndex );
- typedef IIDLookupRtn * PIIDLookup;
- // pointers to arrays of CInterfaceProxyVtbl's and CInterfaceStubVtbls
- 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;
- // extended info with list of interface names
- typedef ProxyFileInfo ExtendedProxyFileInfo;
- #include <rpc.h>
- #include <rpcndr.h>
- #include <string.h>
- #include <memory.h>
- typedef struct tagCInterfaceProxyHeader
- {
- //
- // New fields should be added here, at the beginning of the structure.
- //
- #ifdef USE_STUBLESS_PROXY
- const void * pStublessProxyInfo;
- #endif
- const IID * piid;
- } CInterfaceProxyHeader;
- // Macro used for ANSI compatible stubs.
- #define CINTERFACE_PROXY_VTABLE( n ) \
- struct \
- { \
- CInterfaceProxyHeader header; \
- void *Vtbl[ n ]; \
- }
- #if _MSC_VER >= 1200
- #pragma warning(push)
- #endif
- #pragma warning( disable:4200 )
- typedef struct tagCInterfaceProxyVtbl
- {
- CInterfaceProxyHeader header;
- #if defined( _MSC_VER )
- void *Vtbl[];
- #else
- void *Vtbl[1];
- #endif
- } CInterfaceProxyVtbl;
- #if _MSC_VER >= 1200
- #pragma warning(pop)
- #else
- #pragma warning( default:4200 )
- #endif
- typedef
- void
- (__RPC_STUB * PRPC_STUB_FUNCTION) (
- IRpcStubBuffer * This,
- IRpcChannelBuffer * _pRpcChannelBuffer,
- PRPC_MESSAGE _pRpcMessage,
- DWORD *pdwStubPhase);
- typedef struct tagCInterfaceStubHeader
- {
- //New fields should be added here, at the beginning of the structure.
- const IID * piid;
- const MIDL_SERVER_INFO * pServerInfo;
- unsigned long DispatchTableCount;
- const PRPC_STUB_FUNCTION * pDispatchTable;
- } CInterfaceStubHeader;
- typedef struct tagCInterfaceStubVtbl
- {
- CInterfaceStubHeader header;
- IRpcStubBufferVtbl Vtbl;
- } CInterfaceStubVtbl;
- typedef struct tagCStdStubBuffer
- {
- const struct IRpcStubBufferVtbl * lpVtbl; //Points to Vtbl field in CInterfaceStubVtbl.
- long RefCount;
- struct IUnknown * pvServerObject;
- const struct ICallFactoryVtbl * pCallFactoryVtbl;
- const IID * pAsyncIID;
- struct IPSFactoryBuffer * pPSFactory;
- const struct IReleaseMarshalBuffersVtbl * pRMBVtbl;
- } CStdStubBuffer;
- typedef struct tagCStdPSFactoryBuffer
- {
- const IPSFactoryBufferVtbl * lpVtbl;
- long RefCount;
- const ProxyFileInfo ** pProxyFileList;
- long Filler1; //Reserved for future use.
- } CStdPSFactoryBuffer;
- RPCRTAPI
- void
- RPC_ENTRY
- NdrProxyInitialize(
- void * This,
- PRPC_MESSAGE pRpcMsg,
- PMIDL_STUB_MESSAGE pStubMsg,
- PMIDL_STUB_DESC pStubDescriptor,
- unsigned int ProcNum );
- RPCRTAPI
- void
- RPC_ENTRY
- NdrProxyGetBuffer(
- void * This,
- PMIDL_STUB_MESSAGE pStubMsg);
- RPCRTAPI
- void
- RPC_ENTRY
- NdrProxySendReceive(
- void *This,
- MIDL_STUB_MESSAGE *pStubMsg);
- RPCRTAPI
- void
- RPC_ENTRY
- NdrProxyFreeBuffer(
- void *This,
- MIDL_STUB_MESSAGE *pStubMsg);
- RPCRTAPI
- HRESULT
- RPC_ENTRY
- NdrProxyErrorHandler(
- DWORD dwExceptionCode);
- RPCRTAPI
- void
- RPC_ENTRY
- NdrStubInitialize(
- PRPC_MESSAGE pRpcMsg,
- PMIDL_STUB_MESSAGE pStubMsg,
- PMIDL_STUB_DESC pStubDescriptor,
- IRpcChannelBuffer * pRpcChannelBuffer);
- RPCRTAPI
- void
- RPC_ENTRY
- NdrStubInitializePartial(
- PRPC_MESSAGE pRpcMsg,
- PMIDL_STUB_MESSAGE pStubMsg,
- PMIDL_STUB_DESC pStubDescriptor,
- IRpcChannelBuffer * pRpcChannelBuffer,
- unsigned long RequestedBufferSize);
- void __RPC_STUB NdrStubForwardingFunction(
- IN IRpcStubBuffer * This,
- IN IRpcChannelBuffer * pChannel,
- IN PRPC_MESSAGE pmsg,
- OUT DWORD * pdwStubPhase);
- RPCRTAPI
- void
- RPC_ENTRY
- NdrStubGetBuffer(
- IRpcStubBuffer * This,
- IRpcChannelBuffer * pRpcChannelBuffer,
- PMIDL_STUB_MESSAGE pStubMsg);
- RPCRTAPI
- HRESULT
- RPC_ENTRY
- NdrStubErrorHandler(
- DWORD dwExceptionCode);
- HRESULT STDMETHODCALLTYPE
- CStdStubBuffer_QueryInterface(
- IRpcStubBuffer * This,
- REFIID riid,
- void ** ppvObject);
- ULONG STDMETHODCALLTYPE
- CStdStubBuffer_AddRef(
- IRpcStubBuffer * This);
- ULONG STDMETHODCALLTYPE
- CStdStubBuffer_Release(
- IRpcStubBuffer * This);
- ULONG STDMETHODCALLTYPE
- NdrCStdStubBuffer_Release(
- IRpcStubBuffer * This,
- IPSFactoryBuffer * pPSF);
- HRESULT STDMETHODCALLTYPE
- CStdStubBuffer_Connect(
- IRpcStubBuffer * This,
- IUnknown * pUnkServer);
- void STDMETHODCALLTYPE
- CStdStubBuffer_Disconnect(
- IRpcStubBuffer * This);
- HRESULT STDMETHODCALLTYPE
- CStdStubBuffer_Invoke(
- IRpcStubBuffer * This,
- RPCOLEMESSAGE * pRpcMsg,
- IRpcChannelBuffer * pRpcChannelBuffer);
- IRpcStubBuffer * STDMETHODCALLTYPE
- CStdStubBuffer_IsIIDSupported(
- IRpcStubBuffer * This,
- REFIID riid);
- ULONG STDMETHODCALLTYPE
- CStdStubBuffer_CountRefs(
- IRpcStubBuffer * This);
- HRESULT STDMETHODCALLTYPE
- CStdStubBuffer_DebugServerQueryInterface(
- IRpcStubBuffer * This,
- void **ppv);
- void STDMETHODCALLTYPE
- CStdStubBuffer_DebugServerRelease(
- IRpcStubBuffer * This,
- void *pv);
- #define CStdStubBuffer_METHODS \
- CStdStubBuffer_QueryInterface,\
- CStdStubBuffer_AddRef, \
- CStdStubBuffer_Release, \
- CStdStubBuffer_Connect, \
- CStdStubBuffer_Disconnect, \
- CStdStubBuffer_Invoke, \
- CStdStubBuffer_IsIIDSupported, \
- CStdStubBuffer_CountRefs, \
- CStdStubBuffer_DebugServerQueryInterface, \
- CStdStubBuffer_DebugServerRelease
- #define CStdAsyncStubBuffer_METHODS 0,0,0,0,0,0,0,0,0,0
- #define CStdAsyncStubBuffer_DELEGATING_METHODS 0,0,0,0,0,0,0,0,0,0
- //+-------------------------------------------------------------------------
- //
- // Macro definitions for the proxy file
- //
- //--------------------------------------------------------------------------
- #define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp( pIID, name##_ProxyVtblList[ index ]->header.piid, 16 )
- #define IID_BS_LOOKUP_SETUP int result, low=-1;
- #define IID_BS_LOOKUP_INITIAL_TEST(name, sz, split) \
- result = name##_CHECK_IID( split ); \
- if ( result > 0 ) \
- { low = sz - split; } \
- else if ( !result ) \
- { low = split; goto found_label; }
- #define IID_BS_LOOKUP_NEXT_TEST(name, split ) \
- result = name##_CHECK_IID( low + split ); \
- if ( result >= 0 ) \
- { low = low + split; if ( !result ) goto found_label; }
- #define IID_BS_LOOKUP_RETURN_RESULT(name, sz, index ) \
- low = low + 1; \
- if (low >= sz) \
- goto not_found_label; \
- result = name##_CHECK_IID( low ); \
- if (result) \
- goto not_found_label; \
- found_label: (index) = low; return 1; \
- not_found_label: return 0;
- //+-------------------------------------------------------------------------
- //
- // Macro and routine definitions for the dlldata file
- //
- //--------------------------------------------------------------------------
- /****************************************************************************
- * Proxy Dll APIs
- ****************************************************************************/
- RPCRTAPI
- HRESULT
- RPC_ENTRY
- NdrDllGetClassObject (
- IN REFCLSID rclsid,
- IN REFIID riid,
- OUT void ** ppv,
- IN const ProxyFileInfo ** pProxyFileList,
- IN const CLSID * pclsid,
- IN CStdPSFactoryBuffer * pPSFactoryBuffer);
- RPCRTAPI
- HRESULT
- RPC_ENTRY
- NdrDllCanUnloadNow(
- IN CStdPSFactoryBuffer * pPSFactoryBuffer);
- // if the user specified a routine prefix, pick it up...
- // if not, add nothing
- #ifndef ENTRY_PREFIX
- #ifndef DllMain
- #define DISABLE_THREAD_LIBRARY_CALLS(x) DisableThreadLibraryCalls(x)
- #endif
- #define ENTRY_PREFIX
- #define DLLREGISTERSERVER_ENTRY DllRegisterServer
- #define DLLUNREGISTERSERVER_ENTRY DllUnregisterServer
- #define DLLMAIN_ENTRY DllMain
- #define DLLGETCLASSOBJECT_ENTRY DllGetClassObject
- #define DLLCANUNLOADNOW_ENTRY DllCanUnloadNow
- #else // ENTRY_PREFIX
- #define __rpc_macro_expand2(a, b) a##b
- #define __rpc_macro_expand(a, b) __rpc_macro_expand2(a,b)
- #define DLLREGISTERSERVER_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllRegisterServer)
- #define DLLUNREGISTERSERVER_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllUnregisterServer)
- #define DLLMAIN_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllMain)
- #define DLLGETCLASSOBJECT_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllGetClassObject)
- #define DLLCANUNLOADNOW_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllCanUnloadNow)
- #endif // ENTRY_PREFIX
- #ifndef DISABLE_THREAD_LIBRARY_CALLS
- #define DISABLE_THREAD_LIBRARY_CALLS(x)
- #endif
- /*************************************************************************
- The following new functions were added after the Windows NT 3.5 release.
- *************************************************************************/
- RPCRTAPI
- HRESULT
- RPC_ENTRY
- NdrDllRegisterProxy(
- IN HMODULE hDll,
- IN const ProxyFileInfo ** pProxyFileList,
- IN const CLSID * pclsid);
- RPCRTAPI
- HRESULT
- RPC_ENTRY
- NdrDllUnregisterProxy(
- IN HMODULE hDll,
- IN const ProxyFileInfo ** pProxyFileList,
- IN const CLSID * pclsid);
- #define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \
- \
- HINSTANCE hProxyDll = 0; \
- \
- /*DllMain saves the DLL module handle for later use by DllRegisterServer */ \
- BOOL WINAPI DLLMAIN_ENTRY( \
- HINSTANCE hinstDLL, \
- DWORD fdwReason, \
- LPVOID lpvReserved) \
- { \
- if(fdwReason == DLL_PROCESS_ATTACH) \
- { \
- hProxyDll = hinstDLL; \
- DISABLE_THREAD_LIBRARY_CALLS(hinstDLL); \
- } \
- return TRUE; \
- } \
- \
- /* DllRegisterServer registers the interfaces contained in the proxy DLL. */ \
- HRESULT STDAPICALLTYPE DLLREGISTERSERVER_ENTRY() \
- { \
- return NdrDllRegisterProxy(hProxyDll, pProxyFileList, pClsID); \
- } \
- \
- /* DllUnregisterServer unregisters the interfaces contained in the proxy DLL. */ \
- HRESULT STDAPICALLTYPE DLLUNREGISTERSERVER_ENTRY() \
- { \
- return NdrDllUnregisterProxy(hProxyDll, pProxyFileList, pClsID); \
- }
- //Delegation support.
- #define STUB_FORWARDING_FUNCTION NdrStubForwardingFunction
- ULONG STDMETHODCALLTYPE
- CStdStubBuffer2_Release(IRpcStubBuffer *This);
- ULONG STDMETHODCALLTYPE
- NdrCStdStubBuffer2_Release(IRpcStubBuffer *This,IPSFactoryBuffer * pPSF);
- #define CStdStubBuffer_DELEGATING_METHODS 0, 0, CStdStubBuffer2_Release, 0, 0, 0, 0, 0, 0, 0
- /*************************************************************************
- End of new functions.
- *************************************************************************/
- // PROXY_CLSID has precedence over PROXY_CLSID_IS
- #ifdef PROXY_CLSID
- #define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;
- #else // PROXY_CLSID
- #ifdef PROXY_CLSID_IS
- #define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;
- #define PROXY_CLSID CLSID_PSFactoryBuffer
- #else // PROXY_CLSID_IS
- #define CLSID_PSFACTORYBUFFER
- #endif //PROXY_CLSID_IS
- #endif //PROXY_CLSID
- // if the user specified an override for the class id, it is
- // PROXY_CLSID at this point
- #ifndef PROXY_CLSID
- #define GET_DLL_CLSID \
- ( aProxyFileList[0]->pStubVtblList[0] != 0 ? \
- aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
- #else //PROXY_CLSID
- #define GET_DLL_CLSID &PROXY_CLSID
- #endif //PROXY_CLSID
- #define EXTERN_PROXY_FILE(name) \
- EXTERN_C const ProxyFileInfo name##_ProxyFileInfo;
- #define PROXYFILE_LIST_START \
- const ProxyFileInfo * aProxyFileList[] = {
- #define REFERENCE_PROXY_FILE(name) \
- & name##_ProxyFileInfo
- #define PROXYFILE_LIST_END \
- 0 };
- // return pointers to the class information
- #define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \
- void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId ) \
- { \
- *pInfo = pPFList; \
- *pId = pClsid; \
- };
- // ole entry points:
- #define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory) \
- HRESULT STDAPICALLTYPE DLLGETCLASSOBJECT_ENTRY ( \
- REFCLSID rclsid, \
- REFIID riid, \
- void ** ppv ) \
- { \
- return \
- NdrDllGetClassObject(rclsid,riid,ppv,pPFlist,pClsid,pFactory ); \
- }
- #define DLLCANUNLOADNOW(pFactory) \
- HRESULT STDAPICALLTYPE DLLCANUNLOADNOW_ENTRY() \
- { \
- return NdrDllCanUnloadNow( pFactory ); \
- }
- #define DLLDUMMYPURECALL \
- void __cdecl _purecall(void) \
- { \
- }
- #define CSTDSTUBBUFFERRELEASE(pFactory) \
- ULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \
- { \
- return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory); \
- } \
- #ifdef PROXY_DELEGATION
- #define CSTDSTUBBUFFER2RELEASE(pFactory) \
- ULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \
- { \
- return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory); \
- }
- #else
- #define CSTDSTUBBUFFER2RELEASE(pFactory)
- #endif //PROXY_DELEGATION
- #ifdef REGISTER_PROXY_DLL
- #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID )
- #else
- #define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID )
- #endif //REGISTER_PROXY_DLL
- // the dll entry points that must be defined
- #define DLLDATA_ROUTINES(pProxyFileList,pClsID ) \
- \
- CLSID_PSFACTORYBUFFER \
- \
- CStdPSFactoryBuffer gPFactory = {0,0,0,0}; \
- \
- DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \
- \
- DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory) \
- \
- DLLCANUNLOADNOW(&gPFactory) \
- \
- CSTDSTUBBUFFERRELEASE(&gPFactory) \
- \
- CSTDSTUBBUFFER2RELEASE(&gPFactory) \
- \
- DLLDUMMYPURECALL \
- \
- DLLREGISTRY_ROUTINES(pProxyFileList, pClsID) \
- \
- // more code goes here...
- #define DLLDATA_STANDARD_ROUTINES \
- DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer ) \
- #if defined(__cplusplus)
- } // extern "C"
- #endif
- #endif // WIN32 or _WIN64_
- #if defined(_M_IA64) || defined(_M_AMD64)
- #include <poppack.h>
- #endif
- #endif // __RPCPROXY_H__
|