390 lines
13 KiB
C
390 lines
13 KiB
C
/*++ BUILD Version: 0009 // Increment this if a change has global effects
|
|
Copyright (c) 1987-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
rxce.h
|
|
|
|
Abstract:
|
|
|
|
This is the include file that defines all constants and types for
|
|
accessing the redirector file system connection engine.
|
|
|
|
Revision History:
|
|
|
|
Balan Sethu Raman (SethuR) 06-Feb-95 Created
|
|
|
|
Notes:
|
|
|
|
The Connection engine is designed to map and emulate the TDI specs. as closely
|
|
as possible. This implies that on NT we will have a very efficient mechanism
|
|
which fully exploits the underlying TDI implementation.
|
|
|
|
There are four important data structures that are created/manipulated by the
|
|
various functions associated with the connection engine. Thesr are
|
|
RXCE_TRANSPORT,RXCE_ADDRESS,RXCE_CONNECTION and RXCE_VC.
|
|
|
|
The mini redirector writers can embed these data structures in the corresponding
|
|
definitions and invoke the two routines provided for each type to build and
|
|
tear down the connection engine portions. These routines do not allocate/free
|
|
the memory associated with these instances. This provides a flexible mechanism
|
|
for the mini redirector writers to manage instances.
|
|
|
|
--*/
|
|
|
|
#ifndef _RXCE_H_
|
|
#define _RXCE_H_
|
|
|
|
#include <nodetype.h>
|
|
#include <rxcehdlr.h> // TDI related definitions.
|
|
#include <rxworkq.h>
|
|
//
|
|
// The connection engine deals with three kinds of entities, transports, transport
|
|
// addresses and transport connections. The transports are bindings to the various
|
|
// transport service providers on any system. The transport addresses are the
|
|
// local connection end points. The connections are transport connections between
|
|
// endpoints. Each connection encapsulates a number of virtual circuits
|
|
// ( typically 1 ).
|
|
//
|
|
|
|
// All the four node types are tagged with the following signature which is used
|
|
// extensively in validating them
|
|
|
|
typedef struct _RXCE_SIGNATURE_ {
|
|
union {
|
|
struct {
|
|
USHORT Type;
|
|
CSHORT Size;
|
|
};
|
|
|
|
ULONG Signature;
|
|
};
|
|
} RXCE_SIGNATURE, *PRXCE_SIGNATURE;
|
|
|
|
//
|
|
// RXCE_TRANSPORT encapsulates all the parameters w.r.t. a TRANSPORT
|
|
// as regards the connection engine.
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
typedef struct _RXCE_TRANSPORT_ : public RXCE_SIGNATURE {
|
|
#else // !__cplusplus
|
|
typedef struct _RXCE_TRANSPORT_ {
|
|
RXCE_SIGNATURE;
|
|
#endif // __cplusplus
|
|
|
|
UNICODE_STRING Name;
|
|
|
|
PDEVICE_OBJECT pDeviceObject; // Device object for transport
|
|
HANDLE ControlChannel; // Control Channel
|
|
PFILE_OBJECT pControlChannelFileObject; // File object for the control channel
|
|
|
|
PRXCE_TRANSPORT_PROVIDER_INFO pProviderInfo; // Transport Provider Information.
|
|
|
|
LONG ConnectionCount; // Number of connections on xport.
|
|
LONG VirtualCircuitCount; // no. of connections
|
|
ULONG QualityOfService; // quality of service provided.
|
|
} RXCE_TRANSPORT;
|
|
|
|
#define RXCE_TRANSPORT_SIGNATURE ((sizeof(RXCE_TRANSPORT) << 16) | RDBSS_NTC_RXCE_TRANSPORT)
|
|
|
|
#define RxCeIsTransportValid(pTransport) \
|
|
((pTransport)->Signature == RXCE_TRANSPORT_SIGNATURE)
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeBuildTransport(
|
|
IN PRXCE_TRANSPORT pRxCeTransport,
|
|
IN PUNICODE_STRING pTransportName,
|
|
IN ULONG QualityOfService);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeTearDownTransport(
|
|
IN PRXCE_TRANSPORT pTransport);
|
|
|
|
extern NTSTATUS
|
|
RxCeQueryAdapterStatus(
|
|
PRXCE_TRANSPORT pTransport,
|
|
struct _ADAPTER_STATUS *pAdapterStatus);
|
|
|
|
extern NTSTATUS
|
|
RxCeQueryTransportInformation(
|
|
PRXCE_TRANSPORT pTransport,
|
|
PRXCE_TRANSPORT_INFORMATION pTransportInformation);
|
|
|
|
//
|
|
// RXCE_ADDRESS encapsulates all the parameters w.r.t. a local transport address
|
|
// as regards the connection engine.
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
typedef struct _RXCE_ADDRESS_ : public RXCE_SIGNATURE {
|
|
#else // !__cplusplus
|
|
typedef struct _RXCE_ADDRESS_ {
|
|
RXCE_SIGNATURE;
|
|
#endif // __cplusplus
|
|
|
|
PRXCE_TRANSPORT pTransport; // the transport handle
|
|
PTRANSPORT_ADDRESS pTransportAddress; // the transport address
|
|
PVOID pContext; // the context used in event dispatch
|
|
PRXCE_ADDRESS_EVENT_HANDLER pHandler; // the address event handler
|
|
PMDL pReceiveMdl; // the MDL for handling Receives Supplied by client
|
|
HANDLE hAddress; // handle to the address object
|
|
PFILE_OBJECT pFileObject; // the file object for the address
|
|
LONG ConnectionCount; // no. of connections
|
|
LONG VirtualCircuitCount; // no. of vcs
|
|
} RXCE_ADDRESS;
|
|
|
|
#define RXCE_ADDRESS_SIGNATURE ((sizeof(RXCE_ADDRESS) << 16) | RDBSS_NTC_RXCE_ADDRESS)
|
|
|
|
#define RxCeIsAddressValid(pAddress) \
|
|
((pAddress)->Signature == RXCE_ADDRESS_SIGNATURE)
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeBuildAddress(
|
|
IN OUT PRXCE_ADDRESS pAddress,
|
|
IN PRXCE_TRANSPORT pTransport,
|
|
IN PTRANSPORT_ADDRESS pTransportAddress,
|
|
IN PRXCE_ADDRESS_EVENT_HANDLER pHandler,
|
|
IN PVOID pEventContext);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeTearDownAddress(
|
|
IN PRXCE_ADDRESS pAddress);
|
|
|
|
//
|
|
// RxCe Connection Establishment methods ....
|
|
//
|
|
//
|
|
// RXCE_CONNECTION encapsulates all the information w.r.t. a connection
|
|
// as regards the connection engine.
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
typedef struct _RXCE_CONNECTION_ : public RXCE_SIGNATURE {
|
|
#else // !__cplusplus
|
|
typedef struct _RXCE_CONNECTION_ {
|
|
RXCE_SIGNATURE;
|
|
#endif // __cplusplus
|
|
|
|
PRXCE_ADDRESS pAddress; // the local address for this connection
|
|
ULONG VirtualCircuitCount; // the number of virtual circuits associated with the connection
|
|
PVOID pContext; // the context used in event dispatch
|
|
PRXCE_CONNECTION_EVENT_HANDLER pHandler; // the event handler for the connection
|
|
PRXCE_CONNECTION_INFORMATION pConnectionInformation; // the remote address ...
|
|
} RXCE_CONNECTION;
|
|
|
|
#define RXCE_CONNECTION_SIGNATURE ((sizeof(RXCE_CONNECTION) << 16) | RDBSS_NTC_RXCE_CONNECTION)
|
|
|
|
#define RxCeIsConnectionValid(pConnection) \
|
|
((pConnection)->Signature == RXCE_CONNECTION_SIGNATURE)
|
|
|
|
//
|
|
// The following enumerated type defines the various choices presented for
|
|
// selecting the transport over which a connection should be established
|
|
//
|
|
|
|
typedef enum _RXCE_CONNECTION_CREATE_OPTIONS_ {
|
|
RxCeSelectFirstSuccessfulTransport,
|
|
RxCeSelectBestSuccessfulTransport,
|
|
RxCeSelectAllSuccessfulTransports
|
|
} RXCE_CONNECTION_CREATE_OPTIONS,
|
|
*PRXCE_CONNECTION_CREATE_OPTIONS;
|
|
|
|
typedef struct _RXCE_CONNECTION_COMPLETION_CONTEXT_ {
|
|
NTSTATUS Status;
|
|
ULONG AddressIndex;
|
|
PRXCE_CONNECTION pConnection;
|
|
PRXCE_VC pVc;
|
|
RX_WORK_QUEUE_ITEM WorkQueueItem;
|
|
|
|
// This is used to pass the UNICODE DNS name returned back from TDI
|
|
PRXCE_CONNECTION_INFORMATION pConnectionInformation;
|
|
} RXCE_CONNECTION_COMPLETION_CONTEXT,
|
|
*PRXCE_CONNECTION_COMPLETION_CONTEXT;
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PRXCE_CONNECTION_COMPLETION_ROUTINE)(
|
|
PRXCE_CONNECTION_COMPLETION_CONTEXT pCompletionContext);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeBuildConnection(
|
|
IN PRXCE_ADDRESS pLocalAddress,
|
|
IN PRXCE_CONNECTION_INFORMATION pConnectionInformation,
|
|
IN PRXCE_CONNECTION_EVENT_HANDLER pHandler,
|
|
IN PVOID pEventContext,
|
|
IN OUT PRXCE_CONNECTION pConnection,
|
|
IN OUT PRXCE_VC pVc);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeBuildConnectionOverMultipleTransports(
|
|
IN OUT PRDBSS_DEVICE_OBJECT pMiniRedirectorDeviceObject,
|
|
IN RXCE_CONNECTION_CREATE_OPTIONS CreateOption,
|
|
IN ULONG NumberOfAddresses,
|
|
IN PRXCE_ADDRESS *pLocalAddressPointers,
|
|
IN PUNICODE_STRING pServerName,
|
|
IN PRXCE_CONNECTION_INFORMATION pConnectionInformation,
|
|
IN PRXCE_CONNECTION_EVENT_HANDLER pHandler,
|
|
IN PVOID pEventContext,
|
|
IN PRXCE_CONNECTION_COMPLETION_ROUTINE pCompletionRoutine,
|
|
IN OUT PRXCE_CONNECTION_COMPLETION_CONTEXT pCompletionContext);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeTearDownConnection(
|
|
IN PRXCE_CONNECTION pConnection);
|
|
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeCancelConnectRequest(
|
|
IN PRXCE_ADDRESS pLocalAddress,
|
|
IN PUNICODE_STRING pServerName,
|
|
IN PRXCE_CONNECTION_INFORMATION pConnectionInformation);
|
|
|
|
|
|
//
|
|
// RXCE_VC encapsulates all the information w.r.t a virtual circuit (VC)
|
|
// connection to a particular server as regards the connection engine.
|
|
//
|
|
// Typically one VC is associated with a connection. However, there are instances in
|
|
// which more than one VC can be associated with a connection. In order to efficiently
|
|
// handle the common case well and at the same time provide an extensible mechanism we
|
|
// define a collection data structure ( a list ) which subsumes the allocation for
|
|
// one virtual circuit. It is also imperative that we restrict the knowledge of
|
|
// how this collection is organized to as few methods as possible in order to
|
|
// enable optimization/restructuring of this data structure at a later time.
|
|
//
|
|
|
|
#define RXCE_VC_ACTIVE ((LONG)0xaa)
|
|
#define RXCE_VC_DISCONNECTED ((LONG)0xdd)
|
|
#define RXCE_VC_TEARDOWN ((LONG)0xbb)
|
|
|
|
#ifdef __cplusplus
|
|
typedef struct _RXCE_VC_ : public RXCE_SIGNATURE {
|
|
#else // !__cplusplus
|
|
typedef struct _RXCE_VC_ {
|
|
RXCE_SIGNATURE;
|
|
#endif // __cplusplus
|
|
|
|
PRXCE_CONNECTION pConnection; // the referenced connection instance
|
|
HANDLE hEndpoint; // local endpoint for the connection
|
|
PFILE_OBJECT pEndpointFileObject; // the end point file object.
|
|
LONG State; // status of the Vc.
|
|
CONNECTION_CONTEXT ConnectionId; // local endpoint for the connection.
|
|
PMDL pReceiveMdl; // the MDl for handling receives.
|
|
PKEVENT pCleanUpEvent; // sychronize event for clean up transports
|
|
} RXCE_VC;
|
|
|
|
#define RXCE_VC_SIGNATURE ((sizeof(RXCE_VC) << 16) | RDBSS_NTC_RXCE_VC)
|
|
|
|
#define RxCeIsVcValid(pVc) \
|
|
((pVc)->Signature == RXCE_VC_SIGNATURE)
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeBuildVC(
|
|
IN OUT PRXCE_VC pVc,
|
|
IN PRXCE_CONNECTION Connection);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeTearDownVC(
|
|
IN PRXCE_VC pVc);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeInitiateVCDisconnect(
|
|
IN PRXCE_VC pVc);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeQueryInformation(
|
|
IN PRXCE_VC pVc,
|
|
IN RXCE_CONNECTION_INFORMATION_CLASS InformationClass,
|
|
OUT PVOID pInformation,
|
|
IN ULONG Length);
|
|
|
|
//
|
|
// RxCe Data transmission methods
|
|
//
|
|
|
|
//
|
|
// Send options
|
|
//
|
|
// The following flags are equivalent to the TDI flags. In addition
|
|
// there are RXCE specific flags which are defined from the other end of
|
|
// a dword.
|
|
//
|
|
|
|
#define RXCE_SEND_EXPEDITED TDI_SEND_EXPEDITED
|
|
#define RXCE_SEND_NO_RESPONSE_EXPECTED TDI_SEND_NO_RESPONSE_EXPECTED
|
|
#define RXCE_SEND_NON_BLOCKING TDI_SEND_NON_BLOCKING
|
|
|
|
//
|
|
// The ASYNCHRONOUS and SYNCHRONOUS option available RxCeSend and RxCeSendDatagram
|
|
// distinguish between two situations. In the asynchronous case control returns to
|
|
// the caller once the request has been successfully submitted to the underlying
|
|
// transport. The results for any given request are communicated back using the
|
|
// SendCompletion callback routine. The pCompletionContext parameter in RxCeSend and
|
|
// RxCeSendDatagram is passed back in the callback routine to assist the caller in
|
|
// disambiguating the requests.
|
|
//
|
|
// In the synchronous case the request is submitted to the underlying transport and the
|
|
// control does not return to the caller till the request completes.
|
|
//
|
|
// Note that in the synchrnous case the pCompletionContext parameter is ignored and the
|
|
// status that is returned correpsonds to the completion status of the operations.
|
|
//
|
|
// The benefit of ASYNCHRONOUS and SYNCHRONOUS options depends on the underlying
|
|
// transport. In a Virtual Circuit environment a SYNCHRONOUS option implies that the
|
|
// control does not return till the data reaches the server. On the other hand
|
|
// for datagram oriented transports there is very little difference between the two.
|
|
//
|
|
|
|
#define RXCE_FLAGS_MASK (0xff000000)
|
|
|
|
#define RXCE_SEND_SYNCHRONOUS (0x10000000)
|
|
|
|
// The following bit signifies if an RX_MEM_DESC(MDL) is to be sent in its entirety
|
|
// or only portions of it need to be sent.
|
|
|
|
#define RXCE_SEND_PARTIAL (0x20000000)
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeSend(
|
|
IN PRXCE_VC pVc,
|
|
IN ULONG SendOptions,
|
|
IN PMDL pMdl,
|
|
IN ULONG SendLength,
|
|
IN PVOID pCompletionContext);
|
|
|
|
extern NTSTATUS
|
|
NTAPI
|
|
RxCeSendDatagram(
|
|
IN PRXCE_ADDRESS hAddress,
|
|
IN PRXCE_CONNECTION_INFORMATION pConnectionInformation,
|
|
IN ULONG SendOptions,
|
|
IN PMDL pMdl,
|
|
IN ULONG SendLength,
|
|
IN PVOID pCompletionContext);
|
|
|
|
extern PIRP
|
|
RxCeAllocateIrpWithMDL(
|
|
IN CCHAR StackSize,
|
|
IN BOOLEAN ChargeQuota,
|
|
IN PMDL Buffer);
|
|
|
|
extern VOID
|
|
RxCeFreeIrp(PIRP pIrp);
|
|
|
|
|
|
#endif // _RXCE_H_
|