1 #ifndef _RX_CONTEXT_STRUCT_DEFINED_
2 #define _RX_CONTEXT_STRUCT_DEFINED_
4 #define RX_TOPLEVELIRP_CONTEXT_SIGNATURE 'LTxR'
6 typedef struct _RX_TOPLEVELIRP_CONTEXT
16 PRDBSS_DEVICE_OBJECT RxDeviceObject
;
17 PRX_CONTEXT RxContext
;
22 } RX_TOPLEVELIRP_CONTEXT
, *PRX_TOPLEVELIRP_CONTEXT
;
25 RxTryToBecomeTheTopLevelIrp(
26 _Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext
,
28 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
29 _In_ BOOLEAN ForceTopLevel
);
32 __RxInitializeTopLevelIrpContext(
33 _Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext
,
35 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
38 #define RxInitializeTopLevelIrpContext(a,b,c) __RxInitializeTopLevelIrpContext(a,b,c,0)
41 RxGetTopDeviceObjectIfRdbssIrp(
46 _Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext
);
49 RxIsThisTheTopLevelIrp(
53 typedef struct _RX_FCBTRACKER_CALLINFO
56 USHORT SavedTrackerValue
;
60 } RX_FCBTRACKER_CALLINFO
, *PRX_FCBTRACKER_CALLINFO
;
61 #define RDBSS_TRACKER_HISTORY_SIZE 32
64 #define MRX_CONTEXT_FIELD_COUNT 4
66 #if (_WIN32_WINNT >= 0x0600)
69 (NTAPI
*PRX_DISPATCH
) (
70 _In_ PRX_CONTEXT RxContext
,
75 (NTAPI
*PRX_DISPATCH
) (
76 _In_ PRX_CONTEXT RxContext
);
79 typedef struct _DFS_NAME_CONTEXT_
*PDFS_NAME_CONTEXT
;
81 typedef struct _NT_CREATE_PARAMETERS
83 ACCESS_MASK DesiredAccess
;
84 LARGE_INTEGER AllocationSize
;
89 PIO_SECURITY_CONTEXT SecurityContext
;
90 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
92 PDFS_NAME_CONTEXT DfsNameContext
;
93 } NT_CREATE_PARAMETERS
, *PNT_CREATE_PARAMETERS
;
95 typedef struct _RX_CONTEXT
97 NODE_TYPE_CODE NodeTypeCode
;
98 NODE_BYTE_SIZE NodeByteSize
;
99 volatile ULONG ReferenceCount
;
100 LIST_ENTRY ContextListEntry
;
103 BOOLEAN PendingReturned
;
105 PDEVICE_OBJECT RealDevice
;
107 PIO_STACK_LOCATION CurrentIrpSp
;
110 PMRX_SRV_OPEN pRelevantSrvOpen
;
111 PNON_PAGED_FCB NonPagedFcb
;
112 PRDBSS_DEVICE_OBJECT RxDeviceObject
;
113 PETHREAD OriginalThread
;
114 PETHREAD LastExecutionThread
;
115 volatile PVOID LockManagerContext
;
116 PVOID RdbssDbgExtension
;
117 RX_SCAVENGER_ENTRY ScavengerEntry
;
119 ULONG FobxSerialNumber
;
121 BOOLEAN FcbResourceAcquired
;
122 BOOLEAN FcbPagingIoResourceAcquired
;
123 UCHAR MustSucceedDescriptorNumber
;
130 NTSTATUS StoredStatus
;
131 PVOID StoredStatusAlignment
;
133 ULONG_PTR InformationToReturn
;
135 IO_STATUS_BLOCK IoStatusBlock
;
139 ULONGLONG ForceLonglongAligmentDummyField
;
140 PVOID MRxContext
[MRX_CONTEXT_FIELD_COUNT
];
142 PVOID WriteOnlyOpenRetryContext
;
143 PMRX_CALLDOWN MRxCancelRoutine
;
144 PRX_DISPATCH ResumeRoutine
;
145 RX_WORK_QUEUE_ITEM WorkQueueItem
;
146 LIST_ENTRY OverflowListEntry
;
148 LIST_ENTRY BlockedOperations
;
149 PFAST_MUTEX BlockedOpsMutex
;
150 LIST_ENTRY RxContextSerializationQLinks
;
157 FS_INFORMATION_CLASS FsInformationClass
;
158 FILE_INFORMATION_CLASS FileInformationClass
;
164 LONG LengthRemaining
;
166 BOOLEAN ReplaceIfExists
;
171 UNICODE_STRING SuppliedPathName
;
172 NET_ROOT_TYPE NetRootType
;
173 PIO_SECURITY_CONTEXT pSecurityContext
;
180 NT_CREATE_PARAMETERS NtCreateParameters
;
181 ULONG ReturnedCreateInformation
;
182 PWCH CanonicalNameBuffer
;
183 PRX_PREFIX_ENTRY NetNamePrefixEntry
;
184 PMRX_SRV_CALL pSrvCall
;
185 PMRX_NET_ROOT pNetRoot
;
186 PMRX_V_NET_ROOT pVNetRoot
;
192 ULONG PipeCompletionMode
;
197 BOOLEAN TryForScavengingOnSharingViolation
;
198 BOOLEAN ScavengingAlreadyTried
;
199 BOOLEAN ThisIsATreeConnectOpen
;
200 BOOLEAN TreeConnectOpenDeferred
;
201 UNICODE_STRING TransportName
;
202 UNICODE_STRING UserName
;
203 UNICODE_STRING Password
;
204 UNICODE_STRING UserDomainName
;
210 BOOLEAN ReturnSingleEntry
;
211 BOOLEAN IndexSpecified
;
212 BOOLEAN InitialQuery
;
216 PMRX_V_NET_ROOT pVNetRoot
;
217 } NotifyChangeDirectory
;
221 ULONG UserEaListLength
;
224 BOOLEAN ReturnSingleEntry
;
225 BOOLEAN IndexSpecified
;
229 SECURITY_INFORMATION SecurityInformation
;
234 SECURITY_INFORMATION SecurityInformation
;
235 PSECURITY_DESCRIPTOR SecurityDescriptor
;
241 PFILE_GET_QUOTA_INFORMATION SidList
;
244 BOOLEAN ReturnSingleEntry
;
245 BOOLEAN IndexSpecified
;
253 PV_NET_ROOT VNetRoot
;
259 LOWIO_CONTEXT LowIoContext
;
263 PWCH AlsoCanonicalNameBuffer
;
264 PUNICODE_STRING LoudCompletionString
;
266 volatile LONG AcquireReleaseFcbTrackerX
;
267 volatile ULONG TrackerHistoryPointer
;
268 RX_FCBTRACKER_CALLINFO TrackerHistory
[RDBSS_TRACKER_HISTORY_SIZE
];
271 ULONG ShadowCritOwner
;
273 } RX_CONTEXT
, *PRX_CONTEXT
;
277 RX_CONTEXT_FLAG_FROM_POOL
= 0x00000001,
278 RX_CONTEXT_FLAG_WAIT
= 0x00000002,
279 RX_CONTEXT_FLAG_WRITE_THROUGH
= 0x00000004,
280 RX_CONTEXT_FLAG_FLOPPY
= 0x00000008,
281 RX_CONTEXT_FLAG_RECURSIVE_CALL
= 0x00000010,
282 RX_CONTEXT_FLAG_THIS_DEVICE_TOP_LEVEL
= 0x00000020,
283 RX_CONTEXT_FLAG_DEFERRED_WRITE
= 0x00000040,
284 RX_CONTEXT_FLAG_VERIFY_READ
= 0x00000080,
285 RX_CONTEXT_FLAG_STACK_IO_CONTEZT
= 0x00000100,
286 RX_CONTEXT_FLAG_IN_FSP
= 0x00000200,
287 RX_CONTEXT_FLAG_CREATE_MAILSLOT
= 0x00000400,
288 RX_CONTEXT_FLAG_MAILSLOT_REPARSE
= 0x00000800,
289 RX_CONTEXT_FLAG_ASYNC_OPERATION
= 0x00001000,
290 RX_CONTEXT_FLAG_NO_COMPLETE_FROM_FSP
= 0x00002000,
291 RX_CONTEXT_FLAG_POST_ON_STABLE_CONDITION
= 0x00004000,
292 RX_CONTEXT_FLAG_FSP_DELAYED_OVERFLOW_QUEUE
= 0x00008000,
293 RX_CONTEXT_FLAG_FSP_CRITICAL_OVERFLOW_QUEUE
= 0x00010000,
294 RX_CONTEXT_FLAG_MINIRDR_INVOKED
= 0x00020000,
295 RX_CONTEXT_FLAG_WAITING_FOR_RESOURCE
= 0x00040000,
296 RX_CONTEXT_FLAG_CANCELLED
= 0x00080000,
297 RX_CONTEXT_FLAG_SYNC_EVENT_WAITERS
= 0x00100000,
298 RX_CONTEXT_FLAG_NO_PREPOSTING_NEEDED
= 0x00200000,
299 RX_CONTEXT_FLAG_BYPASS_VALIDOP_CHECK
= 0x00400000,
300 RX_CONTEXT_FLAG_BLOCKED_PIPE_RESUME
= 0x00800000,
301 RX_CONTEXT_FLAG_IN_SERIALIZATION_QUEUE
= 0x01000000,
302 RX_CONTEXT_FLAG_NO_EXCEPTION_BREAKPOINT
= 0x02000000,
303 RX_CONTEXT_FLAG_NEEDRECONNECT
= 0x04000000,
304 RX_CONTEXT_FLAG_MUST_SUCCEED
= 0x08000000,
305 RX_CONTEXT_FLAG_MUST_SUCCEED_NONBLOCKING
= 0x10000000,
306 RX_CONTEXT_FLAG_MUST_SUCCEED_ALLOCATED
= 0x20000000,
307 RX_CONTEXT_FLAG_MINIRDR_INITIATED
= 0x80000000,
312 RX_CONTEXT_CREATE_FLAG_UNC_NAME
= 0x1,
313 RX_CONTEXT_CREATE_FLAG_STRIPPED_TRAILING_BACKSLASH
= 0x2,
314 RX_CONTEXT_CREATE_FLAG_ADDEDBACKSLASH
= 0x4,
315 RX_CONTEXT_CREATE_FLAG_REPARSE
= 0x8,
316 RX_CONTEXT_CREATE_FLAG_SPECIAL_PATH
= 0x10,
317 } RX_CONTEXT_CREATE_FLAGS
;
320 RXCONTEXT_FLAG4LOWIO_PIPE_OPERATION
= 0x1,
321 RXCONTEXT_FLAG4LOWIO_PIPE_SYNC_OPERATION
= 0x2,
322 RXCONTEXT_FLAG4LOWIO_READAHEAD
= 0x4,
323 RXCONTEXT_FLAG4LOWIO_THIS_READ_ENLARGED
= 0x8,
324 RXCONTEXT_FLAG4LOWIO_THIS_IO_BUFFERED
= 0x10,
325 RXCONTEXT_FLAG4LOWIO_LOCK_FCB_RESOURCE_HELD
= 0x20,
326 RXCONTEXT_FLAG4LOWIO_LOCK_WAS_QUEUED_IN_LOCKMANAGER
= 0x40,
327 RXCONTEXT_FLAG4LOWIO_THIS_IO_FAST
= 0x80,
328 RXCONTEXT_FLAG4LOWIO_LOCK_OPERATION_COMPLETED
= 0x100,
329 RXCONTEXT_FLAG4LOWIO_LOCK_BUFFERED_ON_ENTRY
= 0x200
330 } RX_CONTEXT_LOWIO_FLAGS
;
334 __RxItsTheSameContext(
335 _In_ PRX_CONTEXT RxContext
,
336 _In_ ULONG CapturedRxContextSerialNumber
,
339 #define RxItsTheSameContext() { __RxItsTheSameContext(RxContext, CapturedRxContextSerialNumber, __LINE__, __FILE__); }
341 #define RxItsTheSameContext() { NOTHING; }
344 extern NPAGED_LOOKASIDE_LIST RxContextLookasideList
;
346 #define MINIRDR_CALL_THROUGH(STATUS, DISPATCH, FUNC, ARGLIST) \
349 ASSERT(NodeType(DISPATCH) == RDBSS_NTC_MINIRDR_DISPATCH); \
350 if (DISPATCH->FUNC == NULL) \
352 STATUS = STATUS_NOT_IMPLEMENTED; \
356 STATUS = DISPATCH->FUNC ARGLIST; \
360 #define MINIRDR_CALL(STATUS, CONTEXT, DISPATCH, FUNC, ARGLIST) \
363 ASSERT(NodeType(DISPATCH) == RDBSS_NTC_MINIRDR_DISPATCH); \
364 if (DISPATCH->FUNC == NULL) \
366 STATUS = STATUS_NOT_IMPLEMENTED; \
370 if (!BooleanFlagOn((CONTEXT)->Flags, RX_CONTEXT_FLAG_CANCELLED)) \
372 RtlZeroMemory(&((CONTEXT)->MRxContext[0]), \
373 sizeof((CONTEXT)->MRxContext)); \
374 STATUS = DISPATCH->FUNC ARGLIST; \
378 STATUS = STATUS_CANCELLED; \
383 #define RxWaitSync(RxContext) \
384 (RxContext)->Flags |= RX_CONTEXT_FLAG_SYNC_EVENT_WAITERS; \
385 KeWaitForSingleObject(&(RxContext)->SyncEvent, \
386 Executive, KernelMode, FALSE, NULL)
388 #define RxSignalSynchronousWaiter(RxContext) \
389 (RxContext)->Flags &= ~RX_CONTEXT_FLAG_SYNC_EVENT_WAITERS; \
390 KeSetEvent(&(RxContext)->SyncEvent, 0, FALSE)
392 #define RxInsertContextInSerializationQueue(SerializationQueue, RxContext) \
393 (RxContext)->Flags |= RX_CONTEXT_FLAG_IN_SERIALIZATION_QUEUE; \
394 InsertTailList(SerializationQueue, &((RxContext)->RxContextSerializationQLinks))
398 RxRemoveFirstContextFromSerializationQueue(
399 PLIST_ENTRY SerializationQueue
)
401 if (IsListEmpty(SerializationQueue
))
407 PRX_CONTEXT Context
= CONTAINING_RECORD(SerializationQueue
->Flink
,
409 RxContextSerializationQLinks
);
411 RemoveEntryList(SerializationQueue
->Flink
);
413 Context
->RxContextSerializationQLinks
.Flink
= NULL
;
414 Context
->RxContextSerializationQLinks
.Blink
= NULL
;
420 #define RxTransferList(Destination, Source) \
421 if (IsListEmpty((Source))) \
422 InitializeListHead((Destination)); \
425 *(Destination) = *(Source); \
426 (Destination)->Flink->Blink = (Destination); \
427 (Destination)->Blink->Flink = (Destination); \
428 InitializeListHead((Source)); \
431 #define RxTransferListWithMutex(Destination, Source, Mutex) \
433 ExAcquireFastMutex(Mutex); \
434 RxTransferList(Destination, Source); \
435 ExReleaseFastMutex(Mutex); \
439 RxCancelNotifyChangeDirectoryRequestsForVNetRoot(
440 PV_NET_ROOT VNetRoot
,
441 BOOLEAN ForceFilesClosed
);
444 RxCancelNotifyChangeDirectoryRequestsForFobx(
452 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
453 _In_ ULONG InitialContextFlags
,
454 _Inout_ PRX_CONTEXT RxContext
);
460 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
461 _In_ ULONG InitialContextFlags
);
465 RxPrepareContextForReuse(
466 _Inout_ PRX_CONTEXT RxContext
);
470 RxDereferenceAndDeleteRxContext_Real(
471 _In_ PRX_CONTEXT RxContext
);
474 #define RxDereferenceAndDeleteRxContext(RXCONTEXT) \
476 RxDereferenceAndDeleteRxContext_Real((RXCONTEXT)); \
477 (RXCONTEXT) = NULL; \
480 #define RxDereferenceAndDeleteRxContext(RXCONTEXT) \
482 RxDereferenceAndDeleteRxContext_Real((RXCONTEXT)); \
488 RxResumeBlockedOperations_Serially(
489 _Inout_ PRX_CONTEXT RxContext
,
490 _Inout_ PLIST_ENTRY BlockingIoQ
);
493 RxResumeBlockedOperations_ALL(
494 _Inout_ PRX_CONTEXT RxContext
);