177 lines
4.5 KiB
C
177 lines
4.5 KiB
C
|
/*++ 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;
|
|||
|
}
|
|||
|
|
|||
|
|