mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2494 lines
63 KiB
2494 lines
63 KiB
/*++
|
|
|
|
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 <ndrp.h>
|
|
#include <ndrole.h>
|
|
#include <rpcproxy.h>
|
|
|
|
//
|
|
// 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 );
|
|
}
|