159 lines
3.9 KiB
C++
159 lines
3.9 KiB
C++
/********************************************************************
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
sfprpcs.cpp
|
|
|
|
Abstract:
|
|
implements server rpc thread - exported in SFPSAPI.LIB
|
|
server shutdown - exported in SFPSAPI.LIB
|
|
|
|
Revision History:
|
|
|
|
Brijesh Krishnaswami (brijeshk) - 06/16/99 - Created
|
|
|
|
********************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "srrpc.h" // header file generated by MIDL compiler
|
|
#include "srdefs.h"
|
|
#include "utils.h"
|
|
#include <dbgtrace.h>
|
|
|
|
#ifdef THIS_FILE
|
|
#undef THIS_FILE
|
|
#endif
|
|
static char __szTraceSourceFile[] = __FILE__;
|
|
#define THIS_FILE __szTraceSourceFile
|
|
|
|
|
|
#define MIN_RPC_CALLS 1
|
|
#define MAX_RPC_CALLS 5
|
|
|
|
|
|
RPC_STATUS RPC_ENTRY SecurityCallBack (RPC_IF_HANDLE hInterface,
|
|
handle_t hBinding)
|
|
{
|
|
RPC_STATUS status = RPC_S_OK;
|
|
UINT fLocal = FALSE;
|
|
RPC_AUTHZ_HANDLE hPrivs;
|
|
DWORD dwAuthn;
|
|
|
|
status = I_RpcBindingIsClientLocal (hBinding, &fLocal);
|
|
if (status != RPC_S_OK || fLocal == FALSE)
|
|
{
|
|
status = ERROR_ACCESS_DENIED;
|
|
goto done;
|
|
}
|
|
|
|
status = RpcBindingInqAuthClient (hBinding,
|
|
&hPrivs,
|
|
NULL,
|
|
&dwAuthn,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (status != RPC_S_OK || dwAuthn < RPC_C_AUTHN_LEVEL_PKT_INTEGRITY)
|
|
{
|
|
status = ERROR_ACCESS_DENIED;
|
|
goto done;
|
|
}
|
|
|
|
done:
|
|
return status;
|
|
}
|
|
|
|
// RPC Server
|
|
// registers as an rpc server and waits for requests
|
|
|
|
extern "C" DWORD WINAPI
|
|
RpcServerStart()
|
|
{
|
|
RPC_STATUS status;
|
|
|
|
TENTER("RpcServerStart");
|
|
|
|
status = RpcServerRegisterAuthInfo(L"NT AUTHORITY\\SYSTEM",
|
|
RPC_C_AUTHN_WINNT,
|
|
0,
|
|
0);
|
|
|
|
if (status != RPC_S_OK)
|
|
{
|
|
TRACE(0, "! RpcServerRegisterAuthInfo : %ld", status);
|
|
goto exit;
|
|
}
|
|
|
|
// specify to use the local rpc protocol sequence
|
|
status = RpcServerUseProtseqEp(s_cszRPCProtocol,
|
|
MAX_RPC_CALLS,
|
|
s_cszRPCEndPoint,
|
|
NULL); // Security descriptor
|
|
if (status != 0 && status != RPC_S_DUPLICATE_ENDPOINT)
|
|
{
|
|
TRACE(0, "! RpcServerUseProtseqEp : %ld", status);
|
|
goto exit;
|
|
}
|
|
|
|
// register the srrpc interface
|
|
status = RpcServerRegisterIfEx(srrpc_ServerIfHandle, // interface to register
|
|
NULL, // MgrTypeUuid
|
|
NULL, // MgrEpv; null means use default
|
|
RPC_IF_AUTOLISTEN | // auto-listen interface
|
|
RPC_IF_ALLOW_SECURE_ONLY,
|
|
MAX_RPC_CALLS, // max concurrent calls
|
|
SecurityCallBack); // callback
|
|
if (status)
|
|
{
|
|
TRACE(0, "! RpcServerRegisterIfEx : %ld", status);
|
|
goto exit;
|
|
}
|
|
|
|
TRACE(0, "Started to listen to RPC calls");
|
|
|
|
exit:
|
|
TLEAVE();
|
|
return status;
|
|
}
|
|
|
|
|
|
// function to shut down the rpc server
|
|
|
|
extern "C" DWORD WINAPI
|
|
RpcServerShutdown()
|
|
{
|
|
RPC_STATUS status;
|
|
|
|
TENTER("RpcServerShutdown");
|
|
|
|
// unregister the server endpoint
|
|
status = RpcServerUnregisterIf(srrpc_ServerIfHandle, NULL, TRUE);
|
|
if (status)
|
|
{
|
|
TRACE(0, "! RpcServerUnregisterIf : %ld", status);
|
|
goto exit;
|
|
}
|
|
|
|
exit:
|
|
TLEAVE();
|
|
return status;
|
|
}
|
|
|
|
|
|
|
|
// functions used by midl compiler to allocate and free memory
|
|
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
|
|
{
|
|
return(SRMemAlloc((DWORD) len));
|
|
}
|
|
|
|
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
|
|
{
|
|
SRMemFree(ptr);
|
|
}
|
|
|
|
|
|
|