207 lines
4.2 KiB
C
207 lines
4.2 KiB
C
|
/*++
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|