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