|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
rpcserv.c
Abstract:
This module contains the RPC server startup and shutdown code.
Author:
abhisheV 30-September-1999
Environment:
User Level: Win32
Revision History:
--*/
#include "precomp.h"
DWORD SPDStartRPCServer( ) { DWORD dwStatus = 0; WCHAR * pszPrincipalName = NULL;
dwStatus = RpcServerUseProtseqEp( L"ncacn_np", 10, L"\\pipe\\ipsec", NULL );
if (dwStatus) { if (dwStatus != RPC_S_DUPLICATE_ENDPOINT) { return (dwStatus); } }
dwStatus = RpcServerUseProtseqEp( L"ncalrpc", 10, L"ipsec", NULL );
if (dwStatus) { if (dwStatus != RPC_S_DUPLICATE_ENDPOINT) { return (dwStatus); } }
dwStatus = RpcServerRegisterIf( winipsec_ServerIfHandle, 0, 0 );
if (dwStatus) { return (dwStatus); }
dwStatus = RpcServerRegisterAuthInfo( 0, RPC_C_AUTHN_WINNT, 0, 0 ); if (dwStatus) { (VOID) RpcServerUnregisterIfEx( winipsec_ServerIfHandle, 0, 0 ); return (dwStatus); }
dwStatus = RpcServerInqDefaultPrincNameW( RPC_C_AUTHN_GSS_KERBEROS, &pszPrincipalName ); if (dwStatus == RPC_S_INVALID_AUTH_IDENTITY) { dwStatus = ERROR_SUCCESS; pszPrincipalName = NULL; }
if (dwStatus) { (VOID) RpcServerUnregisterIfEx( winipsec_ServerIfHandle, 0, 0 ); return (dwStatus); }
dwStatus = RpcServerRegisterAuthInfo( pszPrincipalName, RPC_C_AUTHN_GSS_KERBEROS, 0, 0 ); if (dwStatus) { (VOID) RpcServerUnregisterIfEx( winipsec_ServerIfHandle, 0, 0 ); RpcStringFree(&pszPrincipalName); return (dwStatus); }
dwStatus = RpcServerRegisterAuthInfo( pszPrincipalName, RPC_C_AUTHN_GSS_NEGOTIATE, 0, 0 ); if (dwStatus) { (VOID) RpcServerUnregisterIfEx( winipsec_ServerIfHandle, 0, 0 ); RpcStringFree(&pszPrincipalName); return (dwStatus); }
RpcStringFree(&pszPrincipalName);
#if !defined(__IN_LSASS__)
EnterCriticalSection(&gcServerListenSection);
gdwServersListening++;
if (gdwServersListening == 1) {
dwStatus = RpcServerListen( 3, RPC_C_LISTEN_MAX_CALLS_DEFAULT, TRUE );
if (dwStatus) { LeaveCriticalSection(&gcServerListenSection); (VOID) RpcServerUnregisterIfEx( winipsec_ServerIfHandle, 0, 0 ); return (dwStatus); }
}
LeaveCriticalSection(&gcServerListenSection);
#endif
gbSPDRPCServerUp = TRUE; return (dwStatus); }
DWORD SPDStopRPCServer( ) {
DWORD dwStatus = 0;
dwStatus = RpcServerUnregisterIfEx( winipsec_ServerIfHandle, 0, 0 ); #if !defined(__IN_LSASS__)
EnterCriticalSection(&gcServerListenSection);
gdwServersListening--;
if (gdwServersListening == 0) { RpcMgmtStopServerListening(0); }
LeaveCriticalSection(&gcServerListenSection);
#endif
return (dwStatus); }
|