/*++ BUILD Version: 0009 // Increment this if a change has global effects Copyright (c) 1987-1993 Microsoft Corporation Module Name: srvcall.c Abstract: This module implements the routines for handling the creation/manipulation of server entries in the connection engine database. It also contains the routines for parsing the negotiate response from the server. Author: Balan Sethu Raman (SethuR) 06-Mar-95 Created --*/ #include "precomp.h" #pragma hdrstop RXDT_DefineCategory(SRVCALL); #define Dbg (DEBUG_TRACE_SRVCALL) NTSTATUS MRxProxyCreateSrvCall( PMRX_SRV_CALL pSrvCall, PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext) /*++ Routine Description: This routine just rejects any MRxCreateSrvCalls that come down. Arguments: RxContext - Supplies the context of the original create/ioctl CallBackContext - the call back context in RDBSS for continuation. Return Value: RXSTATUS - The return status for the operation Notes: --*/ { PMRX_SRVCALL_CALLBACK_CONTEXT SCCBC = pCallbackContext; PMRX_SRVCALLDOWN_STRUCTURE SrvCalldownStructure = (PMRX_SRVCALLDOWN_STRUCTURE)(pCallbackContext->SrvCalldownStructure); ASSERT( pSrvCall ); ASSERT( NodeType(pSrvCall) == RDBSS_NTC_SRVCALL ); SCCBC->Status = (STATUS_BAD_NETWORK_PATH); SrvCalldownStructure->CallBack(SCCBC); return STATUS_PENDING; } NTSTATUS MRxProxyFinalizeSrvCall( PMRX_SRV_CALL pSrvCall, BOOLEAN Force) /*++ Routine Description: This routine destroys a given server call instance Arguments: pSrvCall - the server call instance to be disconnected. Force - TRUE if a disconnection is to be enforced immediately. Return Value: RXSTATUS - The return status for the operation --*/ { NTSTATUS Status = STATUS_SUCCESS; #if 0 PPROXYCEDB_SERVER_ENTRY pServerEntry; pServerEntry = ProxyCeGetAssociatedServerEntry(pSrvCall); if (pServerEntry != NULL) { ProxyCeAcquireResource(); ASSERT(pServerEntry->pRdbssSrvCall == pSrvCall); pServerEntry->pRdbssSrvCall = NULL; ProxyCeDereferenceServerEntry(pServerEntry); ProxyCeReleaseResource(); } #endif //0 pSrvCall->Context = NULL; return Status; } NTSTATUS MRxProxySrvCallWinnerNotify( IN PMRX_SRV_CALL pSrvCall, IN BOOLEAN ThisMinirdrIsTheWinner, IN OUT PVOID pSrvCallContext) /*++ Routine Description: This routine finalizes the mini rdr context associated with an RDBSS Server call instance Arguments: pSrvCall - the Server Call ThisMinirdrIsTheWinner - TRUE if this mini rdr is the choosen one. pSrvCallContext - the server call context created by the mini redirector. Return Value: RXSTATUS - The return status for the operation Notes: The two phase construction protocol for Server calls is required because of parallel initiation of a number of mini redirectors. The RDBSS finalizes the particular mini redirector to be used in communicating with a given server based on quality of service criterion. --*/ { NTSTATUS Status = STATUS_SUCCESS; //PPROXYCEDB_SERVER_ENTRY pServerEntry; //pServerEntry = (PPROXYCEDB_SERVER_ENTRY)pSrvCallContext; #if 0 if (!ThisMinirdrIsTheWinner) { // Some other mini rdr has been choosen to connect to the server. Destroy // the data structures created for this mini redirector. ProxyCeUpdateServerEntryState(pServerEntry,PROXYCEDB_MARKED_FOR_DELETION); ProxyCeDereferenceServerEntry(pServerEntry); } else { pSrvCall->Context = pServerEntry; pSrvCall->Flags |= SRVCALL_FLAG_CASE_INSENSITIVE_NETROOTS | SRVCALL_FLAG_CASE_INSENSITIVE_FILENAMES; //check for loopback.....BUGBUG.ALA.RDR1 //since servers now respond to multiple names.....this doesn't really cut it.... { UNICODE_STRING ServerName; BOOLEAN CaseInsensitive = TRUE; ASSERT (pServerEntry->pRdbssSrvCall == pSrvCall); //DbgPrint("ServerName is %wZ\n", pSrvCall->pSrvCallName); //DbgPrint("ComputerName is %wZ\n", &ProxyCeContext.ComputerName); ServerName = *pSrvCall->pSrvCallName; ServerName.Buffer++; ServerName.Length -= sizeof(WCHAR); if (RtlEqualUnicodeString(&ServerName,&ProxyCeContext.ComputerName,CaseInsensitive)) { //DbgPrint("LOOPBACK!!!!!\n"); pServerEntry->Server.IsLoopBack = TRUE; } } } #endif //0 return STATUS_SUCCESS; }