/******************************************************************** 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 #include #include #include "srrpc.h" // header file generated by MIDL compiler #include "srdefs.h" #include "utils.h" #include #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); }