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.
81 lines
2.0 KiB
81 lines
2.0 KiB
/********************************************************************/
|
|
/** Copyright(c) 1989 Microsoft Corporation. **/
|
|
/********************************************************************/
|
|
|
|
//***
|
|
//
|
|
// Filename: rpcutil.c
|
|
//
|
|
// Description: Contains RPC utiliry routines.
|
|
//
|
|
// History:
|
|
// May 11,1992. NarenG Created original version.
|
|
//
|
|
#include "client.h"
|
|
|
|
|
|
//**
|
|
//
|
|
// Call: AfpRPCBind
|
|
//
|
|
// Returns: NO_ERROR - success
|
|
// ERROR_NOT_ENOUGH_MEMORY
|
|
// AFPERR_InvalidComputername
|
|
// non-sero returns from RPC calls.
|
|
//
|
|
// Description: This routine is called when it is necessary to bind to a server.
|
|
// The binding is done to allow impersonation by the server since
|
|
// that is necessary for the API calls.
|
|
//
|
|
DWORD
|
|
AfpRPCBind(
|
|
IN LPWSTR lpwsServerName,
|
|
OUT PAFP_SERVER_HANDLE phAfpServer
|
|
)
|
|
{
|
|
RPC_STATUS RpcStatus;
|
|
LPWSTR lpwsStringBinding;
|
|
LPWSTR lpwsEndpoint;
|
|
|
|
// We need to concatenate \pipe\ to the front of the service
|
|
// name.
|
|
//
|
|
lpwsEndpoint = (LPWSTR)LocalAlloc( 0, sizeof(NT_PIPE_PREFIX) +
|
|
((STRLEN(AFP_SERVICE_NAME)+1)*sizeof(WCHAR)));
|
|
if ( lpwsEndpoint == NULL)
|
|
return( ERROR_NOT_ENOUGH_MEMORY );
|
|
|
|
STRCPY( lpwsEndpoint, NT_PIPE_PREFIX );
|
|
STRCAT( lpwsEndpoint, AFP_SERVICE_NAME );
|
|
|
|
RpcStatus = RpcStringBindingCompose(
|
|
NULL,
|
|
TEXT("ncacn_np"),
|
|
lpwsServerName,
|
|
lpwsEndpoint,
|
|
TEXT("Security=Impersonation Static True"),
|
|
&lpwsStringBinding);
|
|
LocalFree( lpwsEndpoint );
|
|
|
|
if ( RpcStatus != RPC_S_OK )
|
|
return( I_RpcMapWin32Status( RpcStatus ) );
|
|
|
|
RpcStatus = RpcBindingFromStringBinding( lpwsStringBinding,
|
|
(handle_t *)phAfpServer );
|
|
|
|
RpcStringFree( &lpwsStringBinding );
|
|
|
|
if ( RpcStatus != RPC_S_OK ) {
|
|
|
|
if ( ( RpcStatus == RPC_S_INVALID_ENDPOINT_FORMAT )
|
|
||
|
|
( RpcStatus == RPC_S_INVALID_NET_ADDR ) )
|
|
|
|
return( (DWORD)AFPERR_InvalidComputername );
|
|
else
|
|
return( I_RpcMapWin32Status( RpcStatus ) );
|
|
|
|
}
|
|
|
|
return( NO_ERROR );
|
|
}
|