/*++ Microsoft Windows Copyright (c) 1994-2000 Microsoft Corporation. All rights reserved. Module Name: factory.c Abstract: Implements the IPSFactoryBuffer interface. Author: ShannonC 12-Oct-1994 Environment: Windows NT, Windows 95 and PowerMac. We do not support DOS and Win16 or Mac. Revision History: YongQu 1-Oct-1998 Unlimit vtbl --*/ #define CINTERFACE #define USE_STUBLESS_PROXY #include #include #include // // Internal CLSCTX used for loading Proxy/Stub DLLs // #define CLSCTX_PS_DLL 0x80000000 extern void ** StublessClientVtbl; EXTERN_C extern const void * g_StublessClientVtbl[]; #define MAX_STUBLESS_PROC 128 ULONG g_dwVtblSize = MAX_STUBLESS_PROC; ULONG g_dwForwardVtblSize = MAX_STUBLESS_PROC; static I_RPC_MUTEX TemplateMutex = 0 ,VtblMutex = 0 ; HRESULT CreateStublessProcBuffer(ULONG numMethods, void *** lpTempVtbl); HRESULT CreateForwardProcBuffer(ULONG numMethods, void *** lpTempVtbl); HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_QueryInterface ( IPSFactoryBuffer *This, REFIID iid, void **ppv ); ULONG STDMETHODCALLTYPE CStdPSFactoryBuffer_AddRef( IPSFactoryBuffer *This); ULONG STDMETHODCALLTYPE CStdPSFactoryBuffer_Release( IPSFactoryBuffer *This); HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_CreateProxy ( IPSFactoryBuffer *This, IUnknown *punkOuter, REFIID riid, IRpcProxyBuffer **ppProxy, void **ppv ); HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_CreateStub ( IPSFactoryBuffer *This, REFIID riid, IUnknown *punkServer, IRpcStubBuffer **ppStub ); HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_HkGetProxyFileInfo ( IN IPSFactoryBuffer *This, IN REFIID riid, OUT PINT pOffset, OUT PVOID *ppProxyFileInfo ); extern "C" { void STDMETHODCALLTYPE NdrProxyForwardingFunction3(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction4(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction5(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction6(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction7(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction8(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction9(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction10(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction11(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction12(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction13(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction14(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction15(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction16(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction17(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction18(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction19(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction20(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction21(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction22(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction23(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction24(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction25(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction26(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction27(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction28(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction29(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction30(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction31(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction32(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction33(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction34(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction35(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction36(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction37(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction38(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction39(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction40(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction41(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction42(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction43(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction44(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction45(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction46(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction47(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction48(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction49(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction50(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction51(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction52(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction53(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction54(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction55(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction56(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction57(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction58(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction59(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction60(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction61(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction62(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction63(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction64(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction65(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction66(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction67(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction68(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction69(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction70(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction71(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction72(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction73(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction74(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction75(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction76(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction77(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction78(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction79(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction80(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction81(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction82(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction83(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction84(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction85(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction86(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction87(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction88(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction89(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction90(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction91(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction92(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction93(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction94(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction95(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction96(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction97(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction98(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction99(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction100(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction101(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction102(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction103(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction104(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction105(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction106(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction107(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction108(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction109(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction110(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction111(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction112(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction113(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction114(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction115(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction116(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction117(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction118(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction119(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction120(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction121(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction122(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction123(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction124(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction125(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction126(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction127(void); #if defined(_AMD64_) || defined(_IA64_) void STDMETHODCALLTYPE NdrProxyForwardingFunction128(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction129(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction130(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction131(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction132(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction133(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction134(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction135(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction136(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction137(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction138(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction139(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction140(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction141(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction142(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction143(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction144(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction145(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction146(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction147(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction148(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction149(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction150(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction151(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction152(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction153(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction154(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction155(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction156(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction157(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction158(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction159(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction160(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction161(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction162(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction163(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction164(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction165(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction166(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction167(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction168(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction169(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction170(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction171(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction172(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction173(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction174(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction175(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction176(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction177(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction178(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction179(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction180(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction181(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction182(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction183(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction184(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction185(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction186(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction187(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction188(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction189(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction190(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction191(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction192(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction193(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction194(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction195(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction196(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction197(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction198(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction199(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction200(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction201(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction202(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction203(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction204(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction205(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction206(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction207(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction208(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction209(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction210(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction211(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction212(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction213(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction214(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction215(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction216(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction217(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction218(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction219(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction220(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction221(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction222(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction223(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction224(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction225(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction226(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction227(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction228(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction229(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction230(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction231(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction232(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction233(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction234(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction235(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction236(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction237(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction238(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction239(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction240(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction241(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction242(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction243(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction244(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction245(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction246(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction247(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction248(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction249(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction250(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction251(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction252(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction253(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction254(void); void STDMETHODCALLTYPE NdrProxyForwardingFunction255(void); #endif // defined(_AMD64_) || defined(_IA64_) } //+------------------------------------------------------------------------- // // Global data // //-------------------------------------------------------------------------- // Hook Factory extern const IPSFactoryHookVtbl CStdPSFactoryBufferVtbl = { CStdPSFactoryBuffer_QueryInterface, CStdPSFactoryBuffer_AddRef, CStdPSFactoryBuffer_Release, CStdPSFactoryBuffer_CreateProxy, CStdPSFactoryBuffer_CreateStub, CStdPSFactoryBuffer_HkGetProxyFileInfo }; // Nondelegated synchronous StubBuffer vtable extern const IRpcStubBufferVtbl CStdStubBufferVtbl= { CStdStubBuffer_QueryInterface, CStdStubBuffer_AddRef, 0, // sync stub is not aggregated CStdStubBuffer_Connect, CStdStubBuffer_Disconnect, CStdStubBuffer_Invoke, CStdStubBuffer_IsIIDSupported, CStdStubBuffer_CountRefs, CStdStubBuffer_DebugServerQueryInterface, CStdStubBuffer_DebugServerRelease }; // Delegated synchronous StubBuffer vtable extern const IRpcStubBufferVtbl CStdStubBuffer2Vtbl= { CStdStubBuffer_QueryInterface, CStdStubBuffer_AddRef, 0, // sync stub is not aggregated CStdStubBuffer2_Connect, CStdStubBuffer2_Disconnect, CStdStubBuffer_Invoke, CStdStubBuffer_IsIIDSupported, CStdStubBuffer2_CountRefs, CStdStubBuffer_DebugServerQueryInterface, CStdStubBuffer_DebugServerRelease }; extern const IRpcProxyBufferVtbl CStdProxyBufferVtbl; extern const IRpcProxyBufferVtbl CStdProxyBuffer2Vtbl; extern const ICallFactoryVtbl CStdProxyBuffer_CallFactoryVtbl; extern const ICallFactoryVtbl CStdProxyBuffer2_CallFactoryVtbl; extern const ICallFactoryVtbl CStdStubBuffer_CallFactoryVtbl; extern const ICallFactoryVtbl CStdStubBuffer2_CallFactoryVtbl; extern const IReleaseMarshalBuffersVtbl CStdProxyBuffer_ReleaseMarshalBuffersVtbl; extern const IReleaseMarshalBuffersVtbl CStdStubBuffer_ReleaseMarshalBuffersVtbl; extern const IReleaseMarshalBuffersVtbl CStdAsyncProxyBuffer_ReleaseMarshalBuffersVtbl; extern const IReleaseMarshalBuffersVtbl CStdAsyncStubBuffer_ReleaseMarshalBuffersVtbl; extern const IRpcStubBufferVtbl CStdAsyncStubBufferVtbl= { CStdAsyncStubBuffer_QueryInterface, CStdAsyncStubBuffer_AddRef, CStdAsyncStubBuffer_Release, CStdAsyncStubBuffer_Connect, // CStdAsyncStubBuffer_Disconnect, // CStdAsyncStubBuffer_Invoke, CStdStubBuffer_IsIIDSupported, CStdStubBuffer_CountRefs, CStdStubBuffer_DebugServerQueryInterface, CStdStubBuffer_DebugServerRelease }; extern const IRpcStubBufferVtbl CStdAsyncStubBuffer2Vtbl= { CStdAsyncStubBuffer_QueryInterface, CStdAsyncStubBuffer_AddRef, CStdAsyncStubBuffer2_Release, CStdAsyncStubBuffer2_Connect, // CStdAsyncStubBuffer2_Disconnect, // CStdAsyncStubBuffer_Invoke, CStdStubBuffer_IsIIDSupported, CStdStubBuffer2_CountRefs, CStdStubBuffer_DebugServerQueryInterface, CStdStubBuffer_DebugServerRelease }; extern void * const g_ForwardingVtbl[] = { Forwarding_QueryInterface, Forwarding_AddRef, Forwarding_Release, NdrProxyForwardingFunction3, NdrProxyForwardingFunction4, NdrProxyForwardingFunction5, NdrProxyForwardingFunction6, NdrProxyForwardingFunction7, NdrProxyForwardingFunction8, NdrProxyForwardingFunction9, NdrProxyForwardingFunction10, NdrProxyForwardingFunction11, NdrProxyForwardingFunction12, NdrProxyForwardingFunction13, NdrProxyForwardingFunction14, NdrProxyForwardingFunction15, NdrProxyForwardingFunction16, NdrProxyForwardingFunction17, NdrProxyForwardingFunction18, NdrProxyForwardingFunction19, NdrProxyForwardingFunction20, NdrProxyForwardingFunction21, NdrProxyForwardingFunction22, NdrProxyForwardingFunction23, NdrProxyForwardingFunction24, NdrProxyForwardingFunction25, NdrProxyForwardingFunction26, NdrProxyForwardingFunction27, NdrProxyForwardingFunction28, NdrProxyForwardingFunction29, NdrProxyForwardingFunction30, NdrProxyForwardingFunction31, NdrProxyForwardingFunction32, NdrProxyForwardingFunction33, NdrProxyForwardingFunction34, NdrProxyForwardingFunction35, NdrProxyForwardingFunction36, NdrProxyForwardingFunction37, NdrProxyForwardingFunction38, NdrProxyForwardingFunction39, NdrProxyForwardingFunction40, NdrProxyForwardingFunction41, NdrProxyForwardingFunction42, NdrProxyForwardingFunction43, NdrProxyForwardingFunction44, NdrProxyForwardingFunction45, NdrProxyForwardingFunction46, NdrProxyForwardingFunction47, NdrProxyForwardingFunction48, NdrProxyForwardingFunction49, NdrProxyForwardingFunction50, NdrProxyForwardingFunction51, NdrProxyForwardingFunction52, NdrProxyForwardingFunction53, NdrProxyForwardingFunction54, NdrProxyForwardingFunction55, NdrProxyForwardingFunction56, NdrProxyForwardingFunction57, NdrProxyForwardingFunction58, NdrProxyForwardingFunction59, NdrProxyForwardingFunction60, NdrProxyForwardingFunction61, NdrProxyForwardingFunction62, NdrProxyForwardingFunction63, NdrProxyForwardingFunction64, NdrProxyForwardingFunction65, NdrProxyForwardingFunction66, NdrProxyForwardingFunction67, NdrProxyForwardingFunction68, NdrProxyForwardingFunction69, NdrProxyForwardingFunction70, NdrProxyForwardingFunction71, NdrProxyForwardingFunction72, NdrProxyForwardingFunction73, NdrProxyForwardingFunction74, NdrProxyForwardingFunction75, NdrProxyForwardingFunction76, NdrProxyForwardingFunction77, NdrProxyForwardingFunction78, NdrProxyForwardingFunction79, NdrProxyForwardingFunction80, NdrProxyForwardingFunction81, NdrProxyForwardingFunction82, NdrProxyForwardingFunction83, NdrProxyForwardingFunction84, NdrProxyForwardingFunction85, NdrProxyForwardingFunction86, NdrProxyForwardingFunction87, NdrProxyForwardingFunction88, NdrProxyForwardingFunction89, NdrProxyForwardingFunction90, NdrProxyForwardingFunction91, NdrProxyForwardingFunction92, NdrProxyForwardingFunction93, NdrProxyForwardingFunction94, NdrProxyForwardingFunction95, NdrProxyForwardingFunction96, NdrProxyForwardingFunction97, NdrProxyForwardingFunction98, NdrProxyForwardingFunction99, NdrProxyForwardingFunction100, NdrProxyForwardingFunction101, NdrProxyForwardingFunction102, NdrProxyForwardingFunction103, NdrProxyForwardingFunction104, NdrProxyForwardingFunction105, NdrProxyForwardingFunction106, NdrProxyForwardingFunction107, NdrProxyForwardingFunction108, NdrProxyForwardingFunction109, NdrProxyForwardingFunction110, NdrProxyForwardingFunction111, NdrProxyForwardingFunction112, NdrProxyForwardingFunction113, NdrProxyForwardingFunction114, NdrProxyForwardingFunction115, NdrProxyForwardingFunction116, NdrProxyForwardingFunction117, NdrProxyForwardingFunction118, NdrProxyForwardingFunction119, NdrProxyForwardingFunction120, NdrProxyForwardingFunction121, NdrProxyForwardingFunction122, NdrProxyForwardingFunction123, NdrProxyForwardingFunction124, NdrProxyForwardingFunction125, NdrProxyForwardingFunction126, NdrProxyForwardingFunction127 #if defined (_AMD64_) || defined(_IA64_) , NdrProxyForwardingFunction128, NdrProxyForwardingFunction129, NdrProxyForwardingFunction130, NdrProxyForwardingFunction131, NdrProxyForwardingFunction132, NdrProxyForwardingFunction133, NdrProxyForwardingFunction134, NdrProxyForwardingFunction135, NdrProxyForwardingFunction136, NdrProxyForwardingFunction137, NdrProxyForwardingFunction138, NdrProxyForwardingFunction139, NdrProxyForwardingFunction140, NdrProxyForwardingFunction141, NdrProxyForwardingFunction142, NdrProxyForwardingFunction143, NdrProxyForwardingFunction144, NdrProxyForwardingFunction145, NdrProxyForwardingFunction146, NdrProxyForwardingFunction147, NdrProxyForwardingFunction148, NdrProxyForwardingFunction149, NdrProxyForwardingFunction150, NdrProxyForwardingFunction151, NdrProxyForwardingFunction152, NdrProxyForwardingFunction153, NdrProxyForwardingFunction154, NdrProxyForwardingFunction155, NdrProxyForwardingFunction156, NdrProxyForwardingFunction157, NdrProxyForwardingFunction158, NdrProxyForwardingFunction159, NdrProxyForwardingFunction160, NdrProxyForwardingFunction161, NdrProxyForwardingFunction162, NdrProxyForwardingFunction163, NdrProxyForwardingFunction164, NdrProxyForwardingFunction165, NdrProxyForwardingFunction166, NdrProxyForwardingFunction167, NdrProxyForwardingFunction168, NdrProxyForwardingFunction169, NdrProxyForwardingFunction170, NdrProxyForwardingFunction171, NdrProxyForwardingFunction172, NdrProxyForwardingFunction173, NdrProxyForwardingFunction174, NdrProxyForwardingFunction175, NdrProxyForwardingFunction176, NdrProxyForwardingFunction177, NdrProxyForwardingFunction178, NdrProxyForwardingFunction179, NdrProxyForwardingFunction180, NdrProxyForwardingFunction181, NdrProxyForwardingFunction182, NdrProxyForwardingFunction183, NdrProxyForwardingFunction184, NdrProxyForwardingFunction185, NdrProxyForwardingFunction186, NdrProxyForwardingFunction187, NdrProxyForwardingFunction188, NdrProxyForwardingFunction189, NdrProxyForwardingFunction190, NdrProxyForwardingFunction191, NdrProxyForwardingFunction192, NdrProxyForwardingFunction193, NdrProxyForwardingFunction194, NdrProxyForwardingFunction195, NdrProxyForwardingFunction196, NdrProxyForwardingFunction197, NdrProxyForwardingFunction198, NdrProxyForwardingFunction199, NdrProxyForwardingFunction200, NdrProxyForwardingFunction201, NdrProxyForwardingFunction202, NdrProxyForwardingFunction203, NdrProxyForwardingFunction204, NdrProxyForwardingFunction205, NdrProxyForwardingFunction206, NdrProxyForwardingFunction207, NdrProxyForwardingFunction208, NdrProxyForwardingFunction209, NdrProxyForwardingFunction210, NdrProxyForwardingFunction211, NdrProxyForwardingFunction212, NdrProxyForwardingFunction213, NdrProxyForwardingFunction214, NdrProxyForwardingFunction215, NdrProxyForwardingFunction216, NdrProxyForwardingFunction217, NdrProxyForwardingFunction218, NdrProxyForwardingFunction219, NdrProxyForwardingFunction220, NdrProxyForwardingFunction221, NdrProxyForwardingFunction222, NdrProxyForwardingFunction223, NdrProxyForwardingFunction224, NdrProxyForwardingFunction225, NdrProxyForwardingFunction226, NdrProxyForwardingFunction227, NdrProxyForwardingFunction228, NdrProxyForwardingFunction229, NdrProxyForwardingFunction230, NdrProxyForwardingFunction231, NdrProxyForwardingFunction232, NdrProxyForwardingFunction233, NdrProxyForwardingFunction234, NdrProxyForwardingFunction235, NdrProxyForwardingFunction236, NdrProxyForwardingFunction237, NdrProxyForwardingFunction238, NdrProxyForwardingFunction239, NdrProxyForwardingFunction240, NdrProxyForwardingFunction241, NdrProxyForwardingFunction242, NdrProxyForwardingFunction243, NdrProxyForwardingFunction244, NdrProxyForwardingFunction245, NdrProxyForwardingFunction246, NdrProxyForwardingFunction247, NdrProxyForwardingFunction248, NdrProxyForwardingFunction249, NdrProxyForwardingFunction250, NdrProxyForwardingFunction251, NdrProxyForwardingFunction252, NdrProxyForwardingFunction253, NdrProxyForwardingFunction254, NdrProxyForwardingFunction255 #endif // defined(_AMD64_) || defined(_IA64_) }; void ** ProxyForwardVtbl = (void **)g_ForwardingVtbl; #pragma code_seg(".orpc") //+--------------------------------------------------------------------------- // // Function: GetTemplateVtbl // // Synopsis: retrieve a copy of stublessclientvtbl and addref it. // // Arguments: void *** pppVtbl stublessclientvtbl to return. // // Note: StublessClientVtbl - sizeof(LONG) is the ref count . // // Returns: // //---------------------------------------------------------------------------- void GetTemplateVtbl(void *** pppVtbl) { LPLONG pTemp; void **ppVtbl; I_RpcRequestMutex(&TemplateMutex); ppVtbl = StublessClientVtbl; pTemp = (LPLONG)ppVtbl; *pppVtbl = ppVtbl; if (ppVtbl == (void**)g_StublessClientVtbl) { I_RpcClearMutex(TemplateMutex); return ; } pTemp--; (*pTemp) ++ ; I_RpcClearMutex(TemplateMutex); } // release the vtbl, free the memory if necessary. void ReleaseTemplateVtbl(void ** pVtbl) { LPLONG pTemp; I_RpcRequestMutex(&TemplateMutex); pTemp = (LPLONG)pVtbl; if (pVtbl == (void**)g_StublessClientVtbl) { I_RpcClearMutex(TemplateMutex); return; } pTemp--; (*pTemp)--; if (0 == *pTemp ) { I_RpcFree(pTemp); } I_RpcClearMutex(TemplateMutex); } //+--------------------------------------------------------------------------- // // Function: GetTemplateForwardVtbl // // Synopsis: retrieve a copy of stublessclientvtbl and addref it. // // Arguments: void *** pppVtbl stublessclientvtbl to return. // // Note: StublessClientVtbl - sizeof(LONG) is the ref count . // // Returns: // //---------------------------------------------------------------------------- void GetTemplateForwardVtbl(void *** pppVtbl) { LPLONG pTemp; void **ppVtbl; I_RpcRequestMutex(&TemplateMutex); ppVtbl = ProxyForwardVtbl; pTemp = (LPLONG)ppVtbl; *pppVtbl = ppVtbl; if (ppVtbl == g_ForwardingVtbl) { I_RpcClearMutex(TemplateMutex); return ; } pTemp--; (*pTemp) ++ ; I_RpcClearMutex(TemplateMutex); } // release the vtbl, free the memory if necessary. void ReleaseTemplateForwardVtbl(void ** pVtbl) { LPLONG pTemp; I_RpcRequestMutex(&TemplateMutex); pTemp = (LPLONG)pVtbl; if (pVtbl == g_ForwardingVtbl) { I_RpcClearMutex(TemplateMutex); return; } pTemp--; (*pTemp)--; if (0 == *pTemp ) { I_RpcFree(pTemp); } I_RpcClearMutex(TemplateMutex); } //+--------------------------------------------------------------------------- // // Function: NdrpInitializeStublessVtbl // // Synopsis: Initialize a stubless vtbl list for current process. increase the size of // vtbl link list and regenerate the vtbl array if necessary. // // Note: The actural vtbl size created might be larger than requested: we will fill // in the whole block of link list . // // Arguments: numMethods number of methods in the interface. // // Returns: // S_OK // //---------------------------------------------------------------------------- HRESULT NdrpInitializeStublessVtbl(ULONG numMethods) { void ** TempVtbl, ** pOldVtbl = NULL; // ole vtbl template to be freed. HRESULT hr; #if defined(_AMD64_) || defined(_IA64_) if (numMethods <= 1024) return S_OK; else return E_FAIL; #else if (numMethods <= MAX_STUBLESS_PROC) return S_OK; // request a mutex might fail because of OUT_OF_MEMORY, and exception would be thrown. // we don't want to throw exception in ole call, so we initialize it first and catch the exceptions. if ( VtblMutex == NULL ) { hr = NdrpInitializeMutex( &VtblMutex ); if ( FAILED( hr ) ) return hr; } if ( TemplateMutex == NULL ) { hr = NdrpInitializeMutex( &TemplateMutex ); if ( FAILED( hr ) ) return hr; } I_RpcRequestMutex(&VtblMutex); if (numMethods > g_dwVtblSize) { // create a hr = CreateStublessProcBuffer(numMethods,&TempVtbl); if (FAILED(hr)) { I_RpcClearMutex(VtblMutex); return hr; } pOldVtbl = StublessClientVtbl; StublessClientVtbl = TempVtbl; } I_RpcClearMutex(VtblMutex); if (pOldVtbl) ReleaseTemplateVtbl(pOldVtbl); return S_OK; #endif // defined(_AMD64_) || defined(_IA64_) } //+--------------------------------------------------------------------------- // // Function: NdrpInitializeForwardVtbl // // Synopsis: Initialize a stubless vtbl list for current process. increase the size of // vtbl link list and regenerate the vtbl array if necessary. // // Note: The actural vtbl size created might be larger than requested: we will fill // in the whole block of link list . // // Arguments: numMethods number of methods in the interface. // // Returns: // S_OK // //---------------------------------------------------------------------------- HRESULT NdrpInitializeForwardVtbl(ULONG numMethods) { void ** TempVtbl, ** pOldVtbl = NULL; // ole vtbl template to be freed. HRESULT hr; #if defined(_AMD64_) || defined(_IA64_) if (numMethods <= 256) return S_OK; else return E_FAIL; #else if (numMethods <= MAX_STUBLESS_PROC) return S_OK; I_RpcRequestMutex(&VtblMutex); if (numMethods > g_dwForwardVtblSize) { // create a hr = CreateForwardProcBuffer(numMethods,&TempVtbl); if (FAILED(hr) ) { I_RpcClearMutex(VtblMutex); return hr; } pOldVtbl = ProxyForwardVtbl; ProxyForwardVtbl = TempVtbl; } I_RpcClearMutex(VtblMutex); if (pOldVtbl) ReleaseTemplateForwardVtbl(pOldVtbl); return S_OK; #endif // defined(_AMD64_) || defined(_IA64_) } BOOL NdrpFindInterface( IN const ProxyFileInfo ** pProxyFileList, IN REFIID riid, OUT const ProxyFileInfo ** ppProxyFileInfo, OUT long * pIndex) /*++ Routine Description: Search the ProxyFileInfo and find the specified interface. If the count is specified in the ProxyFileInfo, then the interfaces in the file are sorted by IID. This means that we can perform a binary search for the IID. Arguments: pProxyFileList - Specifies a list of proxy files to be searched. riid - Specifies the interface ID to be found. ppProxyFileInfo - Returns a pointer to the proxy file info. pIndex - Returns the index of the interface in the proxy file info. Return Value: TRUE - The interface was found. FALSE - The interface was not found. --*/ { long j; BOOL fFound = FALSE; ProxyFileInfo ** ppProxyFileCur; ProxyFileInfo * pProxyFileCur; //Search the list of proxy files. for( ppProxyFileCur = (ProxyFileInfo **) pProxyFileList; (*ppProxyFileCur != 0) && (fFound != TRUE); ppProxyFileCur++) { //Search for the interface proxy vtable. pProxyFileCur = *ppProxyFileCur; // see if it has a lookup routine already if ( ( pProxyFileCur->TableVersion >= 1 ) && ( pProxyFileCur->pIIDLookupRtn ) ) { fFound = (*pProxyFileCur->pIIDLookupRtn)( &riid, (int*)&j ); } else //Linear search. { for(j = 0; (pProxyFileCur->pProxyVtblList[j] != 0); j++) { if(memcmp(&riid, pProxyFileCur->pStubVtblList[j]->header.piid, sizeof(IID)) == 0) { fFound = TRUE; break; } } } } if ( fFound ) { //We found the interface! if(ppProxyFileInfo != 0) *ppProxyFileInfo = pProxyFileCur; if(pIndex != 0) *pIndex = j; } return fFound; } __inline void NdrpInitializeProxyVtbl( CInterfaceProxyVtbl *pProxyVtbl, unsigned long count, BOOL IsDelegated, unsigned short ProxyVersion) /*++ Routine Description: Initialize the proxy vtbl. Arguments: pProxyVtbl - Supplies vtbl to be initialized. count - Supplies number of entries in the vtbl. IsDelegated - TRUE if the interface is delegated, FALSE otherwise. Return Value: None. --*/ { unsigned long k; void ** Vtbl; void ** pStublessVtbl, **pForwardingVtbl; void ** SourceVtbl; GetTemplateVtbl(&pStublessVtbl); GetTemplateForwardVtbl(&pForwardingVtbl); SourceVtbl = IsDelegated ? pForwardingVtbl : pStublessVtbl; Vtbl = pProxyVtbl->Vtbl; // // Proxies after NT 3.51 Beta have a ProxyHeader 4 bytes // larger to support stubless proxies. So in older proxies // subtract 4 bytes to get the the Vtable. // if ( ProxyVersion < 2 ) Vtbl = (void **) ((char*)Vtbl - PTR_MEM_SIZE); // Initialize forwarding or stubless proxy functions if necessary. if ( IsDelegated ) { Vtbl[0] = IUnknown_QueryInterface_Proxy; Vtbl[1] = IUnknown_AddRef_Proxy; Vtbl[2] = IUnknown_Release_Proxy; k = 3; } else k = 0; for( ; k < count; k++) { if(!Vtbl[k]) { Vtbl[k] = SourceVtbl[k]; } else if ( -1 == (ULONG_PTR)Vtbl[k] ) { Vtbl[k] = pStublessVtbl[k]; } } ReleaseTemplateVtbl(pStublessVtbl); ReleaseTemplateForwardVtbl(pForwardingVtbl); } __inline void NdrpInitializeStubVtbl( CInterfaceStubVtbl *pStubVtbl, unsigned long version) /*++ Routine Description: Initialize the stub vtbl. Arguments: pStubVtbl - Supplies vtbl to be initialized. version Return Value: None. --*/ { void * * pVtbl = (void **) &pStubVtbl->Vtbl; void * * pSourceVtbl; int i; switch ( version ) { case 2: pSourceVtbl = (void **)&CStdStubBuffer2Vtbl; break; case 3: pSourceVtbl = (void **)&CStdAsyncStubBufferVtbl; break; case 4: pSourceVtbl = (void **)&CStdAsyncStubBuffer2Vtbl; break; default: pSourceVtbl = (void **)&CStdStubBufferVtbl; } for ( i=0; i < sizeof(IRpcStubBufferVtbl)/PTR_MEM_SIZE; i++ ) { if ( !pVtbl[i] ) pVtbl[i] = pSourceVtbl[i]; } } HRESULT NdrpInitializeProxyDll( IN const ProxyFileInfo ** pProxyFileList, IN CStdPSFactoryBuffer * pPSFactoryBuffer ) /*++ Routine Description: Initialize the proxy DLL. Arguments: pProxyFileList - Specifies a list of proxy files to be searched. pPSFactoryBuffer - Pointer to class factory for proxy DLL. Return Value: None. --*/ { long i, j; HRESULT hr; unsigned long version, lStublessMaxCount = 0, lForwardMaxCount = 0; // set up the PSFactory object if we are the first // note that the refcount is NOT altered right here to avoid races if (pPSFactoryBuffer->lpVtbl != 0) return S_OK; for (i = 0; pProxyFileList[i] != 0; i++) for (j = 0; pProxyFileList[i]->pProxyVtblList[j] != 0; j++) { if((pProxyFileList[i]->pDelegatedIIDs != 0) && (pProxyFileList[i]->pDelegatedIIDs[j] != 0)) { if (lForwardMaxCount < pProxyFileList[i]->pStubVtblList[j]->header.DispatchTableCount) lForwardMaxCount = pProxyFileList[i]->pStubVtblList[j]->header.DispatchTableCount; } if (lStublessMaxCount < pProxyFileList[i]->pStubVtblList[j]->header.DispatchTableCount) lStublessMaxCount = pProxyFileList[i]->pStubVtblList[j]->header.DispatchTableCount; } hr = NdrpInitializeStublessVtbl(lStublessMaxCount); if (SUCCEEDED(hr)) hr = NdrpInitializeForwardVtbl(lForwardMaxCount); if (FAILED(hr)) return hr; //iterate over the list of proxy files in the proxy DLL. for(i = 0; pProxyFileList[i] != 0; i++) { //iterate over the list of interfaces in the proxy file. for(j = 0; pProxyFileList[i]->pProxyVtblList[j] != 0; j++) { if((pProxyFileList[i]->pDelegatedIIDs != 0) && (pProxyFileList[i]->pDelegatedIIDs[j] != 0)) version = 2; else version = 0; //Initialize the proxy vtbl. NdrpInitializeProxyVtbl(pProxyFileList[i]->pProxyVtblList[j], pProxyFileList[i]->pStubVtblList[j]->header.DispatchTableCount, (version == 2), pProxyFileList[i]->TableVersion); //Initialize the stub vtbl. // See if this is an async uuid interface. if ( (pProxyFileList[i]->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && (ULONG_PTR)pProxyFileList[i]->pAsyncIIDLookup[j] == -1 ) { if (version == 2) { // delegated async version = 4; } else { // non-delegated async version = 3; } } NdrpInitializeStubVtbl(pProxyFileList[i]->pStubVtblList[j], version); //Initialize the stub dispatch table. } } pPSFactoryBuffer->pProxyFileList = pProxyFileList; //Set the lpVtbl. This code is safe for multiple threads. InterlockedExchangePointer((PVOID *) &pPSFactoryBuffer->lpVtbl, (PVOID) &CStdPSFactoryBufferVtbl); return hr; } HRESULT RPC_ENTRY NdrDllGetClassObject ( IN REFCLSID rclsid, IN REFIID riid, OUT void ** ppv, IN const ProxyFileInfo ** pProxyFileList, IN const CLSID * pclsid, IN CStdPSFactoryBuffer * pPSFactoryBuffer ) /*++ Routine Description: Searches the linked list for the required class. Arguments: rclsid -- class id to find riid -- interface to return ppv -- output pointer ppfinfo-- proxyfile info data structure pclsid -- proxy file classid pPSFactoryBuffer -- pointer to class factory for dll Return Value: CLASS_E_CLASSNOTAVAILABLE if class not found Otherwise, whatever is returned by the class's QI --*/ { HRESULT hr; RPC_STATUS rc; BOOL fFound; //Initialize the RPC heap. rc = NdrpPerformRpcInitialization(); if (RPC_S_OK == rc) hr = NdrpInitializeProxyDll(pProxyFileList, pPSFactoryBuffer); else hr = HRESULT_FROM_WIN32(rc); if (SUCCEEDED(hr)) { if((pclsid != 0) && (memcmp(&rclsid, pclsid, sizeof(IID)) == 0)) fFound = TRUE; else { //Search the list of proxy files. fFound = NdrpFindInterface(pProxyFileList, rclsid, 0, 0); } if(fFound != TRUE) hr = CLASS_E_CLASSNOTAVAILABLE; else { // see if they asked for one of our interfaces hr = pPSFactoryBuffer->lpVtbl->QueryInterface( (IPSFactoryBuffer *)pPSFactoryBuffer, riid, ppv); } } if(FAILED(hr)) *ppv = 0; return hr; } HRESULT RPC_ENTRY NdrDllCanUnloadNow( IN CStdPSFactoryBuffer * pPSFactoryBuffer) /*++ Routine Description: Arguments: Return Value: S_OK if DLL reference count is zero S_FALSE otherwise --*/ { HRESULT hr; if(pPSFactoryBuffer->RefCount == 0) hr = S_OK; else hr = S_FALSE; return hr; } EXTERN_C HRESULT NdrpCreateProxy( IN REFIID riid, IN IUnknown * punkOuter, OUT IRpcProxyBuffer ** ppProxy, OUT void ** ppv) /*++ Routine Description: Create a proxy for the specified interface. Arguments: riid - Specifies the interface ID. punkOuter - Specifies the controlling unknown. ppProxy - Returns a pointer to the IRpcProxyBuffer interface on the proxy. ppv - Returns a pointer to the interface proxy. Return Value: S_OK REGDB_E_IIDNOTREG REGDB_E_READREGDB REGDB_E_INVALIDVALUE E_NOINTERFACE --*/ { HRESULT hr; CLSID clsid; IPSFactoryBuffer * pFactory; hr = (*pfnCoGetPSClsid)(riid, &clsid); if(SUCCEEDED(hr)) { hr = (*pfnCoGetClassObject)(clsid, CLSCTX_INPROC_SERVER | CLSCTX_PS_DLL, 0, IID_IPSFactoryBuffer, (void**)&pFactory); if(SUCCEEDED(hr)) { hr = pFactory->lpVtbl->CreateProxy(pFactory, punkOuter, riid, ppProxy, ppv); if(SUCCEEDED(hr)) { //Note that CreateProxy increments the reference count on punkOuter. //In order to eliminate the circular reference, //we release the punkOuter here. if((*ppv != 0) && (punkOuter != 0)) punkOuter->lpVtbl->Release(punkOuter); } pFactory->lpVtbl->Release(pFactory); } } if(FAILED(hr)) { *ppProxy = 0; *ppv = 0; } return hr; } EXTERN_C HRESULT NdrpCreateStub( IN REFIID riid, IN IUnknown * punkServer, OUT IRpcStubBuffer ** ppStub) /*++ Routine Description: Create a stub for the specified interface. Arguments: riid - Species the interface ID. punkServer - Specifies the controlling unknown. ppStub - Returns a pointer to the stub. Return Value: S_OK REGDB_E_IIDNOTREG REGDB_E_READREGDB REGDB_E_INVALIDVALUE E_NOINTERFACE --*/ { HRESULT hr; CLSID clsid; IPSFactoryBuffer * pFactory; hr = (*pfnCoGetPSClsid)(riid, &clsid); if(SUCCEEDED(hr)) { hr = (*pfnCoGetClassObject)(clsid, CLSCTX_INPROC_SERVER | CLSCTX_PS_DLL, 0, IID_IPSFactoryBuffer, (void**)&pFactory); if(SUCCEEDED(hr)) { hr = pFactory->lpVtbl->CreateStub(pFactory, riid, punkServer, ppStub); pFactory->lpVtbl->Release(pFactory); } } if(FAILED(hr)) *ppStub = 0; return hr; } HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_QueryInterface ( IN IPSFactoryBuffer * This, IN REFIID iid, OUT void ** ppv ) /*++ Routine Description: Query for an interface on the PSFactoryBuffer. The PSFactoryBuffer supports the IUnknown and IPSFactoryBuffer interfaces. Arguments: iid - Specifies the interface ID. ppv - Returns a pointer to the specified interface. Return Value: S_OK E_NOINTERFACE --*/ { HRESULT hr; if ((memcmp(&iid, &IID_IUnknown, sizeof(IID)) == 0) || (memcmp(&iid, &IID_IPSFactoryBuffer, sizeof(IID)) == 0) || (memcmp(&iid, &IID_IPSFactoryHook, sizeof(IID)) == 0)) { *ppv = This; This->lpVtbl->AddRef(This); hr = S_OK; } else { *ppv = 0; hr = E_NOINTERFACE; } return hr; } ULONG STDMETHODCALLTYPE CStdPSFactoryBuffer_AddRef( IN IPSFactoryBuffer *This) /*++ Routine Description: Increment reference count. Since we have a single instance of the CStdPSFactoryBuffer per DLL, we can use the PSFactory reference count as the DLL reference count. Arguments: Return Value: Reference count. --*/ { InterlockedIncrement(&((CStdPSFactoryBuffer *) This)->RefCount); return (unsigned long) ((CStdPSFactoryBuffer *) This)->RefCount; } ULONG STDMETHODCALLTYPE CStdPSFactoryBuffer_Release( IN IPSFactoryBuffer *This) /*++ Routine Description: Decrement reference count. Arguments: Return Value: Reference count. --*/ { ULONG count; NDR_ASSERT(((CStdPSFactoryBuffer *)This)->RefCount > 0, "Invalid reference count"); count = (ULONG) ((CStdPSFactoryBuffer *)This)->RefCount - 1; if(InterlockedDecrement(&((CStdPSFactoryBuffer *)This)->RefCount) == 0) { count = 0; } return count; } HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_CreateProxy ( IN IPSFactoryBuffer * This, IN IUnknown * punkOuter, IN REFIID riid, OUT IRpcProxyBuffer ** ppProxy, OUT void ** ppv ) /*++ Routine Description: Create a proxy for the specified interface. Arguments: punkOuter - Specifies the controlling unknown. riid - Specifies the interface ID. ppProxy - Returns a pointer to the IRpcProxyBuffer interface. ppv - Returns a pointer to the specified interface. Return Value: S_OK E_NOINTERFACE E_OUTOFMEMORY --*/ { HRESULT hr; BOOL fFound; long j; BOOL fDelegate = FALSE; const ProxyFileInfo *pProxyFileInfo; fFound = NdrpFindInterface(((CStdPSFactoryBuffer *)This)->pProxyFileList, riid, &pProxyFileInfo, &j); if(fFound != TRUE) hr = E_NOINTERFACE; else if ( (pProxyFileInfo->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && (ULONG_PTR)pProxyFileInfo->pAsyncIIDLookup[j] == -1 ) { // An attempt to create a sync proxy for an async interface. hr = E_NOINTERFACE; } else { if((pProxyFileInfo->pDelegatedIIDs != 0) && (pProxyFileInfo->pDelegatedIIDs[j] != 0) && (!IsEqualIID(*pProxyFileInfo->pDelegatedIIDs[j], IID_IUnknown))) { //Need to delegate to the proxy for the base interface.. //Allocate memory for the new proxy buffer. CStdProxyBuffer2 *pProxyBuffer = (CStdProxyBuffer2*)(*pfnCoTaskMemAlloc)(sizeof(CStdProxyBuffer2)); if(0 == pProxyBuffer) hr = E_OUTOFMEMORY; else { hr = S_OK; //Initialize the new proxy buffer. memset(pProxyBuffer, 0, sizeof(CStdProxyBuffer2)); pProxyBuffer->lpVtbl = &CStdProxyBuffer2Vtbl; pProxyBuffer->RefCount = 1; pProxyBuffer->punkOuter = punkOuter ? punkOuter : (IUnknown *) pProxyBuffer; pProxyBuffer->pProxyVtbl = &pProxyFileInfo-> pProxyVtblList[j]->Vtbl; if ( pProxyFileInfo->TableVersion < 2 ) pProxyBuffer->pRMBVtbl = NULL; else pProxyBuffer->pRMBVtbl = &CStdProxyBuffer_ReleaseMarshalBuffersVtbl; if ( (pProxyFileInfo->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && pProxyFileInfo->pAsyncIIDLookup[j] != 0 ) { // The interface has an async counterpart. pProxyBuffer->pCallFactoryVtbl = & CStdProxyBuffer2_CallFactoryVtbl; pProxyBuffer->pAsyncIID = pProxyFileInfo->pAsyncIIDLookup[j]; pProxyBuffer->pRMBVtbl = &CStdAsyncProxyBuffer_ReleaseMarshalBuffersVtbl; } // // Proxies after NT 3.51 Beta have a ProxyHeader 4 bytes // larger to support stubless proxies. So in older proxies // subtract 4 bytes to get the the Vtable. // if ( pProxyFileInfo->TableVersion < 2 ) pProxyBuffer->pProxyVtbl = (void *) ((char *)pProxyBuffer->pProxyVtbl - PTR_MEM_SIZE); //Increment the DLL reference count for DllCanUnloadNow. This->lpVtbl->AddRef(This); pProxyBuffer->pPSFactory = This; pProxyBuffer->iidBase = *pProxyFileInfo->pDelegatedIIDs[j]; //Create a proxy for the base interface. hr = NdrpCreateProxy(*pProxyFileInfo->pDelegatedIIDs[j], (IUnknown *) pProxyBuffer, &pProxyBuffer->pBaseProxyBuffer, (void**)&pProxyBuffer->pBaseProxy); if(FAILED(hr)) { (*pfnCoTaskMemFree)(pProxyBuffer); } else { *ppProxy = (IRpcProxyBuffer *) pProxyBuffer; *ppv = (void *) &pProxyBuffer->pProxyVtbl; ((IUnknown *) *ppv)->lpVtbl->AddRef((IUnknown *) *ppv); } } } else { //Allocate memory for the new proxy buffer. CStdProxyBuffer *pProxyBuffer = (CStdProxyBuffer*)(*pfnCoTaskMemAlloc)(sizeof(CStdProxyBuffer)); if(0 == pProxyBuffer) hr = E_OUTOFMEMORY; else { hr = S_OK; //Initialize the new proxy buffer. memset(pProxyBuffer, 0, sizeof(CStdProxyBuffer)); pProxyBuffer->lpVtbl = &CStdProxyBufferVtbl; pProxyBuffer->RefCount = 1; pProxyBuffer->punkOuter = punkOuter ? punkOuter : (IUnknown *) pProxyBuffer; pProxyBuffer->pProxyVtbl = &pProxyFileInfo-> pProxyVtblList[j]->Vtbl; if ( pProxyFileInfo->TableVersion < 2 ) pProxyBuffer->pRMBVtbl = NULL; else pProxyBuffer->pRMBVtbl = &CStdProxyBuffer_ReleaseMarshalBuffersVtbl; if ( (pProxyFileInfo->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && pProxyFileInfo->pAsyncIIDLookup[j] != 0 ) { pProxyBuffer->pCallFactoryVtbl = & CStdProxyBuffer_CallFactoryVtbl; pProxyBuffer->pAsyncIID = pProxyFileInfo->pAsyncIIDLookup[j]; pProxyBuffer->pRMBVtbl = &CStdAsyncProxyBuffer_ReleaseMarshalBuffersVtbl; } // // Proxies after NT 3.51 Beta have a ProxyHeader 4 bytes // larger to support stubless proxies. So in older proxies // subtract 4 bytes to get the the Vtable. // if ( pProxyFileInfo->TableVersion < 2 ) pProxyBuffer->pProxyVtbl = (void *) ((char*)pProxyBuffer->pProxyVtbl - PTR_MEM_SIZE); //Increment the DLL reference count for DllCanUnloadNow. This->lpVtbl->AddRef(This); pProxyBuffer->pPSFactory = This; *ppProxy = (IRpcProxyBuffer *) pProxyBuffer; *ppv = (void *) &pProxyBuffer->pProxyVtbl; ((IUnknown *) *ppv)->lpVtbl->AddRef((IUnknown *) *ppv); } } } if(FAILED(hr)) { *ppProxy = 0; *ppv = 0; } return hr; } HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_CreateStub ( IN IPSFactoryBuffer * This, IN REFIID riid, IN IUnknown * punkServer, OUT IRpcStubBuffer ** ppStub ) /*++ Routine Description: Create a stub for the specified interface. Arguments: Return Value: --*/ { HRESULT hr; const ProxyFileInfo * pProxyFileInfo; long j; BOOL fFound = NdrpFindInterface(((CStdPSFactoryBuffer *)This)->pProxyFileList, riid, &pProxyFileInfo, &j); if(fFound != TRUE) hr = E_NOINTERFACE; else if ( (pProxyFileInfo->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && (ULONG_PTR)pProxyFileInfo->pAsyncIIDLookup[j] == -1 ) { // An attempt to create a sync stub for an async interface. hr = E_NOINTERFACE; } else { if((pProxyFileInfo->pDelegatedIIDs != 0) && (pProxyFileInfo->pDelegatedIIDs[j] != 0) && (!IsEqualIID(*pProxyFileInfo->pDelegatedIIDs[j], IID_IUnknown))) { IUnknown * punkForward; //We need to delegate to the stub for the base interface. CStdStubBuffer2 *pStubBuffer = (CStdStubBuffer2*)(*pfnCoTaskMemAlloc)(sizeof(CStdStubBuffer2)); if(0 == pStubBuffer) hr = E_OUTOFMEMORY; else { void ** pForwardingVtbl; GetTemplateForwardVtbl(&pForwardingVtbl); //Initialize the new stub buffer. memset(pStubBuffer, 0, sizeof(CStdStubBuffer2)); pStubBuffer->lpForwardingVtbl = pForwardingVtbl; pStubBuffer->lpVtbl = &pProxyFileInfo->pStubVtblList[j]->Vtbl; pStubBuffer->RefCount= 1; pStubBuffer->pPSFactory = This; if ( pProxyFileInfo->TableVersion < 2 ) pStubBuffer->pRMBVtbl = NULL; else pStubBuffer->pRMBVtbl = &CStdStubBuffer_ReleaseMarshalBuffersVtbl; if ( (pProxyFileInfo->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && pProxyFileInfo->pAsyncIIDLookup[j] != 0 ) { pStubBuffer->pCallFactoryVtbl = &CStdStubBuffer2_CallFactoryVtbl; pStubBuffer->pAsyncIID = pProxyFileInfo->pAsyncIIDLookup[j]; pStubBuffer->pRMBVtbl = &CStdAsyncStubBuffer_ReleaseMarshalBuffersVtbl; } //Increment the DLL reference count for DllCanUnloadNow. This->lpVtbl->AddRef(This); *ppStub = (IRpcStubBuffer *) &pStubBuffer->lpVtbl; //Connect the stub to the server object. if(punkServer != 0) { hr = punkServer->lpVtbl->QueryInterface( punkServer, riid, (void**)&pStubBuffer->pvServerObject); } else { hr = S_OK; } if(SUCCEEDED(hr)) { if(punkServer != 0) punkForward = (IUnknown *) &pStubBuffer->lpForwardingVtbl; else punkForward = 0; //Create a stub for the base interface hr = NdrpCreateStub(*pProxyFileInfo->pDelegatedIIDs[j], punkForward, &pStubBuffer->pBaseStubBuffer); } if(FAILED(hr)) { ReleaseTemplateForwardVtbl(pForwardingVtbl); (*pfnCoTaskMemFree)(pStubBuffer); } } } else { //Create an ordinary stub buffer. CStdStubBuffer *pStubBuffer = (CStdStubBuffer*)(*pfnCoTaskMemAlloc)(sizeof(CStdStubBuffer)); if(0 == pStubBuffer) hr = E_OUTOFMEMORY; else { //Initialize the new stub buffer. memset(pStubBuffer, 0, sizeof(CStdStubBuffer)); pStubBuffer->lpVtbl = &pProxyFileInfo->pStubVtblList[j]->Vtbl; pStubBuffer->RefCount= 1; pStubBuffer->pPSFactory = This; if ( pProxyFileInfo->TableVersion < 2 ) pStubBuffer->pRMBVtbl = NULL; else pStubBuffer->pRMBVtbl = &CStdStubBuffer_ReleaseMarshalBuffersVtbl; if ( (pProxyFileInfo->TableVersion & NDR_PROXY_FILE_ASYNC_UUID) && pProxyFileInfo->pAsyncIIDLookup[j] != 0 ) { pStubBuffer->pCallFactoryVtbl = &CStdStubBuffer_CallFactoryVtbl; pStubBuffer->pAsyncIID = pProxyFileInfo->pAsyncIIDLookup[j]; pStubBuffer->pRMBVtbl = &CStdAsyncStubBuffer_ReleaseMarshalBuffersVtbl; } if(0 == punkServer) hr = S_OK; else { hr = punkServer->lpVtbl->QueryInterface( punkServer, riid, (void**)&pStubBuffer->pvServerObject); } if(SUCCEEDED(hr)) { //Increment the DLL reference count for DllCanUnloadNow. This->lpVtbl->AddRef(This); *ppStub = (IRpcStubBuffer *) pStubBuffer; } else { (*pfnCoTaskMemFree)(pStubBuffer); } } } } if(FAILED(hr)) *ppStub = 0; return hr; } HRESULT STDMETHODCALLTYPE CStdPSFactoryBuffer_HkGetProxyFileInfo ( IN IPSFactoryBuffer *This, IN REFIID riid, OUT PINT pOffset, OUT PVOID *ppProxyFileInfo ) /*++ Routine Description: This function returns the proxy information for a particular interface. HookOle requires information such as the number of methods in the vtable and a pointer to the StublessProxyInfo structure. Arguments: This - This pointer for the proxy object. riid - IID of the interface we are asking about. pOffset - Offset into the ProxyFileInfo lists for this particular interface. ppProxyFileInfo - Pointer to location where a pointer to the ProxyFileInfo structure can be stored. Return Value: --*/ { HRESULT hr=E_NOINTERFACE; ProxyFileInfo *pProxyFileInfo=NULL; // // Find the index into the FileList for this iid. // if (NdrpFindInterface( ((CStdPSFactoryBuffer *)This)->pProxyFileList, riid, (const ProxyFileInfo**)&pProxyFileInfo, (long*)pOffset)) { *ppProxyFileInfo = (PVOID)pProxyFileInfo; hr = S_OK; } return(hr); } // initialize mutex, and return error instead of throwing. In OLE world, people // expect error code instead of exception. HRESULT NdrpInitializeMutex( I_RPC_MUTEX * pMutex ) { RPC_STATUS rc = RPC_S_OK; NDR_ASSERT( *pMutex == NULL, "pMutex should be NULL to be initialized" ); // __try { I_RpcRequestMutex( pMutex ); I_RpcClearMutex( *pMutex ); } __except( EXCEPTION_EXECUTE_HANDLER ) { // we want to catch all the exception here in OLE land rc = RpcExceptionCode(); } return HRESULT_FROM_WIN32( rc ); }