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_
|
|||
|
|
|||
|
|