1 #ifndef _RX_CONTEXT_STRUCT_DEFINED_ 2 #define _RX_CONTEXT_STRUCT_DEFINED_ 4 #define RX_TOPLEVELIRP_CONTEXT_SIGNATURE 'LTxR' 38 #define RxInitializeTopLevelIrpContext(a,b,c) __RxInitializeTopLevelIrpContext(a,b,c,0) 57 typedef struct _RX_FCBTRACKER_CALLINFO
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) 270 volatile LONG AcquireReleaseFcbTrackerX;
271 volatile ULONG TrackerHistoryPointer;
272 RX_FCBTRACKER_CALLINFO TrackerHistory[RDBSS_TRACKER_HISTORY_SIZE];
275 ULONG ShadowCritOwner;
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) 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) 365 _In_ ULONG CapturedRxContextSerialNumber,
368 #define RxItsTheSameContext() { __RxItsTheSameContext(RxContext, CapturedRxContextSerialNumber, __LINE__, __FILE__); } 370 #define RxItsTheSameContext() { NOTHING; } 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)) 438 RxContextSerializationQLinks);
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); \ 508 #define RxDereferenceAndDeleteRxContext(RXCONTEXT) \ 510 RxDereferenceAndDeleteRxContext_Real((RXCONTEXT)); \ 511 (RXCONTEXT) = NULL; \ 514 #define RxDereferenceAndDeleteRxContext(RXCONTEXT) \ 516 RxDereferenceAndDeleteRxContext_Real((RXCONTEXT)); \ 532 #if (_WIN32_WINNT >= 0x0600)
PRDBSS_DEVICE_OBJECT RxGetTopDeviceObjectIfRdbssIrp(VOID)
VOID NTAPI RxResumeBlockedOperations_Serially(_Inout_ PRX_CONTEXT RxContext, _Inout_ PLIST_ENTRY BlockingIoQ)
RX_WORK_QUEUE_ITEM WorkQueueItem
NT_CREATE_PARAMETERS NtCreateParameters
struct _RX_CONTEXT RX_CONTEXT
VOID NTAPI RxInitializeContext(_In_ PIRP Irp, _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject, _In_ ULONG InitialContextFlags, _Inout_ PRX_CONTEXT RxContext)
BOOLEAN FcbPagingIoResourceAcquired
BOOLEAN TryForScavengingOnSharingViolation
struct _RX_CONTEXT::@2100::@2119 SetQuota
NTSTATUS RxCancelNotifyChangeDirectoryRequestsForVNetRoot(PV_NET_ROOT VNetRoot, BOOLEAN ForceFilesClosed)
struct _RX_CONTEXT::@2100::@2114 NotifyChangeDirectory
FILE_INFORMATION_CLASS FileInformationClass
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
LARGE_INTEGER AllocationSize
PWCH AlsoCanonicalNameBuffer
LIST_ENTRY RxContextSerializationQLinks
BOOLEAN ReturnSingleEntry
VOID NTAPI RxPrepareContextForReuse(_Inout_ PRX_CONTEXT RxContext)
UNICODE_STRING UserDomainName
VOID RxCancelBlockingOperation(_Inout_ PRX_CONTEXT RxContext)
struct _RX_CONTEXT::@2100::@2117 SetSecurity
LIST_ENTRY OverflowListEntry
PMRX_V_NET_ROOT pVNetRoot
PIO_SECURITY_CONTEXT pSecurityContext
LIST_ENTRY ContextListEntry
BOOLEAN TreeConnectOpenDeferred
volatile PVOID LockManagerContext
struct _RX_TOPLEVELIRP_CONTEXT * PRX_TOPLEVELIRP_CONTEXT
PIO_SECURITY_CONTEXT SecurityContext
NPAGED_LOOKASIDE_LIST RxContextLookasideList
RX_SCAVENGER_ENTRY ScavengerEntry
PVOID StoredStatusAlignment
VOID RxResumeBlockedOperations_ALL(_Inout_ PRX_CONTEXT RxContext)
PIRP RxGetTopIrpIfRdbssIrp(VOID)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
VOID RxCancelNotifyChangeDirectoryRequestsForFobx(PFOBX Fobx)
PNON_PAGED_FCB NonPagedFcb
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
struct _RX_CONTEXT::@2098::@2106 Info
PUNICODE_STRING LoudCompletionString
PETHREAD LastExecutionThread
struct _NT_CREATE_PARAMETERS NT_CREATE_PARAMETERS
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
PRX_DISPATCH ResumeRoutine
NODE_BYTE_SIZE NodeByteSize
DWORD SECURITY_INFORMATION
struct _RX_TOPLEVELIRP_CONTEXT RX_TOPLEVELIRP_CONTEXT
enum _SECURITY_IMPERSONATION_LEVEL SECURITY_IMPERSONATION_LEVEL
FS_INFORMATION_CLASS FsInformationClass
struct _RX_CONTEXT::@2098::@2107 PrefixClaim
VOID NTAPI RxReinitializeContext(_Inout_ PRX_CONTEXT RxContext)
NTSTATUS(NTAPI * PRX_DISPATCH)(_In_ PRX_CONTEXT RxContext)
struct _RX_CONTEXT::@2100::@2116 QuerySecurity
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
VOID RxUnwindTopLevelIrp(_Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext)
enum _FSINFOCLASS FS_INFORMATION_CLASS
PMRX_CALLDOWN MRxCancelRoutine
ACCESS_MASK DesiredAccess
enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS
struct _LIST_ENTRY * Flink
struct _DFS_NAME_CONTEXT_ * PDFS_NAME_CONTEXT
struct _RX_CONTEXT::@2100::@2115 QueryEa
_Must_inspect_result_ _In_ ULONG Flags
NODE_TYPE_CODE NodeTypeCode
struct _RX_CONTEXT::@2100::@2113 QueryDirectory
VOID __RxItsTheSameContext(_In_ PRX_CONTEXT RxContext, _In_ ULONG CapturedRxContextSerialNumber, _In_ ULONG Line, _In_ PCSTR File)
ULONGLONG ForceLonglongAligmentDummyField
struct _RX_CONTEXT * PRX_CONTEXT
struct _RX_CONTEXT::@2100::@2118 QueryQuota
PIO_STACK_LOCATION CurrentIrpSp
ULONG_PTR InformationToReturn
PFILE_GET_QUOTA_INFORMATION SidList
PVOID MRxContext[MRX_CONTEXT_FIELD_COUNT]
BOOLEAN RxTryToBecomeTheTopLevelIrp(_Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext, _In_ PIRP Irp, _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject, _In_ BOOLEAN ForceTopLevel)
PFAST_MUTEX BlockedOpsMutex
IO_STATUS_BLOCK IoStatusBlock
UCHAR MustSucceedDescriptorNumber
PRDBSS_DEVICE_OBJECT RxDeviceObject
#define MRX_CONTEXT_FIELD_COUNT
PVOID WriteOnlyOpenRetryContext
PRX_PREFIX_ENTRY NetNamePrefixEntry
PDFS_NAME_CONTEXT DfsNameContext
FORCEINLINE PRX_CONTEXT RxRemoveFirstContextFromSerializationQueue(PLIST_ENTRY SerializationQueue)
struct _FileName FileName
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 LineNumber
UNICODE_STRING SuppliedPathName
NTSTATUS(NTAPI * PMRX_CALLDOWN)(_Inout_ PRX_CONTEXT RxContext)
ULONG ReturnedCreateInformation
volatile ULONG ReferenceCount
NET_ROOT_TYPE NetRootType
BOOLEAN RxIsThisTheTopLevelIrp(_In_ PIRP Irp)
VOID NTAPI RxDereferenceAndDeleteRxContext_Real(_In_ PRX_CONTEXT RxContext)
struct tagContext Context
LIST_ENTRY BlockedOperations
LOWIO_CONTEXT LowIoContext
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
VOID RxRemoveOperationFromBlockingQueue(_Inout_ PRX_CONTEXT RxContext)
BOOLEAN ScavengingAlreadyTried
VOID __RxInitializeTopLevelIrpContext(_Inout_ PRX_TOPLEVELIRP_CONTEXT TopLevelContext, _In_ PIRP Irp, _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject, _In_ ULONG Flags)
SECURITY_INFORMATION SecurityInformation
UNICODE_STRING TransportName
PSECURITY_DESCRIPTOR SecurityDescriptor
struct _NT_CREATE_PARAMETERS * PNT_CREATE_PARAMETERS
PRX_CONTEXT NTAPI RxCreateRxContext(_In_ PIRP Irp, _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject, _In_ ULONG InitialContextFlags)
struct _RX_CONTEXT::@2100::@2112 Create
FAST_MUTEX RxContextPerFileSerializationMutex
PDEVICE_OBJECT RealDevice
PMRX_SRV_OPEN pRelevantSrvOpen
struct _RX_CONTEXT::@2100::@2120 DosVolumeFunction
BOOLEAN FcbResourceAcquired
PRDBSS_DEVICE_OBJECT RxDeviceObject
BOOLEAN ThisIsATreeConnectOpen