windows-nt/Source/XPSP1/NT/ds/security/protocols/kerberos/server/rpcif.cxx

270 lines
6.3 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-----------------------------------------------------------------------
//
// File: RPCIF.CXX
//
// Contents: RPC Interface specific functions
//
//
// History: 23 Feb 92 RichardW Created
//
// BUG 453652: Socket errors are tranlated to STATUS_OBJECT_NAME_NOT_FOUND
//
//------------------------------------------------------------------------
#include "kdcsvr.hxx"
#include "rpcif.h"
extern "C" {
#include <kdcdbg.h>
}
////////////////////////////////////////////////////////////////////
//
// Name: RET_IF_ERROR
//
// Synopsis: Evaluates an expression, returns from the caller if error.
//
// Arguments: l - Error level to print error message at.
// e - expression to evaluate
//
// NOTE: THIS MACRO WILL RETURN FROM THE CALLING FUNCTION ON ERROR!!!!
//
// This will execute the expression (e), and check the return code. If the
// return code indicates a failure, it prints an error message and returns
// from the calling function.
//
#define RET_IF_ERROR(l,e) \
{ ULONG X_hr_XX__=(e) ; \
if (X_hr_XX__ != ERROR_SUCCESS) { \
DebugLog(( (l), (sizeof( #e ) > MAX_EXPR_LEN)? \
"%s(%d):\n\t %.*s ... == %d\n" \
: \
"%s(%d):\n\t %.*s == %d\n" \
, __FILE__, __LINE__, MAX_EXPR_LEN, #e, X_hr_XX__ )); \
return(I_RpcMapWin32Status(X_hr_XX__)); \
} \
}
////////////////////////////////////////////////////////////////////
//
// Name: WARN_IF_ERROR
//
// Synopsis: Evaluates an expression, prints warning if error.
//
// Arguments: l - Error level to print warning at.
// e - expression to evaluate
//
// Notes: This calls DebugLog(()) to print. In retail, it just
// evaluates the expression.
//
#if DBG
#define WARN_IF_ERROR(l,e) \
{ ULONG X_hr_XX__=(e) ; \
if (X_hr_XX__ != ERROR_SUCCESS) { \
DebugLog(( (l), (sizeof( #e ) > MAX_EXPR_LEN)? \
"%s(%d):\n\t %.*s ... == %d\n" \
: \
"%s(%d):\n\t %.*s == %d\n" \
, __FILE__, __LINE__, MAX_EXPR_LEN, #e, X_hr_XX__ )); \
} \
}
#else
#define WARN_IF_ERROR(l,e) (e)
#endif
//+-------------------------------------------------------------------------
//
// Function: StartAllProtSeqs
//
// Synopsis: Checks which protocols are running and then starts those
// protocols for the three KDC interfaces: kdc, locator, privilege
// server. It will, if USE_SECURE_RPC is defined, establish
// credentials for the KDC.. Does not register interfaces.
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
HRESULT
StartAllProtSeqs()
{
TRACE(KDC, StartAllProtSeqs, DEB_FUNCTION);
ULONG i;
// Use all but ncacn_np. We'd like not to use LRPC as well, but
// first spmgr and the security packages would have to be
// changed. So, we live with it.
DWORD dwErr;
dwErr = RpcServerUseProtseq(L"ncalrpc",
MAX_CONCURRENT_CALLS,
0);
if(dwErr)
{
DebugLog((DEB_ERROR, "UseProtseq failed %ws %d\n",
L"ncalrpc", dwErr));
}
dwErr = RpcServerUseProtseq(L"ncacn_ip_tcp",
MAX_CONCURRENT_CALLS,
0);
if(dwErr)
{
DebugLog((DEB_ERROR, "UseProtseq failed %ws %d\n",
L"ncalrpc", dwErr));
}
return(STATUS_SUCCESS);
}
//+-------------------------------------------------------------------------
//
// Function: RegsiterKdcEps
//
// Synopsis: Registers Eps for the KDC and locator interfaces
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
HRESULT
RegisterKdcEps()
{
TRACE(KDC, RegisterKdcEps, DEB_FUNCTION);
RPC_BINDING_VECTOR * ppvVector;
RET_IF_ERROR(DEB_ERROR, RpcServerInqBindings(&ppvVector));
RET_IF_ERROR(DEB_ERROR, RpcEpRegister(KdcDebug_ServerIfHandle, ppvVector, 0, L"")) ;
RET_IF_ERROR(DEB_ERROR, RpcServerRegisterIf(KdcDebug_ServerIfHandle, 0, 0)) ;
RpcBindingVectorFree(&ppvVector);
return(STATUS_SUCCESS);
}
//+-------------------------------------------------------------------------
//
// Function: UnRegsiterKdcEps
//
// Synopsis: UnRegisters Eps for the KDC and locator interfaces
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
HRESULT
UnRegisterKdcEps()
{
TRACE(KDC, RegisterKdcEps, DEB_FUNCTION);
RPC_BINDING_VECTOR * ppvVector;
RET_IF_ERROR(DEB_ERROR, RpcServerInqBindings(&ppvVector));
WARN_IF_ERROR(DEB_ERROR, RpcServerUnregisterIf(KdcDebug_ServerIfHandle, 0, 0)) ;
RpcBindingVectorFree(&ppvVector);
return(STATUS_SUCCESS);
}
void *
MIDL_user_allocate(size_t size)
{
// TRACE(KDC, MIDL_user_allocate, DEB_FUNCTION);
PVOID pvMem;
//
// The ASN.1 marshalling code may allocate odd sizes that can't be
// encrypted with a block cipher. By rounding up the size to 8 we can
// handle block sizes up to 8 bytes.
//
pvMem = RtlAllocateHeap(
RtlProcessHeap(),
0,
ROUND_UP_COUNT(size,8)
);
if ( pvMem == NULL )
{
DebugLog((DEB_ERROR, "MIDL allocate failed\n"));
}
else
{
RtlZeroMemory(pvMem, ROUND_UP_COUNT(size,8));
}
return(pvMem);
}
void
MIDL_user_free(void * ptr)
{
// TRACE(KDC, MIDL_user_free, DEB_FUNCTION);
RtlFreeHeap(RtlProcessHeap(),0, ptr);
}
extern "C"
void
KdcFreeMemory(void * ptr)
{
KdcFreeEncodedData(ptr);
}