Leaked source code of windows server 2003
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.
 
 
 
 
 
 

120 lines
4.1 KiB

/**********************************************************************
Copyright (c) 2002 Microsoft Corporation
Module Name :
chkrobust.cxx
Abstract :
This file contains the routines to check if -robust flag is presented on all the methods
in an interface. This includes both raw rpc interfaces and DCOM interfaces.
Author :
Yong Qu yongqu March 2002
Revision History :
**********************************************************************/
#include "ndrp.h"
#include "ndrole.h"
static const RPC_SYNTAX_IDENTIFIER gOleServer[] =
{
{0x69C09EA0, 0x4A09, 0x101B, 0xAE, 0x4B, 0x08, 0x00, 0x2B, 0x34, 0x9A, 0x02,
{0, 0}},
{0x00000131, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
{0, 0}},
{0x69C09EA0, 0x4A09, 0x101B, 0xAE, 0x4B, 0x08, 0x00, 0x2B, 0x34, 0x9A, 0x02,
{0, 0}}
};
// called from RpcServerRegisterIf(x) family
RPC_STATUS
CheckForRobust (
RPC_SERVER_INTERFACE * pRpcServerIf )
{
NDR_ASSERT( pRpcServerIf != NULL, "invalid input RPC_SERVER_INTERFACE" );
if ( pRpcServerIf->DefaultManagerEpv )
{
// use_epv, it's not secure
return RPC_X_BAD_STUB_DATA;
}
// either OLE or /Os stub altogether.
if ( pRpcServerIf->InterpreterInfo == NULL )
{
// there are three "fake" ole interfaces that do their own dispatching
for ( ulong i = 0; i < 3; i++)
{
if ( memcmp(&(pRpcServerIf->InterfaceId), &gOleServer[i], sizeof(RPC_SYNTAX_IDENTIFIER) )== 0 )
return RPC_S_OK;
}
return RPC_X_BAD_STUB_DATA;
}
#if !defined(__RPC_WIN64__)
// I don't like this. This is the only way to check for /Oi,Oic stub for raw rpc interface
for ( ulong i = 0; i < pRpcServerIf->DispatchTable->DispatchTableCount ; i ++ )
{
if (pRpcServerIf->DispatchTable->DispatchTable[i] == NdrServerCall )
return RPC_X_BAD_STUB_DATA;
}
#endif
return NdrpCheckMIDLRobust ( (MIDL_SERVER_INFO *)pRpcServerIf->InterpreterInfo, pRpcServerIf->DispatchTable->DispatchTableCount , FALSE);
}
// called from NdrpCheckRpcServerRobust or from NdrDllRegisterProxy
DWORD
NdrpCheckMIDLRobust( IN const MIDL_SERVER_INFO * pMServerInfo, ulong ProcCount , BOOL IsObjectIntf )
{
NDR_ASSERT( pMServerInfo != NULL, "invalid MIDL_SERVER_INFO" );
PMIDL_STUB_DESC pStubDesc = pMServerInfo->pStubDesc;
BOOL fHasNoRobust = FALSE;
// ulong i = IsObjectIntf? 2:0;
if (pStubDesc->mFlags & RPCFLG_HAS_MULTI_SYNTAXES )
{
// -protocol ndr64 or -protocol all has to be robust
return RPC_S_OK;
}
if ( MIDL_VERSION_3_0_39 > pStubDesc->MIDLVersion )
{
// we don't support ROBUST in early version of MIDL
return RPC_X_BAD_STUB_DATA;
}
if ( pStubDesc->Version < NDR_VERSION_2_0 )
{
// we don't support ROBUST in early version of NDR
return RPC_X_BAD_STUB_DATA;
}
NDR_ASSERT( pMServerInfo->FmtStringOffset != NULL, "invalid format string offset" );
// there might be some interpreter mode method in this interface
//
// We are just checking the last one for performance; we don't care about mixed case (where
// midl roll back to /Os mode
// we can't check delegation case.
if ( pMServerInfo->FmtStringOffset[ProcCount-1] != 0xffff )
{
PFORMAT_STRING ProcFormat = &(pMServerInfo->ProcString[pMServerInfo->FmtStringOffset[ProcCount-1]] );
NDR_PROC_CONTEXT ProcContext;
if ( !IsObjectIntf || ( ProcFormat[1] & Oi_OBJ_USE_V2_INTERPRETER ) )
{
MulNdrpInitializeContextFromProc(XFER_SYNTAX_DCE , ProcFormat, &ProcContext , NULL , FALSE );
if (ProcContext.NdrInfo.pProcDesc->Oi2Flags.HasExtensions && ProcContext.NdrInfo.pProcDesc->NdrExts.Flags2.HasNewCorrDesc )
return RPC_S_OK;
}
}
return RPC_X_BAD_STUB_DATA;
}