windows-nt/Source/XPSP1/NT/base/fs/rdr2/rdbss/proxy.mrx/srvcall.c
2020-09-26 16:20:57 +08:00

177 lines
4.5 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++ 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;
}