windows-nt/Source/XPSP1/NT/base/fs/rdr2/rxce/rxcep.h
2020-09-26 16:20:57 +08:00

161 lines
4.8 KiB
C

/*++ BUILD Version: 0009 // Increment this if a change has global effects
Copyright (c) 1987-1993 Microsoft Corporation
Module Name:
rxcep.h
Abstract:
This is the include file that defines all constants and types for
implementing 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.
--*/
#ifndef _RXCEP_H_
#define _RXCEP_H_
//
// The following definition provide a rudimentary profiling mechanism by having a counter
// associated with each of the procedure definitions. This counter is incremented for every
// invocation.
//
// Notes: we should think about some means of sorting all the counts so as to provide a global
// picture of the redirector.
//
#define RxProfile(CATEGORY,ProcName) {\
RxDbgTrace(0,(DEBUG_TRACE_ALWAYS), ("%s@IRQL %d\n", #ProcName , KeGetCurrentIrql() )); \
}
#include <rxworkq.h>
#include <rxce.h> // Rx Connection Engine
#include <rxcehdlr.h> // Rx Connection engine handler definitions
#include <mrx.h> // RDBSS related definitions
//
// The following data structures are related to coordination between multiple callout
// ( calls by wrappers to other components ) made by the wrapper.
typedef struct _RX_CALLOUT_PARAMETERS_BLOCK_ {
struct _RX_CALLOUT_PARAMETERS_BLOCK_ *pNextCallOutParameterBlock;
struct _RX_CALLOUT_CONTEXT_ *pCallOutContext;
NTSTATUS CallOutStatus;
ULONG CallOutId;
} RX_CALLOUT_PARAMETERS_BLOCK,
*PRX_CALLOUT_PARAMETERS_BLOCK;
typedef
VOID
(NTAPI *PRX_CALLOUT_ROUTINE) (
IN OUT PRX_CALLOUT_PARAMETERS_BLOCK pParametersBlock);
typedef struct _RX_CALLOUT_CONTEXT_ {
PRX_CALLOUT_ROUTINE pRxCallOutInitiation;
PRX_CALLOUT_ROUTINE pRxCallOutCompletion;
LONG NumberOfCallOuts;
LONG NumberOfCallOutsInitiated;
LONG NumberOfCallOutsCompleted;
KSPIN_LOCK SpinLock;
PRDBSS_DEVICE_OBJECT pRxDeviceObject;
PRX_CALLOUT_PARAMETERS_BLOCK pCallOutParameterBlock;
} RX_CALLOUT_CONTEXT,
*PRX_CALLOUT_CONTEXT;
// The following data structures implement the mechanism for initiating callouts to
// multiple transports for setting up a connection. The mini redirectors specify
// a number of local address handles for which they want to initiate a connection
// setup request to a remote server. They are in the desired order of importance.
//
// This mechanism allows for initiating all the callouts asynchronously and waiting
// for the best one to complete. Once it is done the connect request is completed
//
// This mechanism also provides the necessary infrastructure to cleanup the
// connection engine data structures after a connect request was completed. In other
// words the mini redirector need not wait for all the transports to complete, it
// merely waits for the best one to complete.
//
// These data structures are based on the generic Callout data structures defined in
// rxcep.h
typedef struct _RX_CREATE_CONNECTION_CALLOUT_CONTEXT_ {
RX_CALLOUT_CONTEXT;
RXCE_CONNECTION_CREATE_OPTIONS CreateOptions;
// Results to be passed back to the original callout request
PRXCE_CONNECTION_COMPLETION_ROUTINE pCompletionRoutine;
PRXCE_CONNECTION_COMPLETION_CONTEXT pCompletionContext;
// TDI Connection context
PRXCE_VC pConnectionContext;
// Callout id of the desired winner. It is originally set to the callout Id
// associated with the first address and later modified depending upon the
// completion status.
ULONG BestPossibleWinner;
// The callout that was selected as the winner.
ULONG WinnerCallOutId;
// The winner was found and the Completion event was signalled. This enables the
// hystersis between the completion of the callout request and cleanup.
BOOLEAN WinnerFound;
// Once the winner is found we ensure that all callouts have been properly
// initiated before the request is completed.
BOOLEAN CompletionRoutineInvoked;
RX_WORK_QUEUE_ITEM WorkQueueItem;
PKEVENT pCleanUpEvent;
} RX_CREATE_CONNECTION_CALLOUT_CONTEXT,
*PRX_CREATE_CONNECTION_CALLOUT_CONTEXT;
typedef struct _RX_CREATE_CONNECTION_PARAMETERS_BLOCK_ {
RX_CALLOUT_PARAMETERS_BLOCK;
RXCE_CONNECTION Connection;
RXCE_VC Vc;
// TDI context for async continuation
PIRP pConnectIrp;
PULONG IrpRefCount;
} RX_CREATE_CONNECTION_PARAMETERS_BLOCK,
*PRX_CREATE_CONNECTION_PARAMETERS_BLOCK;
//
// Miscellanous routines to support constuction/destruction of connection engine
// data structures
//
extern NTSTATUS
NTAPI
RxCeInit();
extern VOID
NTAPI
RxCeTearDown();
#endif // _RXCEP_H_