windows-nt/Source/XPSP1/NT/com/rpc/locator/client/sbind.cxx

154 lines
3.1 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (C) Microsoft Corporation, 1992 - 1999
Module Name:
sbind.cxx
Abstract:
This is the server side NSI service support layer. These functions
provide for binding to the locator.
Author:
Steven Zeck (stevez) 03/04/92
--*/
#define NSI_ASCII
#define RegistryIsWorking
#include <nsi.h>
#ifdef NTENV
#include <windows.h>
#endif
#include <winreg.h>
#include <string.h>
#ifdef NTENV
#include <startsvc.h>
#endif
RPC_BINDING_HANDLE NsiSvrBinding; // global binding handle to locator
// *** The following functions are used to RPC to the locator *** ///
RPC_STATUS RPC_ENTRY
I_NsServerBindSearch (
)
/*++
Routine Description:
Servers keep their RPC binding open until they terminate.
Returns:
RPC_S_OK, RPC_S_CALL_FAILED_DNE, RpcStringBindingCompose(),
RpcBindingFromStringBinding()
--*/
{
RPC_STATUS status;
long statusTmp;
static RPC_BINDING_HANDLE NsiSvrBindingExport;
unsigned char * StringBinding;
HKEY RegHandle;
unsigned char *ProtoSeq;
unsigned char *NetworkAddress;
unsigned char *Endpoint;
RequestGlobalMutex();
if (NsiSvrBinding = NsiSvrBindingExport)
{
ClearGlobalMutex();
return(RPC_S_OK);
}
#ifndef RegistryIsWorking
ProtoSeq = (unsigned char *)"ncacn_np";
NetworkAddress = 0;
Endpoint = (unsigned char *)"\\pipe\\locator";
DefaultSyntax = 1;
status = RpcStringBindingCompose(0, ProtoSeq,
NetworkAddress, Endpoint, 0, &StringBinding);
#else
// We store the binding information on the name service in
// the registry. Get the information into BindingHandle.
#ifdef NTENV
statusTmp = RegOpenKeyEx(RPC_REG_ROOT, REG_NSI, 0L, KEY_READ,
(PHKEY) &RegHandle);
#else
statusTmp = RegOpenKey(RPC_REG_ROOT, REG_NSI, (PHKEY) &RegHandle);
#endif
if (statusTmp)
{
ClearGlobalMutex();
return(RPC_S_CALL_FAILED_DNE);
}
GetDefaultEntrys((void *) RegHandle);
ProtoSeq = RegGetString((void *) RegHandle, "Protocol");
NetworkAddress = RegGetString((void *) RegHandle, "ServerNetWorkAddress");
Endpoint = RegGetString((void *) RegHandle, "Endpoint");
status = RpcStringBindingCompose(0, ProtoSeq,
NetworkAddress, Endpoint, 0, &StringBinding);
#ifdef NTENV
if ( (NetworkAddress == NULL)
|| (NetworkAddress[0] == '\0')
|| (strcmp ((char *)NetworkAddress, "\\\\.") == 0)
)
{
//We are binding to the local locator..
//lets start the local locator if not already started
StartServiceIfNecessary();
}
#endif
delete ProtoSeq;
delete NetworkAddress;
delete Endpoint;
statusTmp = RegCloseKey(RegHandle);
ASSERT(!statusTmp);
#endif
if (status)
{
ClearGlobalMutex();
return(status);
}
status = RpcBindingFromStringBinding(StringBinding, &NsiSvrBinding);
if (status == RPC_S_OK)
NsiSvrBindingExport = NsiSvrBinding;
statusTmp = RpcStringFree(&StringBinding);
ASSERT(!statusTmp);
ClearGlobalMutex();
return (status);
}