windows-nt/Source/XPSP1/NT/com/rpc/ndr64/srvwrap.cxx
2020-09-26 16:20:57 +08:00

173 lines
4.5 KiB
C++

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 2000 Microsoft Corporation
Module Name :
srvwrap.c
Abstract :
This file contains the function to dispatch calls to stub worker.
Author :
Yong Qu yongqu Feb 2000 created
Revision History :
---------------------------------------------------------------------*/
#include "precomp.hxx"
#define CINTERFACE
#define USE_STUBLESS_PROXY
#include "ndrole.h"
#include "rpcproxy.h"
#include "interp2.h"
#include <stdarg.h>
extern long RPC_ENTRY
Ndr64StubWorker(
IRpcStubBuffer * pThis,
IRpcChannelBuffer * pChannel,
PRPC_MESSAGE pRpcMsg,
MIDL_SERVER_INFO * pServerInfo,
const SERVER_ROUTINE * DispatchTable,
MIDL_SYNTAX_INFO * pSyntaxInfo,
ulong * pdwStubPhase
);
RPCRTAPI
void RPC_ENTRY
NdrServerCallNdr64(
PRPC_MESSAGE pRpcMsg
)
/*++
Routine Description :
Server Interpreter entry point for regular RPC procs.
Arguments :
pRpcMsg - The RPC message.
Return :
None.
--*/
{
ulong dwStubPhase = STUB_UNMARSHAL;
PRPC_SERVER_INTERFACE pServerIfInfo;
PMIDL_SERVER_INFO pServerInfo;
const SERVER_ROUTINE * DispatchTable;
NDR_PROC_CONTEXT ProcContext;
MIDL_SYNTAX_INFO * pSyntaxInfo;
pServerIfInfo = (PRPC_SERVER_INTERFACE)pRpcMsg->RpcInterfaceInformation;
pServerInfo = (PMIDL_SERVER_INFO)pServerIfInfo->InterpreterInfo;
DispatchTable = pServerInfo->DispatchTable;
pSyntaxInfo = &pServerInfo->pSyntaxInfo[0];
NDR_ASSERT( XFER_SYNTAX_NDR64 == NdrpGetSyntaxType(&pSyntaxInfo->TransferSyntax),
" invalid transfer syntax" );
Ndr64StubWorker( 0,
0,
pRpcMsg,
pServerInfo,
DispatchTable,
pSyntaxInfo,
&dwStubPhase );
}
RPCRTAPI
void RPC_ENTRY
NdrServerCallAll(
PRPC_MESSAGE pRpcMsg
)
{
ulong dwStubPhase = STUB_UNMARSHAL;
PRPC_SERVER_INTERFACE pServerIfInfo;
PMIDL_SERVER_INFO pServerInfo;
const SERVER_ROUTINE * DispatchTable;
NDR_PROC_CONTEXT ProcContext;
MIDL_SYNTAX_INFO * pSyntaxInfo;
pServerIfInfo = (PRPC_SERVER_INTERFACE)pRpcMsg->RpcInterfaceInformation;
pServerInfo = (PMIDL_SERVER_INFO)pServerIfInfo->InterpreterInfo;
DispatchTable = pServerInfo->DispatchTable;
// assuming the default transfer syntax is DCE, NDR64 is the second syntaxinfo.
pSyntaxInfo = &pServerInfo->pSyntaxInfo[1];
NDR_ASSERT( XFER_SYNTAX_NDR64 == NdrpGetSyntaxType(&pSyntaxInfo->TransferSyntax),
" invalid transfer syntax" );
Ndr64StubWorker( 0,
0,
pRpcMsg,
pServerInfo,
DispatchTable,
pSyntaxInfo,
&dwStubPhase );
}
long RPC_ENTRY
NdrStubCall3(
struct IRpcStubBuffer * pThis,
struct IRpcChannelBuffer * pChannel,
PRPC_MESSAGE pRpcMsg,
ulong * pdwStubPhase
)
{
IUnknown * pSrvObj;
CInterfaceStubVtbl * pStubVTable;
PMIDL_SERVER_INFO pServerInfo;
const SERVER_ROUTINE * DispatchTable;
SYNTAX_TYPE SyntaxType;
long i;
MIDL_SYNTAX_INFO * pSyntaxInfo = NULL;
if ( NULL == pRpcMsg->TransferSyntax ||
NdrpGetSyntaxType( pRpcMsg->TransferSyntax ) == XFER_SYNTAX_DCE )
return NdrStubCall2( pThis, pChannel, pRpcMsg, pdwStubPhase );
pSrvObj = (IUnknown * )((CStdStubBuffer *)pThis)->pvServerObject;
DispatchTable = (SERVER_ROUTINE *)pSrvObj->lpVtbl;
pStubVTable = (CInterfaceStubVtbl *)
(*((uchar **)pThis) - sizeof(CInterfaceStubHeader));
pServerInfo = (PMIDL_SERVER_INFO) pStubVTable->header.pServerInfo;
for ( i = 0; i < (long)pServerInfo->nCount; i++ )
{
if ( NdrpGetSyntaxType( &pServerInfo->pSyntaxInfo[i].TransferSyntax ) == XFER_SYNTAX_NDR64 )
{
pSyntaxInfo = &pServerInfo->pSyntaxInfo[i];
break;
}
}
if ( NULL == pSyntaxInfo )
return HRESULT_FROM_WIN32( RPC_S_UNSUPPORTED_TRANS_SYN );
return
Ndr64StubWorker( pThis,
pChannel,
pRpcMsg,
pServerInfo,
DispatchTable,
pSyntaxInfo,
pdwStubPhase );
}