122 lines
3.7 KiB
C++
122 lines
3.7 KiB
C++
|
|
// Copyright (c) 1996-1999 Microsoft Corporation
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// File: RpcCBind.cxx
|
|
//
|
|
// Contents: CRpcClientBinding, which wraps a client-side RPC
|
|
// binding handle.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include "trklib.hxx"
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Method: CRpcClientBinding::RcInitialize
|
|
//
|
|
// Synopsis: Create a binding handle to the caller-provided
|
|
// machine/protocol/endpoint. If requested, set security too.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
void
|
|
CRpcClientBinding::RcInitialize(const CMachineId &mcid,
|
|
const TCHAR *ptszRpcProtocol, const TCHAR *ptszRpcEndPoint,
|
|
RC_AUTHENTICATE auth )
|
|
{
|
|
RPC_STATUS rpcstatus;
|
|
RPC_TCHAR * ptszStringBinding;
|
|
RPC_TCHAR tszComputerName[ MAX_COMPUTERNAME_LENGTH + 1 ];
|
|
|
|
TrkAssert(!_fBound);
|
|
|
|
// Get the name of the computer to which we're binding.
|
|
|
|
mcid.GetName(tszComputerName, sizeof(tszComputerName)/sizeof(tszComputerName[0]));
|
|
|
|
// Create the binding string that encapsulates the target machine, protocol,
|
|
// and endpoint.
|
|
|
|
rpcstatus = RpcStringBindingCompose(NULL,
|
|
const_cast<TCHAR*>(ptszRpcProtocol),
|
|
tszComputerName,
|
|
const_cast<TCHAR*>(ptszRpcEndPoint),
|
|
NULL,
|
|
&ptszStringBinding);
|
|
|
|
if( rpcstatus )
|
|
{
|
|
TrkLog(( TRKDBG_ERROR, TEXT("Failed RpcStringBindingCompose %lu"), rpcstatus ));
|
|
TrkRaiseWin32Error( rpcstatus );
|
|
}
|
|
|
|
// Get a binding handle from the binding string.
|
|
|
|
rpcstatus = RpcBindingFromStringBinding(ptszStringBinding, &_BindingHandle);
|
|
RpcStringFree(&ptszStringBinding);
|
|
|
|
if( rpcstatus )
|
|
{
|
|
TrkLog(( TRKDBG_ERROR, TEXT("Failed RpcBindingFromStringBinding") ));
|
|
TrkRaiseWin32Error( rpcstatus );
|
|
}
|
|
|
|
// If necessary, set security on the binding
|
|
|
|
if( RpcSecurityEnabled() && NO_AUTHENTICATION != auth )
|
|
{
|
|
TrkAssert( PRIVACY_AUTHENTICATION == auth || INTEGRITY_AUTHENTICATION == auth );
|
|
|
|
RPC_TCHAR tszAuthName[MAX_COMPUTERNAME_LENGTH * 2 + 2 + 1]; // slash and $ and NUL
|
|
|
|
mcid.GetLocalAuthName(tszAuthName, sizeof(tszAuthName)/sizeof(tszAuthName[0]));
|
|
|
|
rpcstatus = RpcBindingSetAuthInfo(_BindingHandle,
|
|
tszAuthName,
|
|
PRIVACY_AUTHENTICATION == auth
|
|
? RPC_C_AUTHN_LEVEL_PKT_PRIVACY
|
|
: RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,
|
|
RPC_C_AUTHN_GSS_NEGOTIATE,
|
|
NULL, // AuthIdentity - current process/address space
|
|
0); // AuthzSvc - ignored for RPC_C_AUTHN_DCE_PRIVATE
|
|
|
|
if( rpcstatus )
|
|
{
|
|
TrkLog(( TRKDBG_ERROR, TEXT("Failed RpcBindingSetAuthInfo %lu"), rpcstatus ));
|
|
TrkRaiseWin32Error( rpcstatus );
|
|
}
|
|
} // if( RpcSecurityEnabled() )
|
|
|
|
_fBound = TRUE;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Method: UnInitialize
|
|
//
|
|
// Synopsis: Free a binding.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
void
|
|
CRpcClientBinding::UnInitialize()
|
|
{
|
|
if (_fBound)
|
|
{
|
|
RpcBindingFree(&_BindingHandle);
|
|
_fBound = FALSE;
|
|
}
|
|
|
|
CTrkRpcConfig::UnInitialize();
|
|
}
|
|
|