/*++ 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 #ifdef NTENV #include #endif #include #include #ifdef NTENV #include #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); }