1 #ifndef _RDBSSSTRUC_ 2 #define _RDBSSSTRUC_ 3 4 #include "prefix.h" 5 #include "lowio.h" 6 #include "scavengr.h" 7 #include "rxcontx.h" 8 #include "fcb.h" 9 10 extern RX_SPIN_LOCK RxStrucSupSpinLock; 11 12 typedef struct _RDBSS_EXPORTS 13 { 14 PRX_SPIN_LOCK pRxStrucSupSpinLock; 15 PLONG pRxDebugTraceIndent; 16 } RDBSS_EXPORTS, *PRDBSS_EXPORTS; 17 18 typedef enum _LOCK_HOLDING_STATE 19 { 20 LHS_LockNotHeld, 21 LHS_SharedLockHeld, 22 LHS_ExclusiveLockHeld 23 } LOCK_HOLDING_STATE, *PLOCK_HOLDING_STATE; 24 25 typedef struct _RDBSS_DATA 26 { 27 NODE_TYPE_CODE NodeTypeCode; 28 NODE_BYTE_SIZE NodeByteSize; 29 PDRIVER_OBJECT DriverObject; 30 volatile LONG NumberOfMinirdrsStarted; 31 FAST_MUTEX MinirdrRegistrationMutex; 32 LIST_ENTRY RegisteredMiniRdrs; 33 LONG NumberOfMinirdrsRegistered; 34 PEPROCESS OurProcess; 35 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks; 36 #if (_WIN32_WINNT < 0x0600) 37 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks; 38 #endif 39 ERESOURCE Resource; 40 } RDBSS_DATA; 41 typedef RDBSS_DATA *PRDBSS_DATA; 42 43 extern RDBSS_DATA RxData; 44 45 PEPROCESS 46 NTAPI 47 RxGetRDBSSProcess( 48 VOID); 49 50 typedef enum _RX_RDBSS_STATE_ 51 { 52 RDBSS_STARTABLE = 0, 53 RDBSS_STARTED, 54 RDBSS_STOP_IN_PROGRESS 55 } RX_RDBSS_STATE, *PRX_RDBSS_STATE; 56 57 typedef struct _RDBSS_STARTSTOP_CONTEXT_ 58 { 59 RX_RDBSS_STATE State; 60 ULONG Version; 61 PRX_CONTEXT pStopContext; 62 } RDBSS_STARTSTOP_CONTEXT, *PRDBSS_STARTSTOP_CONTEXT; 63 64 typedef struct _RX_DISPATCHER_CONTEXT_ 65 { 66 volatile LONG NumberOfWorkerThreads; 67 volatile PKEVENT pTearDownEvent; 68 } RX_DISPATCHER_CONTEXT, *PRX_DISPATCHER_CONTEXT; 69 70 #define RxSetRdbssState(RxDeviceObject, NewState) \ 71 { \ 72 KIRQL OldIrql; \ 73 KeAcquireSpinLock(&RxStrucSupSpinLock, &OldIrql); \ 74 RxDeviceObject->StartStopContext.State = (NewState); \ 75 KeReleaseSpinLock(&RxStrucSupSpinLock, OldIrql); \ 76 } 77 78 #define RxGetRdbssState(RxDeviceObject) RxDeviceObject->StartStopContext.State 79 80 typedef struct _RDBSS_DEVICE_OBJECT { 81 union 82 { 83 DEVICE_OBJECT DeviceObject; 84 DEVICE_OBJECT; 85 }; 86 ULONG RegistrationControls; 87 PRDBSS_EXPORTS RdbssExports; 88 PDEVICE_OBJECT RDBSSDeviceObject; 89 PMINIRDR_DISPATCH Dispatch; 90 UNICODE_STRING DeviceName; 91 ULONG NetworkProviderPriority; 92 HANDLE MupHandle; 93 BOOLEAN RegisterUncProvider; 94 BOOLEAN RegisterMailSlotProvider; 95 BOOLEAN RegisteredAsFileSystem; 96 BOOLEAN Unused; 97 LIST_ENTRY MiniRdrListLinks; 98 volatile ULONG NumberOfActiveFcbs; 99 volatile ULONG NumberOfActiveContexts; 100 struct 101 { 102 LARGE_INTEGER PagingReadBytesRequested; 103 LARGE_INTEGER NonPagingReadBytesRequested; 104 LARGE_INTEGER CacheReadBytesRequested; 105 LARGE_INTEGER FastReadBytesRequested; 106 LARGE_INTEGER NetworkReadBytesRequested; 107 volatile ULONG ReadOperations; 108 ULONG FastReadOperations; 109 volatile ULONG RandomReadOperations; 110 LARGE_INTEGER PagingWriteBytesRequested; 111 LARGE_INTEGER NonPagingWriteBytesRequested; 112 LARGE_INTEGER CacheWriteBytesRequested; 113 LARGE_INTEGER FastWriteBytesRequested; 114 LARGE_INTEGER NetworkWriteBytesRequested; 115 volatile ULONG WriteOperations; 116 ULONG FastWriteOperations; 117 volatile ULONG RandomWriteOperations; 118 }; 119 volatile LONG PostedRequestCount[RxMaximumWorkQueue]; 120 LONG OverflowQueueCount[RxMaximumWorkQueue]; 121 LIST_ENTRY OverflowQueue[RxMaximumWorkQueue]; 122 RX_SPIN_LOCK OverflowQueueSpinLock; 123 LONG AsynchronousRequestsPending; 124 PKEVENT pAsynchronousRequestsCompletionEvent; 125 RDBSS_STARTSTOP_CONTEXT StartStopContext; 126 RX_DISPATCHER_CONTEXT DispatcherContext; 127 PRX_PREFIX_TABLE pRxNetNameTable; 128 RX_PREFIX_TABLE RxNetNameTableInDeviceObject; 129 PRDBSS_SCAVENGER pRdbssScavenger; 130 RDBSS_SCAVENGER RdbssScavengerInDeviceObject; 131 } RDBSS_DEVICE_OBJECT, *PRDBSS_DEVICE_OBJECT; 132 133 FORCEINLINE 134 VOID 135 NTAPI 136 RxUnregisterMinirdr( 137 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject) 138 { 139 PDEVICE_OBJECT RDBSSDeviceObject; 140 141 RDBSSDeviceObject = RxDeviceObject->RDBSSDeviceObject; 142 143 RxpUnregisterMinirdr(RxDeviceObject); 144 145 if (RDBSSDeviceObject != NULL) 146 { 147 ObDereferenceObject(RDBSSDeviceObject); 148 } 149 } 150 151 #endif 152