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 RxGetTopIrpIfRdbssIrp(
45 RxGetTopDeviceObjectIfRdbssIrp(
50 _Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext
);
53 RxIsThisTheTopLevelIrp(
57 typedef struct _RX_FCBTRACKER_CALLINFO
60 USHORT SavedTrackerValue
;
64 } RX_FCBTRACKER_CALLINFO
, *PRX_FCBTRACKER_CALLINFO
;
65 #define RDBSS_TRACKER_HISTORY_SIZE 32
68 #define MRX_CONTEXT_FIELD_COUNT 4
70 #if (_WIN32_WINNT >= 0x0600)
73 (NTAPI
*PRX_DISPATCH
) (
74 _In_ PRX_CONTEXT RxContext
,
79 (NTAPI
*PRX_DISPATCH
) (
80 _In_ PRX_CONTEXT RxContext
);
83 typedef struct _DFS_NAME_CONTEXT_
*PDFS_NAME_CONTEXT
;
85 typedef struct _NT_CREATE_PARAMETERS
87 ACCESS_MASK DesiredAccess
;
88 LARGE_INTEGER AllocationSize
;
93 PIO_SECURITY_CONTEXT SecurityContext
;
94 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
96 PDFS_NAME_CONTEXT DfsNameContext
;
97 } NT_CREATE_PARAMETERS
, *PNT_CREATE_PARAMETERS
;
99 typedef struct _RX_CONTEXT
101 NODE_TYPE_CODE NodeTypeCode
;
102 NODE_BYTE_SIZE NodeByteSize
;
103 volatile ULONG ReferenceCount
;
104 LIST_ENTRY ContextListEntry
;
107 BOOLEAN PendingReturned
;
109 PDEVICE_OBJECT RealDevice
;
111 PIO_STACK_LOCATION CurrentIrpSp
;
114 PMRX_SRV_OPEN pRelevantSrvOpen
;
115 PNON_PAGED_FCB NonPagedFcb
;
116 PRDBSS_DEVICE_OBJECT RxDeviceObject
;
117 PETHREAD OriginalThread
;
118 PETHREAD LastExecutionThread
;
119 volatile PVOID LockManagerContext
;
120 PVOID RdbssDbgExtension
;
121 RX_SCAVENGER_ENTRY ScavengerEntry
;
123 ULONG FobxSerialNumber
;
125 BOOLEAN FcbResourceAcquired
;
126 BOOLEAN FcbPagingIoResourceAcquired
;
127 UCHAR MustSucceedDescriptorNumber
;
134 NTSTATUS StoredStatus
;
135 PVOID StoredStatusAlignment
;
137 ULONG_PTR InformationToReturn
;
139 IO_STATUS_BLOCK IoStatusBlock
;
143 ULONGLONG ForceLonglongAligmentDummyField
;
144 PVOID MRxContext
[MRX_CONTEXT_FIELD_COUNT
];
146 PVOID WriteOnlyOpenRetryContext
;
147 PMRX_CALLDOWN MRxCancelRoutine
;
148 PRX_DISPATCH ResumeRoutine
;
149 RX_WORK_QUEUE_ITEM WorkQueueItem
;
150 LIST_ENTRY OverflowListEntry
;
152 LIST_ENTRY BlockedOperations
;
153 PFAST_MUTEX BlockedOpsMutex
;
154 LIST_ENTRY RxContextSerializationQLinks
;
161 FS_INFORMATION_CLASS FsInformationClass
;
162 FILE_INFORMATION_CLASS FileInformationClass
;
168 LONG LengthRemaining
;
170 BOOLEAN ReplaceIfExists
;
175 UNICODE_STRING SuppliedPathName
;
176 NET_ROOT_TYPE NetRootType
;
177 PIO_SECURITY_CONTEXT pSecurityContext
;
184 NT_CREATE_PARAMETERS NtCreateParameters
;
185 ULONG ReturnedCreateInformation
;
186 PWCH CanonicalNameBuffer
;
187 PRX_PREFIX_ENTRY NetNamePrefixEntry
;
188 PMRX_SRV_CALL pSrvCall
;
189 PMRX_NET_ROOT pNetRoot
;
190 PMRX_V_NET_ROOT pVNetRoot
;
196 ULONG PipeCompletionMode
;
201 BOOLEAN TryForScavengingOnSharingViolation
;
202 BOOLEAN ScavengingAlreadyTried
;
203 BOOLEAN ThisIsATreeConnectOpen
;
204 BOOLEAN TreeConnectOpenDeferred
;
205 UNICODE_STRING TransportName
;
206 UNICODE_STRING UserName
;
207 UNICODE_STRING Password
;
208 UNICODE_STRING UserDomainName
;
214 BOOLEAN ReturnSingleEntry
;
215 BOOLEAN IndexSpecified
;
216 BOOLEAN InitialQuery
;
220 PMRX_V_NET_ROOT pVNetRoot
;
221 } NotifyChangeDirectory
;
225 ULONG UserEaListLength
;
228 BOOLEAN ReturnSingleEntry
;
229 BOOLEAN IndexSpecified
;
233 SECURITY_INFORMATION SecurityInformation
;
238 SECURITY_INFORMATION SecurityInformation
;
239 PSECURITY_DESCRIPTOR SecurityDescriptor
;
245 PFILE_GET_QUOTA_INFORMATION SidList
;
248 BOOLEAN ReturnSingleEntry
;
249 BOOLEAN IndexSpecified
;
257 PV_NET_ROOT VNetRoot
;
263 LOWIO_CONTEXT LowIoContext
;
267 PWCH AlsoCanonicalNameBuffer
;
268 PUNICODE_STRING LoudCompletionString
;
270 volatile LONG AcquireReleaseFcbTrackerX
;
271 volatile ULONG TrackerHistoryPointer
;
272 RX_FCBTRACKER_CALLINFO TrackerHistory
[RDBSS_TRACKER_HISTORY_SIZE
];
275 ULONG ShadowCritOwner
;
277 } RX_CONTEXT
, *PRX_CONTEXT
;
281 RX_CONTEXT_FLAG_FROM_POOL
= 0x00000001,
282 RX_CONTEXT_FLAG_WAIT
= 0x00000002,
283 RX_CONTEXT_FLAG_WRITE_THROUGH
= 0x00000004,
284 RX_CONTEXT_FLAG_FLOPPY
= 0x00000008,
285 RX_CONTEXT_FLAG_RECURSIVE_CALL
= 0x00000010,
286 RX_CONTEXT_FLAG_THIS_DEVICE_TOP_LEVEL
= 0x00000020,
287 RX_CONTEXT_FLAG_DEFERRED_WRITE
= 0x00000040,
288 RX_CONTEXT_FLAG_VERIFY_READ
= 0x00000080,
289 RX_CONTEXT_FLAG_STACK_IO_CONTEZT
= 0x00000100,
290 RX_CONTEXT_FLAG_IN_FSP
= 0x00000200,
291 RX_CONTEXT_FLAG_CREATE_MAILSLOT
= 0x00000400,
292 RX_CONTEXT_FLAG_MAILSLOT_REPARSE
= 0x00000800,
293 RX_CONTEXT_FLAG_ASYNC_OPERATION
= 0x00001000,
294 RX_CONTEXT_FLAG_NO_COMPLETE_FROM_FSP
= 0x00002000,
295 RX_CONTEXT_FLAG_POST_ON_STABLE_CONDITION
= 0x00004000,
296 RX_CONTEXT_FLAG_FSP_DELAYED_OVERFLOW_QUEUE
= 0x00008000,
297 RX_CONTEXT_FLAG_FSP_CRITICAL_OVERFLOW_QUEUE
= 0x00010000,
298 RX_CONTEXT_FLAG_MINIRDR_INVOKED
= 0x00020000,
299 RX_CONTEXT_FLAG_WAITING_FOR_RESOURCE
= 0x00040000,
300 RX_CONTEXT_FLAG_CANCELLED
= 0x00080000,
301 RX_CONTEXT_FLAG_SYNC_EVENT_WAITERS
= 0x00100000,
302 RX_CONTEXT_FLAG_NO_PREPOSTING_NEEDED
= 0x00200000,
303 RX_CONTEXT_FLAG_BYPASS_VALIDOP_CHECK
= 0x00400000,
304 RX_CONTEXT_FLAG_BLOCKED_PIPE_RESUME
= 0x00800000,
305 RX_CONTEXT_FLAG_IN_SERIALIZATION_QUEUE
= 0x01000000,
306 RX_CONTEXT_FLAG_NO_EXCEPTION_BREAKPOINT
= 0x02000000,
307 RX_CONTEXT_FLAG_NEEDRECONNECT
= 0x04000000,
308 RX_CONTEXT_FLAG_MUST_SUCCEED
= 0x08000000,
309 RX_CONTEXT_FLAG_MUST_SUCCEED_NONBLOCKING
= 0x10000000,
310 RX_CONTEXT_FLAG_MUST_SUCCEED_ALLOCATED
= 0x20000000,
311 RX_CONTEXT_FLAG_MINIRDR_INITIATED
= 0x80000000,
314 #define RX_CONTEXT_PRESERVED_FLAGS (RX_CONTEXT_FLAG_FROM_POOL | \
315 RX_CONTEXT_FLAG_MUST_SUCCEED_ALLOCATED | \
316 RX_CONTEXT_FLAG_IN_FSP)
318 #define RX_CONTEXT_INITIALIZATION_FLAGS (RX_CONTEXT_FLAG_WAIT | \
319 RX_CONTEXT_FLAG_MUST_SUCCEED | \
320 RX_CONTEXT_FLAG_MUST_SUCCEED_NONBLOCKING)
324 RX_CONTEXT_CREATE_FLAG_UNC_NAME
= 0x1,
325 RX_CONTEXT_CREATE_FLAG_STRIPPED_TRAILING_BACKSLASH
= 0x2,
326 RX_CONTEXT_CREATE_FLAG_ADDEDBACKSLASH
= 0x4,
327 RX_CONTEXT_CREATE_FLAG_REPARSE
= 0x8,
328 RX_CONTEXT_CREATE_FLAG_SPECIAL_PATH
= 0x10,
329 } RX_CONTEXT_CREATE_FLAGS
;
332 RXCONTEXT_FLAG4LOWIO_PIPE_OPERATION
= 0x1,
333 RXCONTEXT_FLAG4LOWIO_PIPE_SYNC_OPERATION
= 0x2,
334 RXCONTEXT_FLAG4LOWIO_READAHEAD
= 0x4,
335 RXCONTEXT_FLAG4LOWIO_THIS_READ_ENLARGED
= 0x8,
336 RXCONTEXT_FLAG4LOWIO_THIS_IO_BUFFERED
= 0x10,
337 RXCONTEXT_FLAG4LOWIO_LOCK_FCB_RESOURCE_HELD
= 0x20,
338 RXCONTEXT_FLAG4LOWIO_LOCK_WAS_QUEUED_IN_LOCKMANAGER
= 0x40,
339 RXCONTEXT_FLAG4LOWIO_THIS_IO_FAST
= 0x80,
340 RXCONTEXT_FLAG4LOWIO_LOCK_OPERATION_COMPLETED
= 0x100,
341 RXCONTEXT_FLAG4LOWIO_LOCK_BUFFERED_ON_ENTRY
= 0x200
342 } RX_CONTEXT_LOWIO_FLAGS
;
345 #define RxSaveAndSetExceptionNoBreakpointFlag(R, F) \
347 F = FlagOn(R->Flags, RX_CONTEXT_FLAG_NO_EXCEPTION_BREAKPOINT); \
348 SetFlag(R->Flags, RX_CONTEXT_FLAG_NO_EXCEPTION_BREAKPOINT); \
351 #define RxRestoreExceptionNoBreakpointFlag(R, F) \
353 ClearFlag(R->Flags, RX_CONTEXT_FLAG_NO_EXCEPTION_BREAKPOINT); \
354 SetFlag(R->Flags, F); \
357 #define RxSaveAndSetExceptionNoBreakpointFlag(R, F)
358 #define RxRestoreExceptionNoBreakpointFlag(R, F)
363 __RxItsTheSameContext(
364 _In_ PRX_CONTEXT RxContext
,
365 _In_ ULONG CapturedRxContextSerialNumber
,
368 #define RxItsTheSameContext() { __RxItsTheSameContext(RxContext, CapturedRxContextSerialNumber, __LINE__, __FILE__); }
370 #define RxItsTheSameContext() { NOTHING; }
373 extern NPAGED_LOOKASIDE_LIST RxContextLookasideList
;
375 #define MINIRDR_CALL_THROUGH(STATUS, DISPATCH, FUNC, ARGLIST) \
378 ASSERT(NodeType(DISPATCH) == RDBSS_NTC_MINIRDR_DISPATCH); \
379 if (DISPATCH->FUNC == NULL) \
381 STATUS = STATUS_NOT_IMPLEMENTED; \
385 STATUS = DISPATCH->FUNC ARGLIST; \
389 #define MINIRDR_CALL(STATUS, CONTEXT, DISPATCH, FUNC, ARGLIST) \
392 ASSERT(NodeType(DISPATCH) == RDBSS_NTC_MINIRDR_DISPATCH); \
393 if (DISPATCH->FUNC == NULL) \
395 STATUS = STATUS_NOT_IMPLEMENTED; \
399 if (!BooleanFlagOn((CONTEXT)->Flags, RX_CONTEXT_FLAG_CANCELLED)) \
401 RtlZeroMemory(&((CONTEXT)->MRxContext[0]), \
402 sizeof((CONTEXT)->MRxContext)); \
403 STATUS = DISPATCH->FUNC ARGLIST; \
407 STATUS = STATUS_CANCELLED; \
412 #define RxWaitSync(RxContext) \
413 (RxContext)->Flags |= RX_CONTEXT_FLAG_SYNC_EVENT_WAITERS; \
414 KeWaitForSingleObject(&(RxContext)->SyncEvent, \
415 Executive, KernelMode, FALSE, NULL)
417 #define RxSignalSynchronousWaiter(RxContext) \
418 (RxContext)->Flags &= ~RX_CONTEXT_FLAG_SYNC_EVENT_WAITERS; \
419 KeSetEvent(&(RxContext)->SyncEvent, 0, FALSE)
421 #define RxInsertContextInSerializationQueue(SerializationQueue, RxContext) \
422 (RxContext)->Flags |= RX_CONTEXT_FLAG_IN_SERIALIZATION_QUEUE; \
423 InsertTailList(SerializationQueue, &((RxContext)->RxContextSerializationQLinks))
427 RxRemoveFirstContextFromSerializationQueue(
428 PLIST_ENTRY SerializationQueue
)
430 if (IsListEmpty(SerializationQueue
))
436 PRX_CONTEXT Context
= CONTAINING_RECORD(SerializationQueue
->Flink
,
438 RxContextSerializationQLinks
);
440 RemoveEntryList(SerializationQueue
->Flink
);
442 Context
->RxContextSerializationQLinks
.Flink
= NULL
;
443 Context
->RxContextSerializationQLinks
.Blink
= NULL
;
449 #define RxTransferList(Destination, Source) \
450 if (IsListEmpty((Source))) \
451 InitializeListHead((Destination)); \
454 *(Destination) = *(Source); \
455 (Destination)->Flink->Blink = (Destination); \
456 (Destination)->Blink->Flink = (Destination); \
457 InitializeListHead((Source)); \
460 #define RxTransferListWithMutex(Destination, Source, Mutex) \
462 ExAcquireFastMutex(Mutex); \
463 RxTransferList(Destination, Source); \
464 ExReleaseFastMutex(Mutex); \
468 RxCancelNotifyChangeDirectoryRequestsForVNetRoot(
469 PV_NET_ROOT VNetRoot
,
470 BOOLEAN ForceFilesClosed
);
473 RxCancelNotifyChangeDirectoryRequestsForFobx(
481 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
482 _In_ ULONG InitialContextFlags
,
483 _Inout_ PRX_CONTEXT RxContext
);
489 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
490 _In_ ULONG InitialContextFlags
);
494 RxPrepareContextForReuse(
495 _Inout_ PRX_CONTEXT RxContext
);
499 RxDereferenceAndDeleteRxContext_Real(
500 _In_ PRX_CONTEXT RxContext
);
504 RxReinitializeContext(
505 _Inout_ PRX_CONTEXT RxContext
);
508 #define RxDereferenceAndDeleteRxContext(RXCONTEXT) \
510 RxDereferenceAndDeleteRxContext_Real((RXCONTEXT)); \
511 (RXCONTEXT) = NULL; \
514 #define RxDereferenceAndDeleteRxContext(RXCONTEXT) \
516 RxDereferenceAndDeleteRxContext_Real((RXCONTEXT)); \
522 RxResumeBlockedOperations_Serially(
523 _Inout_ PRX_CONTEXT RxContext
,
524 _Inout_ PLIST_ENTRY BlockingIoQ
);
527 RxResumeBlockedOperations_ALL(
528 _Inout_ PRX_CONTEXT RxContext
);