4 extern KMUTEX RxScavengerMutex
;
6 #define RX_SCAVENGER_FINALIZATION_TIME_INTERVAL (10 * 1000 * 1000 * 10)
8 typedef struct _RX_SCAVENGER_ENTRY
15 struct _RX_SCAVENGER_ENTRY
*pContinuationEntry
;
16 } RX_SCAVENGER_ENTRY
, *PRX_SCAVENGER_ENTRY
;
18 #define RxInitializeScavengerEntry(ScavengerEntry) \
19 (ScavengerEntry)->State = 0; \
20 (ScavengerEntry)->Flags = 0; \
21 (ScavengerEntry)->Type = 0; \
22 (ScavengerEntry)->Operation = 0; \
23 InitializeListHead(&(ScavengerEntry)->List); \
24 (ScavengerEntry)->pContinuationEntry = NULL
26 #define RxAcquireScavengerMutex() KeWaitForSingleObject(&RxScavengerMutex, Executive, KernelMode, FALSE, NULL)
27 #define RxReleaseScavengerMutex() KeReleaseMutex(&RxScavengerMutex, FALSE)
32 _Out_ PBOOLEAN NeedPurge
);
38 typedef enum _RDBSS_SCAVENGER_STATE
40 RDBSS_SCAVENGER_INACTIVE
,
41 RDBSS_SCAVENGER_DORMANT
,
42 RDBSS_SCAVENGER_ACTIVE
,
43 RDBSS_SCAVENGER_SUSPENDED
44 } RDBSS_SCAVENGER_STATE
, *PRDBSS_SCAVENGER_STATE
;
46 typedef struct _RDBSS_SCAVENGER
48 RDBSS_SCAVENGER_STATE State
;
49 LONG MaximumNumberOfDormantFiles
;
50 volatile LONG NumberOfDormantFiles
;
51 LARGE_INTEGER TimeLimit
;
52 ULONG SrvCallsToBeFinalized
;
53 ULONG NetRootsToBeFinalized
;
54 ULONG VNetRootsToBeFinalized
;
55 ULONG FcbsToBeFinalized
;
56 ULONG SrvOpensToBeFinalized
;
57 ULONG FobxsToBeFinalized
;
58 LIST_ENTRY SrvCallFinalizationList
;
59 LIST_ENTRY NetRootFinalizationList
;
60 LIST_ENTRY VNetRootFinalizationList
;
61 LIST_ENTRY FcbFinalizationList
;
62 LIST_ENTRY SrvOpenFinalizationList
;
63 LIST_ENTRY FobxFinalizationList
;
64 LIST_ENTRY ClosePendingFobxsList
;
65 RX_WORK_ITEM WorkItem
;
68 PETHREAD CurrentScavengerThread
;
69 PNET_ROOT CurrentNetRootForClosePendingProcessing
;
70 PFCB CurrentFcbForClosePendingProcessing
;
71 KEVENT ClosePendingProcessingSyncEvent
;
72 } RDBSS_SCAVENGER
, *PRDBSS_SCAVENGER
;
74 #define RxInitializeRdbssScavenger(Scavenger, ScavengerTimeLimit) \
75 (Scavenger)->State = RDBSS_SCAVENGER_INACTIVE; \
76 (Scavenger)->SrvCallsToBeFinalized = 0; \
77 (Scavenger)->NetRootsToBeFinalized = 0; \
78 (Scavenger)->VNetRootsToBeFinalized = 0; \
79 (Scavenger)->FcbsToBeFinalized = 0; \
80 (Scavenger)->SrvOpensToBeFinalized = 0; \
81 (Scavenger)->FobxsToBeFinalized = 0; \
82 (Scavenger)->NumberOfDormantFiles = 0; \
83 (Scavenger)->MaximumNumberOfDormantFiles = 50; \
84 (Scavenger)->CurrentFcbForClosePendingProcessing = NULL; \
85 (Scavenger)->CurrentNetRootForClosePendingProcessing = NULL; \
86 if ((ScavengerTimeLimit).QuadPart == 0) \
88 (Scavenger)->TimeLimit.QuadPart = RX_SCAVENGER_FINALIZATION_TIME_INTERVAL; \
92 (Scavenger)->TimeLimit.QuadPart = (ScavengerTimeLimit).QuadPart; \
94 KeInitializeEvent(&((Scavenger)->SyncEvent), NotificationEvent, FALSE); \
95 KeInitializeEvent(&((Scavenger)->ScavengeEvent), SynchronizationEvent, TRUE); \
96 KeInitializeEvent(&((Scavenger)->ClosePendingProcessingSyncEvent), NotificationEvent, FALSE); \
97 InitializeListHead(&(Scavenger)->SrvCallFinalizationList); \
98 InitializeListHead(&(Scavenger)->NetRootFinalizationList); \
99 InitializeListHead(&(Scavenger)->VNetRootFinalizationList); \
100 InitializeListHead(&(Scavenger)->SrvOpenFinalizationList); \
101 InitializeListHead(&(Scavenger)->FcbFinalizationList); \
102 InitializeListHead(&(Scavenger)->FobxFinalizationList); \
103 InitializeListHead(&(Scavenger)->ClosePendingFobxsList)
105 typedef struct _PURGE_SYNCHRONIZATION_CONTEXT
107 LIST_ENTRY ContextsAwaitingPurgeCompletion
;
108 BOOLEAN PurgeInProgress
;
109 } PURGE_SYNCHRONIZATION_CONTEXT
, *PPURGE_SYNCHRONIZATION_CONTEXT
;
112 RxInitializePurgeSyncronizationContext(
113 _In_ PPURGE_SYNCHRONIZATION_CONTEXT PurgeSyncronizationContext
);
116 RxScavengeRelatedFobxs(
120 RxpMarkInstanceForScavengedFinalization(
124 RxpUndoScavengerFinalizationMarking(
125 _In_ PVOID Instance
);
129 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
);
131 #if (_WIN32_WINNT >= 0x0600)
133 RxSynchronizeWithScavenger(
134 _In_ PRX_CONTEXT RxContext
,
138 RxSynchronizeWithScavenger(
139 _In_ PRX_CONTEXT RxContext
);