450 lines
14 KiB
C
450 lines
14 KiB
C
/*++
|
||
|
||
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_
|
||
|
||
|