windows-nt/Source/XPSP1/NT/base/fs/rdr2/inc/rxstruc.h

333 lines
8.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
RxStruc.h
Abstract:
This module defines the data structures that make up the major internal
part of the Rx file system.
Author:
Gary Kimura [GaryKi] 28-Dec-1989
Revision History:
Joe Linn [joelinn] aug-1994 moved over to rdbss
--*/
#ifndef _RDBSSSTRUC_
#define _RDBSSSTRUC_
#include "prefix.h"
#include "lowio.h"
#include "scavengr.h" // scavenger related definitions.
#include "RxContx.h"
#include "mrx.h"
#include "Fcb.h"
//define our byte offsets to be the full 64 bits
typedef LONGLONG RXVBO;
#if 0
//
// Define who many freed structures we are willing to keep around
//
#define FREE_FOBX_SIZE (8)
#define FREE_FCB_SIZE (8)
#define FREE_NON_PAGED_FCB_SIZE (8)
#define FREE_128_BYTE_SIZE (16)
#define FREE_256_BYTE_SIZE (16)
#define FREE_512_BYTE_SIZE (16)
#endif //0
//
// We will use both a common and private dispatch tables on a per FCB basis to (a) get
// some encapsulation and (b) [less important] go a little faster. The driver table then gets
// optimized for the most common case. Right now we just use the common dispatch...later and
// Eventually, all the FCBs will have pointers to optimized dispatch tables.
//
// used to synchronize access to rxcontxs and structures
extern RX_SPIN_LOCK RxStrucSupSpinLock;
typedef struct _RDBSS_EXPORTS {
RX_SPIN_LOCK *pRxStrucSupSpinLock;
PLONG pRxDebugTraceIndent;
} RDBSS_EXPORTS, *PRDBSS_EXPORTS;
extern RDBSS_EXPORTS RxExports;
// this type is used with table locks to track whether or not the lock
// should be released
typedef enum _LOCK_HOLDING_STATE {
LHS_LockNotHeld,
LHS_SharedLockHeld,
LHS_ExclusiveLockHeld
} LOCK_HOLDING_STATE;
//
// The RDBSS_DATA record is the top record in the Rx file system in-memory
// data structure. This structure must be allocated from non-paged pool.
//
typedef struct _RDBSS_DATA {
//
// The type and size of this record (must be RDBSS_NTC_DATA_HEADER)
//
NODE_TYPE_CODE NodeTypeCode;
NODE_BYTE_SIZE NodeByteSize;
// The Driver object we were initialized with
PDRIVER_OBJECT DriverObject;
//
// Mini Rdr registration related fields
//
LONG NumberOfMinirdrsStarted;
FAST_MUTEX MinirdrRegistrationMutex;
LIST_ENTRY RegisteredMiniRdrs; //protected by the mutex
LONG NumberOfMinirdrsRegistered; //protected by the mutex
//
// A pointer to our EPROCESS struct, which is a required input to the
// Cache Management subsystem.
//
PEPROCESS OurProcess;
#if 0
//
// This is the ExWorkerItem that does both kinds of deferred closes.
//
RX_WORK_QUEUE_ITEM RxCloseItem;
#endif //0
//
// Cache manager call back structures, which must be passed on each call
// to CcInitializeCacheMap.
//
CACHE_MANAGER_CALLBACKS CacheManagerCallbacks;
CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks;
// To control access to the global Rx data record
ERESOURCE Resource;
} RDBSS_DATA;
typedef RDBSS_DATA *PRDBSS_DATA;
extern RDBSS_DATA RxData;
extern PEPROCESS
RxGetRDBSSProcess();
//
// Note: A Strategy needs to be in place to deal with requests for stopping the
// RDBSS when requests are active.
//
typedef enum _RX_RDBSS_STATE_ {
RDBSS_STARTABLE = 0, //RDBSS_START_IN_PROGRESS,
RDBSS_STARTED,
RDBSS_STOP_IN_PROGRESS
//this state deleted with cause! RDBSS_STOPPED
} RX_RDBSS_STATE, *PRX_RDBSS_STATE;
typedef struct _RDBSS_STARTSTOP_CONTEXT_ {
RX_RDBSS_STATE State;
ULONG Version;
PRX_CONTEXT pStopContext;
} RDBSS_STARTSTOP_CONTEXT, *PRDBSS_STARTSTOP_CONTEXT;
typedef struct _MRX_CALLDOWN_COMPLETION_CONTEXT_ {
LONG WaitCount;
KEVENT Event;
} MRX_CALLDOWN_COMPLETION_CONTEXT,
*PMRX_CALLDOWN_COMPLETION_CONTEXT;
typedef
NTSTATUS
(NTAPI *PMRX_CALLDOWN_ROUTINE) (
IN OUT PVOID pCalldownParameter);
typedef struct _MRX_CALLDOWN_CONTEXT_ {
RX_WORK_QUEUE_ITEM WorkQueueItem;
PRDBSS_DEVICE_OBJECT pMRxDeviceObject;
PMRX_CALLDOWN_COMPLETION_CONTEXT pCompletionContext;
PMRX_CALLDOWN_ROUTINE pRoutine;
NTSTATUS CompletionStatus;
PVOID pParameter;
} MRX_CALLDOWN_CONTEXT, *PMRX_CALLDOWN_CONTEXT;
typedef struct _RX_DISPATCHER_CONTEXT_ {
LONG NumberOfWorkerThreads;
PKEVENT pTearDownEvent;
} RX_DISPATCHER_CONTEXT, *PRX_DISPATCHER_CONTEXT;
#define RxSetRdbssState(RxDeviceObject,NewState) \
{ \
KIRQL SavedIrql; \
KeAcquireSpinLock(&RxStrucSupSpinLock,&SavedIrql); \
RxDeviceObject->StartStopContext.State = (NewState); \
KeReleaseSpinLock(&RxStrucSupSpinLock,SavedIrql); \
}
#define RxGetRdbssState(RxDeviceObject) \
(RxDeviceObject)->StartStopContext.State
extern BOOLEAN
RxIsOperationCompatibleWithRdbssState(PIRP pIrp);
//
// The RDBSS Device Object is an I/O system device object with additions for
// the various structures needed by each minirdr: the dispatch, export-to-minirdr
// structure, MUP call characteristics, list of active operations, etc.
//
typedef struct _RDBSS_DEVICE_OBJECT {
union {
DEVICE_OBJECT DeviceObject;
#ifndef __cplusplus
DEVICE_OBJECT;
#endif // __cplusplus
};
ULONG RegistrationControls;
PRDBSS_EXPORTS RdbssExports; //stuff that the minirdr needs to know
PDEVICE_OBJECT RDBSSDeviceObject; // set to NULL if monolithic
PMINIRDR_DISPATCH Dispatch; // the mini rdr dispatch vector
UNICODE_STRING DeviceName;
ULONG NetworkProviderPriority;
HANDLE MupHandle;
BOOLEAN RegisterUncProvider;
BOOLEAN RegisterMailSlotProvider;
BOOLEAN RegisteredAsFileSystem;
BOOLEAN Unused;
LIST_ENTRY MiniRdrListLinks;
ULONG NumberOfActiveFcbs;
ULONG NumberOfActiveContexts;
struct {
LARGE_INTEGER PagingReadBytesRequested;
LARGE_INTEGER NonPagingReadBytesRequested;
LARGE_INTEGER CacheReadBytesRequested;
LARGE_INTEGER FastReadBytesRequested;
LARGE_INTEGER NetworkReadBytesRequested;
ULONG ReadOperations;
ULONG FastReadOperations;
ULONG RandomReadOperations;
LARGE_INTEGER PagingWriteBytesRequested;
LARGE_INTEGER NonPagingWriteBytesRequested;
LARGE_INTEGER CacheWriteBytesRequested;
LARGE_INTEGER FastWriteBytesRequested;
LARGE_INTEGER NetworkWriteBytesRequested;
ULONG WriteOperations;
ULONG FastWriteOperations;
ULONG RandomWriteOperations;
};
//
// The following field tells how many requests for this volume have
// either been enqueued to ExWorker threads or are currently being
// serviced by ExWorker threads. If the number goes above
// a certain threshold, put the request on the overflow queue to be
// executed later.
//
LONG PostedRequestCount[MaximumWorkQueue];
//
// The following field indicates the number of IRP's waiting
// to be serviced in the overflow queue.
//
LONG OverflowQueueCount[MaximumWorkQueue];
//
// The following field contains the queue header of the overflow queue.
// The Overflow queue is a list of IRP's linked via the IRP's ListEntry
// field.
//
LIST_ENTRY OverflowQueue[MaximumWorkQueue];
//
// The following spinlock protects access to all the above fields.
//
RX_SPIN_LOCK OverflowQueueSpinLock;
//
// The following fields are required for synchronization with async.
// requests issued by the RDBSS on behalf of this mini redirector on
// on shutdown.
//
LONG AsynchronousRequestsPending;
PKEVENT pAsynchronousRequestsCompletionEvent;
RDBSS_STARTSTOP_CONTEXT StartStopContext;
RX_DISPATCHER_CONTEXT DispatcherContext;
struct _RX_PREFIX_TABLE *pRxNetNameTable; //some guys may want to share
struct _RX_PREFIX_TABLE RxNetNameTableInDeviceObject;
PRDBSS_SCAVENGER pRdbssScavenger; //for sharing
RDBSS_SCAVENGER RdbssScavengerInDeviceObject;
} RDBSS_DEVICE_OBJECT;
typedef RDBSS_DEVICE_OBJECT *PRDBSS_DEVICE_OBJECT;
INLINE VOID
NTAPI
RxUnregisterMinirdr(
IN PRDBSS_DEVICE_OBJECT RxDeviceObject
)
{
PDEVICE_OBJECT RDBSSDeviceObject;
RDBSSDeviceObject = RxDeviceObject->RDBSSDeviceObject;
RxpUnregisterMinirdr(RxDeviceObject);
if (RDBSSDeviceObject != NULL) {
ObDereferenceObject(RDBSSDeviceObject);
}
}
extern FAST_MUTEX RxMinirdrRegistrationMutex;
extern LIST_ENTRY RxRegisteredMiniRdrs;
extern ULONG RxNumberOfMinirdrs;
#endif // _RDBSSSTRUC_