/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    mrx.h

Abstract:

    This module defines the interface between the MINI Redirectors and the RDBSS.
    The inteface is a dispatch table for the normal file system operations. In
    addition routines are provided for registrations/deregistration of mini
    redirectors.

Author:

    Joe Linn (JoeLinn)    8-17-94

Revision History:

Notes:

    The interface definition between the mini redirectors and the wrapper
    consists of two parts, the data structures used and the dispatch vector.
    The data structures are defined in mrxfcb.h while the signatures of the
    various entries in the dispatch vector and the dispatch vector itself is
    defined in this file.

--*/

#ifndef _RXMINIRDR_
#define _RXMINIRDR_

#include <mrxfcb.h>     // RDBSS data structures shared with the mini redirectors

// The following macros encapsulate commonly used operations in the mini redirector.
// These include setting the status/information associated with the completion of
// a request etc.


// The following three macros are used for passing back operation status from the
// minirdr to the NT wrapper. information passed back is either the open_action
// for a create or the actual byte count or an operation. these should be passed
// back directly in the rxcontext.

#define RxSetIoStatusStatus(RXCONTEXT, STATUS)  \
            (RXCONTEXT)->CurrentIrp->IoStatus.Status = (STATUS)

#define RxSetIoStatusInfo(RXCONTEXT, INFORMATION) \
             ((RXCONTEXT))->CurrentIrp->IoStatus.Information = (INFORMATION)

#define RxGetIoStatusInfo(RXCONTEXT) \
             ((RXCONTEXT)->CurrentIrp->IoStatus.Information)

#define RxShouldPostCompletion()  ((KeGetCurrentIrql() >= DISPATCH_LEVEL))

///
/// The mini rdr's register/unregister with the RDBSS whenever they are loaded/unloaded.
/// The registartion process is a two way hand shake in which the mini rdr informs the RDBSS
/// by invoking the registartion routine. The RDBSS completes the initialization by invoking
/// the Start routine in the dispatch vector.
///

#define RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS            0x00000001
#define RX_REGISTERMINI_FLAG_DONT_PROVIDE_MAILSLOTS       0x00000002
#define RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH    0x00000004
#define RX_REGISTERMINI_FLAG_DONT_INIT_PREFIX_N_SCAVENGER 0x00000008

NTSTATUS
NTAPI
RxRegisterMinirdr(
    OUT PRDBSS_DEVICE_OBJECT *DeviceObject, //the deviceobject that was created
    IN OUT PDRIVER_OBJECT DriverObject,    // the minirdr driver object
    IN  PMINIRDR_DISPATCH MrdrDispatch,    // the mini rdr dispatch vector
    IN  ULONG             Controls,
    IN  PUNICODE_STRING   DeviceName,
    IN  ULONG DeviceExtensionSize,
    IN  DEVICE_TYPE DeviceType,
    IN  ULONG DeviceCharacteristics
    );

VOID
NTAPI
RxMakeLateDeviceAvailable(
    IN PRDBSS_DEVICE_OBJECT RxDeviceObject
    );

VOID
NTAPI
__RxFillAndInstallFastIoDispatch(
    IN     PRDBSS_DEVICE_OBJECT RxDeviceObject,
    IN OUT PFAST_IO_DISPATCH FastIoDispatch,
    IN     ULONG             FastIoDispatchSize
    );
#define RxFillAndInstallFastIoDispatch(__devobj,__fastiodisp) {\
    __RxFillAndInstallFastIoDispatch(&__devobj->RxDeviceObject,\
                                     &__fastiodisp,            \
                                     sizeof(__fastiodisp)); \
    }

VOID
NTAPI
RxpUnregisterMinirdr(
    IN PRDBSS_DEVICE_OBJECT RxDeviceObject);

NTSTATUS
RxStartMinirdr (
    IN PRX_CONTEXT RxContext,
    OUT PBOOLEAN PostToFsp
    );

NTSTATUS
RxStopMinirdr (
    IN PRX_CONTEXT RxContext,
    OUT PBOOLEAN PostToFsp
    );

NTSTATUS
RxSetDomainForMailslotBroadcast (
    IN PUNICODE_STRING DomainName
    );

NTSTATUS
RxFsdDispatch(
    IN PRDBSS_DEVICE_OBJECT RxDeviceObject,
    IN PIRP Irp
    );

typedef
NTSTATUS
(NTAPI *PMRX_CALLDOWN) (
    IN OUT struct _RX_CONTEXT * RxContext
    );

typedef
NTSTATUS
(NTAPI *PMRX_CALLDOWN_CTX) (
    IN OUT struct _RX_CONTEXT * RxContext,
    IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject
    );

typedef
NTSTATUS
(NTAPI *PMRX_CHKDIR_CALLDOWN) (
    IN OUT struct _RX_CONTEXT * RxContext,
    IN     PUNICODE_STRING      DirectoryName
    );

typedef
NTSTATUS
(NTAPI *PMRX_CHKFCB_CALLDOWN) (
    IN struct _FCB * Fcb1,
    IN struct _FCB * Fcb2
    );

//
// The two important abstractions used in the interface between the mini rdr and RDBSS are
// Server Calls and Net Roots. The former corresponds to the context associated with a
// server with which a connection has been established and the later corresponds to a
// share on a server ( This could also be viewed as a portion of the name space which has
// been claimed by a mini rdr).
//
// The creation of Server calls and net roots typically involve atleast one network round trip.
// In order to provide for asynchronous operations to continue these operations are modelled
// as a two phase activity. Each calldown to a mini rdr for creating a server call and net root is
// accompanied by a callup from the mini rdr to the RDBSS notifying with the completion status
// of the request. Currently these are synchronous!
//
// The creation of Srv calls is further complicated by the fact that the RDBSS has to choose
// from a number of mini rdr's to establish a connection with a server. In order to provide
// the RDBSS with maximum flexibility in choosing the mini rdr's that it wishes to deploy the
// creation of server calls involves a third phase in which the RDBSS notifies the mini rdr of
// a winner. All the losing mini rdrs destroy the associated context.
//

typedef enum _RX_BLOCK_CONDITION {
    Condition_Uninitialized = 0,
    Condition_InTransition,
    Condition_Closing,
    Condition_Good,
    Condition_Bad,
    Condition_Closed
    } RX_BLOCK_CONDITION, *PRX_BLOCK_CONDITION;

#define StableCondition(X) ((X) >= Condition_Good)

// The routine for notifying the RDBSS about the completion status of the NetRoot creation
// request.

typedef
VOID
(NTAPI *PMRX_NETROOT_CALLBACK) (
    IN OUT struct _MRX_CREATENETROOT_CONTEXT *pCreateContext
    );

// this routine allows the minirdr to specify the netrootname. NetRootName and RestOfName are set
// to point to the appropriate places within FilePathName. SrvCall is used to find the lengthof the srvcallname.

typedef
VOID
(NTAPI *PMRX_EXTRACT_NETROOT_NAME) (
    IN  PUNICODE_STRING FilePathName,
    IN  PMRX_SRV_CALL   SrvCall,
    OUT PUNICODE_STRING NetRootName,
    OUT PUNICODE_STRING RestOfName OPTIONAL
    );

// The resumption context for the RDBSS.
typedef struct _MRX_CREATENETROOT_CONTEXT {
    PRX_CONTEXT           RxContext;
    PV_NET_ROOT           pVNetRoot;
    KEVENT                FinishEvent;
    NTSTATUS              VirtualNetRootStatus;
    NTSTATUS              NetRootStatus;
    RX_WORK_QUEUE_ITEM    WorkQueueItem;
    PMRX_NETROOT_CALLBACK Callback;
} MRX_CREATENETROOT_CONTEXT, *PMRX_CREATENETROOT_CONTEXT;


// the calldown from RDBSS to the mini rdr for creating a netroot.
typedef
NTSTATUS
(NTAPI *PMRX_CREATE_V_NET_ROOT)(
    IN OUT PMRX_CREATENETROOT_CONTEXT pContext
    );

// the calldown for querying a net root state.
typedef
NTSTATUS
(NTAPI *PMRX_UPDATE_NETROOT_STATE)(
    IN OUT PMRX_NET_ROOT pNetRoot
    );

// The routine for notifying the RDBSS about the completion status of the SrvCall creation
// request.

typedef
VOID
(NTAPI *PMRX_SRVCALL_CALLBACK) (
    IN OUT struct _MRX_SRVCALL_CALLBACK_CONTEXT *pContext
    );

// The resumption context for the RDBSS.
typedef struct _MRX_SRVCALL_CALLBACK_CONTEXT {
    struct _MRX_SRVCALLDOWN_STRUCTURE *SrvCalldownStructure; //could be computed
    ULONG                             CallbackContextOrdinal;
    PRDBSS_DEVICE_OBJECT              RxDeviceObject;
    NTSTATUS                          Status;
    PVOID                             RecommunicateContext;
} MRX_SRVCALL_CALLBACK_CONTEXT, *PMRX_SRVCALL_CALLBACK_CONTEXT;

// The context passed from the RDBSS to the mini rdr for creating a server call.
typedef struct _MRX_SRVCALLDOWN_STRUCTURE {
    KEVENT                       FinishEvent;
    LIST_ENTRY                   SrvCalldownList;
    PRX_CONTEXT                  RxContext;
    PMRX_SRV_CALL                SrvCall;
    PMRX_SRVCALL_CALLBACK        CallBack;
    BOOLEAN                      CalldownCancelled;
    ULONG                        NumberRemaining;
    ULONG                        NumberToWait;
    ULONG                        BestFinisherOrdinal;
    PRDBSS_DEVICE_OBJECT         BestFinisher;
    MRX_SRVCALL_CALLBACK_CONTEXT CallbackContexts[1];
} MRX_SRVCALLDOWN_STRUCTURE;

// the calldown from the RDBSS to the mini rdr for creating a server call
typedef
NTSTATUS
(NTAPI *PMRX_CREATE_SRVCALL)(
    IN OUT PMRX_SRV_CALL                 pSrvCall,
    IN OUT PMRX_SRVCALL_CALLBACK_CONTEXT SrvCallCallBackContext
    );

// the calldown from the RDBSS to the mini rdr for notifying the mini rdr's of the winner.
typedef
NTSTATUS
(NTAPI *PMRX_SRVCALL_WINNER_NOTIFY)(
    IN OUT PMRX_SRV_CALL SrvCall,
    IN     BOOLEAN       ThisMinirdrIsTheWinner,
    IN OUT PVOID         RecommunicateContext
    );

//
// The prototypes for calldown routines relating to various file system operations
//
typedef
VOID
(NTAPI *PMRX_NEWSTATE_CALLDOWN) (
    IN OUT PVOID Context
    );

typedef
NTSTATUS
(NTAPI *PMRX_DEALLOCATE_FOR_FCB) (
    IN OUT PMRX_FCB pFcb
    );

typedef
NTSTATUS
(NTAPI *PMRX_DEALLOCATE_FOR_FOBX) (
    IN OUT PMRX_FOBX pFobx
    );

typedef
NTSTATUS
(NTAPI *PMRX_IS_LOCK_REALIZABLE) (
    IN OUT PMRX_FCB pFcb,
    IN PLARGE_INTEGER  ByteOffset,
    IN PLARGE_INTEGER  Length,
    IN ULONG  LowIoLockFlags
    );

typedef
NTSTATUS
(NTAPI *PMRX_FORCECLOSED_CALLDOWN) (
    IN OUT PMRX_SRV_OPEN pSrvOpen
    );

typedef
NTSTATUS
(NTAPI *PMRX_FINALIZE_SRVCALL_CALLDOWN) (
    IN OUT PMRX_SRV_CALL pSrvCall,
    IN     BOOLEAN       Force
    );

typedef
NTSTATUS
(NTAPI *PMRX_FINALIZE_V_NET_ROOT_CALLDOWN) (
    IN OUT PMRX_V_NET_ROOT  pVirtualNetRoot,
    IN     PBOOLEAN         Force
    );

typedef
NTSTATUS
(NTAPI *PMRX_FINALIZE_NET_ROOT_CALLDOWN) (
    IN OUT PMRX_NET_ROOT  pNetRoot,
    IN     PBOOLEAN       Force
    );

typedef
ULONG
(NTAPI *PMRX_EXTENDFILE_CALLDOWN) (
    IN OUT struct _RX_CONTEXT * RxContext,
    IN OUT PLARGE_INTEGER   pNewFileSize,
       OUT PLARGE_INTEGER   pNewAllocationSize
    );

typedef
BOOLEAN
(*PRX_LOCK_ENUMERATOR) (
    IN OUT struct _MRX_SRV_OPEN_ * SrvOpen,
    IN OUT PVOID *ContinuationHandle,
       OUT PLARGE_INTEGER FileOffset,
       OUT PLARGE_INTEGER LockRange,
       OUT PBOOLEAN IsLockExclusive
    );
typedef
NTSTATUS
(NTAPI *PMRX_CHANGE_BUFFERING_STATE_CALLDOWN) (
    IN OUT struct _RX_CONTEXT * RxContext,
    IN OUT struct _MRX_SRV_OPEN_  * SrvOpen,
    IN     PVOID              pMRxContext
    );

typedef
NTSTATUS
(NTAPI *PMRX_PREPARSE_NAME) (
    IN OUT struct _RX_CONTEXT * RxContext,
    IN PUNICODE_STRING Name
    );

typedef
NTSTATUS
(NTAPI *PMRX_GET_CONNECTION_ID) (
    IN OUT struct _RX_CONTEXT * RxContext,
    IN OUT struct _RX_CONNECTION_ID * UniqueId
    );

//
// Buffering state/Policy management TBD
//
typedef enum _MINIRDR_BUFSTATE_COMMANDS {
    MRDRBUFSTCMD__COMMAND_FORCEPURGE0,
    MRDRBUFSTCMD__1,
    MRDRBUFSTCMD__2,
    MRDRBUFSTCMD__3,
    MRDRBUFSTCMD__4,
    MRDRBUFSTCMD__5,
    MRDRBUFSTCMD__6,
    MRDRBUFSTCMD__7,
    MRDRBUFSTCMD__8,
    MRDRBUFSTCMD__9,
    MRDRBUFSTCMD__10,
    MRDRBUFSTCMD__11,
    MRDRBUFSTCMD__12,
    MRDRBUFSTCMD__13,
    MRDRBUFSTCMD__14,
    MRDRBUFSTCMD__15,
    MRDRBUFSTCMD__16,
    MRDRBUFSTCMD__17,
    MRDRBUFSTCMD__18,
    MRDRBUFSTCMD__19,
    MRDRBUFSTCMD__20,
    MRDRBUFSTCMD__21,
    MRDRBUFSTCMD__22,
    MRDRBUFSTCMD__23,
    MRDRBUFSTCMD__24,
    MRDRBUFSTCMD__25,
    MRDRBUFSTCMD__26,
    MRDRBUFSTCMD__27,
    MRDRBUFSTCMD__28,
    MRDRBUFSTCMD__29,
    MRDRBUFSTCMD__30,
    MRDRBUFSTCMD__31,
    MRDRBUFSTCMD_MAXXX
} MINIRDR_BUFSTATE_COMMANDS;

#define RXMakeMRDRBUFSTCMD(x)               ((ULONG)(1<<MRDRBUFSTCMD__##x))
#define MINIRDR_BUFSTATE_COMMAND_FORCEPURGE ( RXMakeMRDRBUFSTCMD(COMMAND_FORCEPURGE0) )
#define MINIRDR_BUFSTATE_COMMAND_MASK       ((MINIRDR_BUFSTATE_COMMAND_FORCEPURGE))

typedef
NTSTATUS
(NTAPI *PMRX_COMPUTE_NEW_BUFFERING_STATE) (
    IN OUT PMRX_SRV_OPEN pSrvOpen,
    IN     PVOID         pMRxContext,
       OUT PULONG        pNewBufferingState
    );

typedef enum _LOWIO_OPS {
  LOWIO_OP_READ=0,
  LOWIO_OP_WRITE,
  LOWIO_OP_SHAREDLOCK,
  LOWIO_OP_EXCLUSIVELOCK,
  LOWIO_OP_UNLOCK,
  LOWIO_OP_UNLOCK_MULTIPLE,
  //LOWIO_OP_UNLOCKALLBYKEY,
  LOWIO_OP_FSCTL,
  LOWIO_OP_IOCTL,
  LOWIO_OP_NOTIFY_CHANGE_DIRECTORY,
  LOWIO_OP_CLEAROUT,
  LOWIO_OP_MAXIMUM
} LOWIO_OPS;

typedef
NTSTATUS
(NTAPI *PLOWIO_COMPLETION_ROUTINE) (
    IN struct _RX_CONTEXT *RxContext
    );

typedef LONGLONG RXVBO;

// we may, at some point, want a smarter implementation of this. we don't statically allocate the first
// element because that would make unlock behind much harder.
typedef struct _LOWIO_LOCK_LIST *PLOWIO_LOCK_LIST;
typedef struct _LOWIO_LOCK_LIST {
    PLOWIO_LOCK_LIST Next;
    ULONG    LockNumber;
    RXVBO    ByteOffset;
    LONGLONG Length;
    BOOLEAN ExclusiveLock;
} LOWIO_LOCK_LIST;

VOID
NTAPI
RxFinalizeLockList(
    struct _RX_CONTEXT *RxContext
    );

typedef struct _XXCTL_LOWIO_COMPONENT{
           ULONG          Flags;
           union {
               ULONG          FsControlCode;
               ULONG          IoControlCode;
           };
           ULONG          InputBufferLength;
           PVOID          pInputBuffer;
           ULONG          OutputBufferLength;
           PVOID          pOutputBuffer;
           UCHAR          MinorFunction;
} XXCTL_LOWIO_COMPONENT;

typedef struct _LOWIO_CONTEXT {
    USHORT Operation;  // padding!
    USHORT Flags;
    PLOWIO_COMPLETION_ROUTINE CompletionRoutine;
    PERESOURCE Resource;
    ERESOURCE_THREAD ResourceThreadId;
    union {
        struct {
           ULONG    Flags;
           PMDL     Buffer;
           RXVBO    ByteOffset;
           ULONG    ByteCount;
           ULONG    Key;
           PNON_PAGED_FCB NonPagedFcb;
        } ReadWrite;
        struct {
           union {
               PLOWIO_LOCK_LIST LockList;
               LONGLONG       Length;
           };
           //these fields are not used if locklist is used
           ULONG          Flags;
           RXVBO          ByteOffset;
           ULONG          Key;
        } Locks;
        XXCTL_LOWIO_COMPONENT FsCtl;
        XXCTL_LOWIO_COMPONENT IoCtl; //these must be the same
        struct {
           BOOLEAN        WatchTree;
           ULONG          CompletionFilter;
           ULONG          NotificationBufferLength;
           PVOID          pNotificationBuffer;
        } NotifyChangeDirectory;
    } ParamsFor;
} LOWIO_CONTEXT;

#define LOWIO_CONTEXT_FLAG_SYNCCALL    0x0001  //this is set if lowiocompletion is called from lowiosubmit
#define LOWIO_CONTEXT_FLAG_SAVEUNLOCKS 0x0002  //WRAPPER INTERNAL: on NT, it means the unlock routine add unlocks to the list
#define LOWIO_CONTEXT_FLAG_LOUDOPS     0x0004  //WRAPPER INTERNAL: on NT, it means read and write routines generate dbg output
#define LOWIO_CONTEXT_FLAG_CAN_COMPLETE_AT_DPC_LEVEL     0x0008  //WRAPPER INTERNAL: on NT, it means the completion routine maybe can
                                                                 //    complete when called at DPC. otherwise it cannnot. currently
                                                                 //    none can.

#define LOWIO_READWRITEFLAG_PAGING_IO          0x01
#define LOWIO_READWRITEFLAG_EXTENDING_FILESIZE 0x02
#define LOWIO_READWRITEFLAG_EXTENDING_VDL      0x04

//these must match the SL_ values in io.h (ntifs.h) since the flags field is just copied
#define LOWIO_LOCKSFLAG_FAIL_IMMEDIATELY 0x01
#define LOWIO_LOCKSFLAG_EXCLUSIVELOCK    0x02

#if (LOWIO_LOCKSFLAG_FAIL_IMMEDIATELY!=SL_FAIL_IMMEDIATELY)
#error LOWIO_LOCKSFLAG_FAIL_IMMEDIATELY!=SL_FAIL_IMMEDIATELY
#endif
#if (LOWIO_LOCKSFLAG_EXCLUSIVELOCK!=SL_EXCLUSIVE_LOCK)
#error LOWIO_LOCKSFLAG_EXCLUSIVELOCK!=SL_EXCLUSIVE_LOCK
#endif

//
// The six important data structures (SRV_CALL,NET_ROOT,V_NET_ROOT,FCB,SRV_OPEN and
// FOBX) that are an integral part of the mini rdr architecture have a corresponding
// counterpart in every mini rdr implementation. In order to provide maximal flexibility
// and at the same time enhance performance the sizes and the desired allocation
// behaviour are communicated at the registration time of a mini rdr.
//
// There is no single way in which these extensions can be managed which will
// address the concerns of flexibility as well as performance. The solution adopted
// in the current architecture that meets the dual goals in most cases. The solution
// and the rationale is as follows ...
//
// Each mini rdr implementor specifies the size of the data structure extensions
// alongwith a flag specfying if the allocation/free of the extensions are to be
// managed by the wrapper.
//
// In all those cases where a one to one relationship exists between the wrapper
// data structure and the corresponding mini rdr counterpart specifying the flag
// results in maximal performance gains. There are a certain data structures for
// which many instances of a wrapper data structure map onto the same extension in
// the mini redirector. In such cases the mini rdr implementor will be better off
// managing the allocation/deallocation of the data structure extension without the
// intervention of the wrapper.
//
// Irrespective of the mechanism choosen the convention is to always associate the
// extension with the Context field in the corresponding RDBSS data structure.
// !!!NO EXCEPTIONS!!!
//
// The remaining field in all the RDBSS data structures, i.e., Context2 is left to
// the discretion og the mini rdr implementor.
//
//
// The SRV_CALL extension is not handled currently. This is because of further fixes
// required in RDBSS w.r.t the mecahsnism used to select the mini rdr and to allow several
// minis to share the srvcall.
//
// Please do not use it till further notice; rather, the mini should manage its own srcall
// storage. There is a finalization calldown that assists in this endeavor.

#define RDBSS_MANAGE_SRV_CALL_EXTENSION   (0x1)
#define RDBSS_MANAGE_NET_ROOT_EXTENSION   (0x2)
#define RDBSS_MANAGE_V_NET_ROOT_EXTENSION (0x4)
#define RDBSS_MANAGE_FCB_EXTENSION        (0x8)
#define RDBSS_MANAGE_SRV_OPEN_EXTENSION   (0x10)
#define RDBSS_MANAGE_FOBX_EXTENSION       (0x20)

#define RDBSS_NO_DEFERRED_CACHE_READAHEAD    (0x1000)

typedef struct _MINIRDR_DISPATCH {
    NODE_TYPE_CODE   NodeTypeCode;                  // Normal Header
    NODE_BYTE_SIZE   NodeByteSize;

    ULONG  MRxFlags;                // Flags to control the allocation of extensions.
                                    // and various other per-minirdr policies

    ULONG  MRxSrvCallSize;          // size of the SRV_CALL extensions
    ULONG  MRxNetRootSize;          // size of the NET_ROOT extensions
    ULONG  MRxVNetRootSize;         // size of the V_NET_ROOT extensions
    ULONG  MRxFcbSize;              // size of FCB extensions
    ULONG  MRxSrvOpenSize;          // size of SRV_OPEN extensions
    ULONG  MRxFobxSize;             // size of FOBX extensions

    // Call downs for starting/stopping the mini rdr
    PMRX_CALLDOWN_CTX                  MRxStart;
    PMRX_CALLDOWN_CTX                  MRxStop;

    // Call down for cancelling outstanding requests
    PMRX_CALLDOWN                      MRxCancel;

    // Call downs related to creating/opening/closing file system objects
    PMRX_CALLDOWN                      MRxCreate;
    PMRX_CALLDOWN                      MRxCollapseOpen;
    PMRX_CALLDOWN                      MRxShouldTryToCollapseThisOpen;
    PMRX_CALLDOWN                      MRxFlush;
    PMRX_CALLDOWN                      MRxZeroExtend;
    PMRX_CALLDOWN                      MRxTruncate;
    PMRX_CALLDOWN                      MRxCleanupFobx;
    PMRX_CALLDOWN                      MRxCloseSrvOpen;
    PMRX_DEALLOCATE_FOR_FCB            MRxDeallocateForFcb;
    PMRX_DEALLOCATE_FOR_FOBX           MRxDeallocateForFobx;
    PMRX_IS_LOCK_REALIZABLE            MRxIsLockRealizable;
    PMRX_FORCECLOSED_CALLDOWN          MRxForceClosed;
    PMRX_CHKFCB_CALLDOWN               MRxAreFilesAliased;

    // call downs related to nonNT style printing.....note that the connect goes thru
    // the normal srvcall/netroot interface
    PMRX_CALLDOWN                      MRxOpenPrintFile;
    PMRX_CALLDOWN                      MRxClosePrintFile;
    PMRX_CALLDOWN                      MRxWritePrintFile;
    PMRX_CALLDOWN                      MRxEnumeratePrintQueue;

    // call downs related to unsatisfied requests, i.e., time outs
    PMRX_CALLDOWN                      MRxClosedSrvOpenTimeOut;
    PMRX_CALLDOWN                      MRxClosedFcbTimeOut;

    // call downs related to query/set  information on file system objects
    PMRX_CALLDOWN                      MRxQueryDirectory;
    PMRX_CALLDOWN                      MRxQueryFileInfo;
    PMRX_CALLDOWN                      MRxSetFileInfo;
    PMRX_CALLDOWN                      MRxSetFileInfoAtCleanup;
    PMRX_CALLDOWN                      MRxQueryEaInfo;
    PMRX_CALLDOWN                      MRxSetEaInfo;
    PMRX_CALLDOWN                      MRxQuerySdInfo;
    PMRX_CALLDOWN                      MRxSetSdInfo;
    PMRX_CALLDOWN                      MRxQueryQuotaInfo;
    PMRX_CALLDOWN                      MRxSetQuotaInfo;
    PMRX_CALLDOWN                      MRxQueryVolumeInfo;
    PMRX_CALLDOWN                      MRxSetVolumeInfo;
    PMRX_CHKDIR_CALLDOWN               MRxIsValidDirectory;

    // call downs related to buffer management
    PMRX_COMPUTE_NEW_BUFFERING_STATE   MRxComputeNewBufferingState;

    // call downs related to Low I/O management (reads/writes on file system objects)
    PMRX_CALLDOWN                      MRxLowIOSubmit[LOWIO_OP_MAXIMUM+1];
    PMRX_EXTENDFILE_CALLDOWN             MRxExtendForCache;
    PMRX_EXTENDFILE_CALLDOWN             MRxExtendForNonCache;
    PMRX_CHANGE_BUFFERING_STATE_CALLDOWN MRxCompleteBufferingStateChangeRequest;

    // call downs related to name space management
    PMRX_CREATE_V_NET_ROOT             MRxCreateVNetRoot;
    PMRX_FINALIZE_V_NET_ROOT_CALLDOWN  MRxFinalizeVNetRoot;
    PMRX_FINALIZE_NET_ROOT_CALLDOWN    MRxFinalizeNetRoot;
    PMRX_UPDATE_NETROOT_STATE          MRxUpdateNetRootState;
    PMRX_EXTRACT_NETROOT_NAME          MRxExtractNetRootName;

    // call downs related to establishing connections with servers
    PMRX_CREATE_SRVCALL                MRxCreateSrvCall;
    PMRX_CREATE_SRVCALL                MRxCancelCreateSrvCall;
    PMRX_SRVCALL_WINNER_NOTIFY         MRxSrvCallWinnerNotify;
    PMRX_FINALIZE_SRVCALL_CALLDOWN     MRxFinalizeSrvCall;

    PMRX_CALLDOWN                      MRxDevFcbXXXControlFile;

    // new calldowns

    // Allow a client to preparse the name
    PMRX_PREPARSE_NAME                 MRxPreparseName;

    // call down for controlling multi-plexing
    PMRX_GET_CONNECTION_ID             MRxGetConnectionId;

} MINIRDR_DISPATCH, *PMINIRDR_DISPATCH;


#endif   // _RXMINIRDR_