windows-nt/Source/XPSP1/NT/base/fs/rdr2/rdbss/smb.mrx/transprt.h

450 lines
14 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
transprt.h
Abstract:
This module implements all transport related functions in the SMB connection
engine
Revision History:
Balan Sethu Raman [SethuR] 6-March-1995
Notes:
--*/
#ifndef _TRANSPRT_H_
#define _TRANSPRT_H_
// The SMBCE_TRANSPORT data structure encapsulates all the information w.r.t a
// particular transport for the connection engine. All the transports that are
// of interest to the SMB mini redirector are maintained in a doubly linked list
//
// The connection engine tries all the transports in this list when trying to
// establish a connection to a server. Currently only connection oriented
// transports are handled.
typedef struct _SMBCE_TRANSPORT_ {
SMBCE_OBJECT_HEADER;
RXCE_TRANSPORT RxCeTransport;
RXCE_ADDRESS RxCeAddress;
ULONG Priority; // the priority in the binding list.
BOOLEAN Active;
// Additional information regarding quality of service and other selection
// criterion for a transport will be included here.
} SMBCE_TRANSPORT, *PSMBCE_TRANSPORT;
typedef struct _SMBCE_TRANSPORT_ARRAY_ {
ULONG ReferenceCount;
ULONG Count;
PSMBCE_TRANSPORT *SmbCeTransports;
PRXCE_ADDRESS *LocalAddresses;
} SMBCE_TRANSPORT_ARRAY, *PSMBCE_TRANSPORT_ARRAY;
typedef struct _SMBCE_TRANSPORTS_ {
RX_SPIN_LOCK Lock;
PSMBCE_TRANSPORT_ARRAY pTransportArray;
} SMBCE_TRANSPORTS, *PSMBCE_TRANSPORTS;
extern SMBCE_TRANSPORTS MRxSmbTransports;
// Transport entries are added to the list of known transports upon receipt of
// PnP notifications. Currently the list is static since transport disabling
// notifications are not handled by the underlying TDI/PnP layer.
// The following routines provide the ability for adding/deleting entries to
// this list.
extern
PSMBCE_TRANSPORT_ARRAY
SmbCeReferenceTransportArray(VOID);
extern NTSTATUS
SmbCeDereferenceTransportArray(PSMBCE_TRANSPORT_ARRAY pTransportArray);
extern NTSTATUS
SmbCeAddTransport(PSMBCE_TRANSPORT pTransport);
extern NTSTATUS
SmbCeRemoveTransport(PSMBCE_TRANSPORT pTransport);
#define SmbCeGetAvailableTransportCount() \
(MRxSmbTransports.Count)
// The connection engine maintains a reference count associated with each transport
// which indicates the number of servers that are using the transport. This will
// eventually provide the mechanism for disabling/enabling transport on receipt
// of PnP notifications.
#define SmbCeReferenceTransport(pTransport) \
SmbCepReferenceTransport(pTransport)
#define SmbCeDereferenceTransport(pTransport) \
SmbCepDereferenceTransport(pTransport)
// The server transport types encapsulate the various usages of the underlying
// transport to communicate with a server. For example the type of interactions
// with a mailslot server ( primarily datagrams ) is very different from the
// interactions with a FILE SERVER ( connection oriented send/receives). The
// type of interactions can be further classified by the underlying connection
// characterstics, e.g., connecting to a FILE_SERVER over a RAS connection as
// opposed to connecting to a file server over EtherNet.
//
// The interactions are currently classified into four types, MAILSOT, Virtual
// Circuit, Datagram and Htbrid ( VC + Datagram ).
//
// The type chosen will depend upon the characterstics of the available
// connection. Each type is associated with its own dispatch vector which
// encapsulates the interaction between the connection engine and the transport.
//
// This includes Send,Receive, Receive Ind. etc. These are modelled after the
// TDI interfaces.
typedef enum _SMBCE_SERVER_TRANSPORT_TYPE_ {
SMBCE_STT_MAILSLOT = 1,
SMBCE_STT_VC = 2,
SMBCE_STT_DATAGRAM = 4,
SMBCE_STT_HYBRID = 8
} SMBCE_SERVER_TRANSPORT_TYPE, *PSMBCE_SERVER_TRANSPORT_TYPE;
typedef struct SMBCE_SERVER_TRANSPORT {
SMBCE_OBJECT_HEADER;
struct TRANSPORT_DISPATCH_VECTOR *pDispatchVector;
struct _SMBCE_TRANSPORT_ *pTransport;
PKEVENT pRundownEvent; // used for finalization.
ULONG MaximumSendSize; // max data size
} SMBCE_SERVER_TRANSPORT, *PSMBCE_SERVER_TRANSPORT;
// The SMBCE_SERVER_TRANSPORT instances are reference counted. The following
// routines provide the referencing mechanism. Defining them as macros also
// provides us with a easy debugging capability, i.e., it can be easily modified
// to include a FILE/LINE number each time an instance is referenced and
// dereferenced
#define SmbCeReferenceServerTransport(pServerTransportPointer) \
SmbCepReferenceServerTransport(pServerTransportPointer)
#define SmbCeDereferenceServerTransport(pServerTransportPointer) \
SmbCepDereferenceServerTransport(pServerTransportPointer)
// The server transport establishment mechanism requires a callback mechanism
// to handle the asynchronous connection establishment cases.
typedef
VOID
(*PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CALLBACK)(
PVOID pContext);
typedef
VOID
(*PSMBCE_SERVER_TRANSPORT_DESTRUCTION_CALLBACK)(
PVOID pContext);
typedef enum _SMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE {
SmbCeServerTransportConstructionBegin,
SmbCeServerMailSlotTransportConstructionBegin,
SmbCeServerMailSlotTransportConstructionEnd,
SmbCeServerVcTransportConstructionBegin,
SmbCeServerVcTransportConstructionEnd,
SmbCeServerTransportConstructionEnd
} SMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE,
*PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE;
typedef struct _SMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT {
NTSTATUS Status;
SMBCE_SERVER_TRANSPORT_CONSTRUCTION_STATE State;
PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CALLBACK pCompletionRoutine;
PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext;
PKEVENT pCompletionEvent;
PSMBCEDB_SERVER_ENTRY pServerEntry;
ULONG TransportsToBeConstructed;
PSMBCE_SERVER_TRANSPORT pMailSlotTransport;
PSMBCE_SERVER_TRANSPORT pTransport;
RX_WORK_QUEUE_ITEM WorkQueueItem;
} SMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT,
*PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT;
// The SERVER transport dispatch vector prototypes
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_SEND)(
PSMBCE_SERVER_TRANSPORT pTransport,
PSMBCEDB_SERVER_ENTRY pServerEntry,
ULONG SendOptions,
PMDL pSmbMdl,
ULONG SendLength,
PVOID pSendCompletionContext);
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_SEND_DATAGRAM)(
PSMBCE_SERVER_TRANSPORT pTransport,
PSMBCEDB_SERVER_ENTRY pServerEntry,
ULONG SendOptions,
PMDL pSmbMdl,
ULONG SendLength,
PVOID pSendCompletionContext);
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_TRANCEIVE)(
PSMBCE_SERVER_TRANSPORT pTransport,
PSMBCEDB_SERVER_ENTRY pServerEntry,
PSMB_EXCHANGE pExchange,
ULONG SendOptions,
PMDL pSmbMdl,
ULONG SendLength,
PVOID pSendCompletionContext);
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_RECEIVE)(
PSMBCE_SERVER_TRANSPORT pTransport,
PSMBCEDB_SERVER_ENTRY pServerEntry,
PSMB_EXCHANGE pExchange);
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_INITIALIZE_EXCHANGE)(
PSMBCE_SERVER_TRANSPORT pTransport,
PSMB_EXCHANGE pExchange);
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_UNINITIALIZE_EXCHANGE)(
PSMBCE_SERVER_TRANSPORT pTransport,
PSMB_EXCHANGE pExchange);
typedef
VOID
(*PTRANSPORT_DISPATCH_TEARDOWN)(
PSMBCE_SERVER_TRANSPORT pTransport);
typedef
NTSTATUS
(*PTRANSPORT_DISPATCH_INITIATE_DISCONNECT)(
PSMBCE_SERVER_TRANSPORT pTransport);
typedef struct TRANSPORT_DISPATCH_VECTOR {
PTRANSPORT_DISPATCH_SEND Send;
PTRANSPORT_DISPATCH_SEND_DATAGRAM SendDatagram;
PTRANSPORT_DISPATCH_TRANCEIVE Tranceive;
PTRANSPORT_DISPATCH_RECEIVE Receive;
PRX_WORKERTHREAD_ROUTINE TimerEventHandler;
PTRANSPORT_DISPATCH_INITIALIZE_EXCHANGE InitializeExchange;
PTRANSPORT_DISPATCH_UNINITIALIZE_EXCHANGE UninitializeExchange;
PTRANSPORT_DISPATCH_TEARDOWN TearDown;
PTRANSPORT_DISPATCH_INITIATE_DISCONNECT InitiateDisconnect;
} TRANSPORT_DISPATCH_VECTOR, *PTRANSPORT_DISPATCH_VECTOR;
// A macro for invoking a routine through the SMBCE_SERVER_TRANSPORT
// dispatch vector.
#define SMBCE_TRANSPORT_DISPATCH(pServerEntry,Routine,Arguments) \
(*((pServerEntry)->pTransport->pDispatchVector->Routine))##Arguments
// The currently known transport type dispatch vectors and the mechanisms
// for instanting an instance.
extern TRANSPORT_DISPATCH_VECTOR MRxSmbVctTransportDispatch;
extern TRANSPORT_DISPATCH_VECTOR MRxSmbMsTransportDispatch;
extern NTSTATUS
MsInstantiateServerTransport(
IN OUT PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT pContext);
extern NTSTATUS
VctInstantiateServerTransport(
IN OUT PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT pContext);
extern VOID
SmbCeConstructServerTransport(
IN OUT PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CONTEXT pContext);
// The following routines constitute the interface by which the clients of
// the connection engine initialize/send/receive/uninitialize data to the
// remote servers
extern NTSTATUS
SmbCeInitializeExchangeTransport(
PSMB_EXCHANGE pExchange);
extern NTSTATUS
SmbCeUninitializeExchangeTransport(
PSMB_EXCHANGE pExchange);
extern NTSTATUS
SmbCeInitiateDisconnect(
IN OUT PSMBCEDB_SERVER_ENTRY pServerEntry);
// The routines for constructing the transports provide the flexibility to
// construct certain combination of transports. This is provided by the
// SmbCepInitializeServerTransport routine and the different flavours of
// construction routines provided
#define SMBCE_CONSTRUCT_ALL_TRANSPORTS \
(SMBCE_STT_MAILSLOT | SMBCE_STT_VC)
extern NTSTATUS
SmbCepInitializeServerTransport(
PSMBCEDB_SERVER_ENTRY pServerEntry,
PSMBCE_SERVER_TRANSPORT_CONSTRUCTION_CALLBACK pCallbackRoutine,
PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext,
ULONG TransportsToBeConsstructed);
#define SmbCeInitializeServerTransport(pServerEntry,pCallbackRoutine,pCallbackContext) \
SmbCepInitializeServerTransport( \
(pServerEntry), \
(pCallbackRoutine), \
(pCallbackContext), \
SMBCE_CONSTRUCT_ALL_TRANSPORTS)
#define SmbCeInitializeServerMailSlotTransport(pServerEntry,pCallbackRoutine,pCallbackContext) \
SmbCepInitializeServerTransport( \
(pServerEntry), \
(pCallbackRoutine), \
(pCallbackContext), \
SMBCE_STT_MAILSLOT)
extern NTSTATUS
SmbCeUninitializeServerTransport(
PSMBCEDB_SERVER_ENTRY pServerEntry,
PSMBCE_SERVER_TRANSPORT_DESTRUCTION_CALLBACK pCallbackRoutine,
PVOID pCallbackContext);
extern VOID
SmbCeCompleteUninitializeServerTransport(
PSMBCEDB_SERVER_ENTRY pServerEntry);
extern NTSTATUS
SmbCepReferenceTransport(
IN OUT PSMBCE_TRANSPORT pTransport);
extern NTSTATUS
SmbCepDereferenceTransport(
IN OUT PSMBCE_TRANSPORT pTransport);
extern PSMBCE_TRANSPORT
SmbCeFindTransport(
PUNICODE_STRING pTransportName);
extern NTSTATUS
SmbCepReferenceServerTransport(
IN OUT PSMBCE_SERVER_TRANSPORT *pTransportPointer);
extern NTSTATUS
SmbCepDereferenceServerTransport(
IN OUT PSMBCE_SERVER_TRANSPORT *pTransportPointer);
extern PFILE_OBJECT
SmbCepReferenceEndpointFileObject(
IN PSMBCE_SERVER_TRANSPORT pTransport);
extern NTSTATUS
SmbCeSend(
PSMB_EXCHANGE pExchange,
ULONG SendOptions,
PMDL pSmbMdl,
ULONG SendLength);
extern NTSTATUS
SmbCeSendToServer(
PSMBCEDB_SERVER_ENTRY pServerEntry,
ULONG SendOptions,
PMDL pSmbMdl,
ULONG SendLength);
extern NTSTATUS
SmbCeSendDatagram(
PSMB_EXCHANGE pExchange,
ULONG SendOptions,
PMDL pSmbMdl,
ULONG SendLength);
extern NTSTATUS
SmbCeTranceive(
PSMB_EXCHANGE pExchange,
ULONG SendOptions,
PMDL pRxCeDataBuffer,
ULONG SendLength);
extern NTSTATUS
SmbCeReceive(
PSMB_EXCHANGE pExchange);
//
// Call ups from the transport to the connection engine
//
extern NTSTATUS
SmbCeReceiveInd(
IN PSMBCEDB_SERVER_ENTRY pServerEntry,
IN ULONG BytesIndicated,
IN ULONG BytesAvailable,
OUT ULONG *pBytesTaken,
IN PVOID pTsdu, // pointer describing this TSDU, typically a lump of bytes
OUT PMDL *pDataBufferPointer, // the buffer in which data is to be copied.
OUT PULONG pDataBufferSize, // amount of data to copy
IN ULONG ReceiveFlags
);
extern NTSTATUS
SmbCeDataReadyInd(
IN PSMBCEDB_SERVER_ENTRY pServerEntry,
IN PMDL pBuffer,
IN ULONG DataSize,
IN NTSTATUS DataReadyStatus
);
extern NTSTATUS
SmbCeErrorInd(
IN PSMBCEDB_SERVER_ENTRY pServerEntry,
IN NTSTATUS IndicatedStatus
);
extern NTSTATUS
SmbCeSendCompleteInd(
IN PSMBCEDB_SERVER_ENTRY pServerEntry,
IN PVOID pCompletionContext,
IN NTSTATUS SendCompletionStatus
);
extern VOID
MRxSmbLogTransportError(
PUNICODE_STRING pTransportName,
PUNICODE_STRING pDomainName,
NTSTATUS Status,
ULONG Id);
#endif // _TRANSPRT_H_