11 #define RxLogFailure(DO, Originator, Event, Status) \
12 RxLogEventDirect(DO, Originator, Event, Status, __LINE__)
17 _In_ PRDBSS_DEVICE_OBJECT DeviceObject
,
18 _In_ PUNICODE_STRING OriginatorId
,
25 RxLogEventWithAnnotation(
26 _In_ PRDBSS_DEVICE_OBJECT DeviceObject
,
29 _In_ PVOID DataBuffer
,
30 _In_ USHORT DataBufferLength
,
31 _In_ PUNICODE_STRING Annotation
,
32 _In_ ULONG AnnotationCount
);
36 _In_ PRX_CONTEXT RxContext
);
39 RxpPrepareCreateContextForReuse(
40 _In_ PRX_CONTEXT RxContext
);
43 RxLowIoCompletionTail(
44 _In_ PRX_CONTEXT RxContext
);
48 _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
);
52 _In_ PIO_STACK_LOCATION IrpSp
);
54 #if (_WIN32_WINNT >= 0x0600)
56 RxFindOrCreateConnections(
57 _In_ PRX_CONTEXT RxContext
,
59 _In_ PUNICODE_STRING CanonicalName
,
60 _In_ NET_ROOT_TYPE NetRootType
,
61 _In_ BOOLEAN TreeConnect
,
62 _Out_ PUNICODE_STRING LocalNetRootName
,
63 _Out_ PUNICODE_STRING FilePathName
,
64 _Inout_ PLOCK_HOLDING_STATE LockState
,
65 _In_ PRX_CONNECTION_ID RxConnectionId
);
68 RxFindOrCreateConnections(
69 _In_ PRX_CONTEXT RxContext
,
70 _In_ PUNICODE_STRING CanonicalName
,
71 _In_ NET_ROOT_TYPE NetRootType
,
72 _Out_ PUNICODE_STRING LocalNetRootName
,
73 _Out_ PUNICODE_STRING FilePathName
,
74 _Inout_ PLOCK_HOLDING_STATE LockState
,
75 _In_ PRX_CONNECTION_ID RxConnectionId
);
78 typedef enum _RX_NAME_CONJURING_METHODS
82 VNetRoot_As_DriveLetter
83 } RX_NAME_CONJURING_METHODS
;
86 RxConjureOriginalName(
89 _Out_ PULONG ActualNameLength
,
90 _Out_writes_bytes_( *LengthRemaining
) PWCHAR OriginalName
,
91 _Inout_ PLONG LengthRemaining
,
92 _In_ RX_NAME_CONJURING_METHODS NameConjuringMethod
);
94 #if (_WIN32_WINNT >= 0x0600)
97 _In_ PRX_CONTEXT RxContext
,
103 _In_ PRX_CONTEXT RxContext
);
106 #if (_WIN32_WINNT >= 0x0600)
109 _In_ PRX_CONTEXT RxContext
,
111 _In_ LOCK_OPERATION Operation
,
112 _In_ ULONG BufferLength
);
116 _In_ PRX_CONTEXT RxContext
,
121 _In_ PRX_CONTEXT RxContext
,
122 _In_ LOCK_OPERATION Operation
,
123 _In_ ULONG BufferLength
);
127 _In_ PRX_CONTEXT RxContext
);
130 #define FCB_MODE_EXCLUSIVE 1
131 #define FCB_MODE_SHARED 2
132 #define FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE 3
133 #define FCB_MODE_SHARED_STARVE_EXCLUSIVE 4
135 #define CHANGE_BUFFERING_STATE_CONTEXT ((PRX_CONTEXT)IntToPtr(0xffffffff))
136 #define CHANGE_BUFFERING_STATE_CONTEXT_WAIT ((PRX_CONTEXT)IntToPtr(0xfffffffe))
141 _Inout_opt_ PRX_CONTEXT RxContext
,
145 _In_ ULONG LineNumber
,
147 _In_ ULONG SerialNumber
152 #define RxAcquireExclusiveFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_EXCLUSIVE, __LINE__, __FILE__, 0)
154 #define RxAcquireExclusiveFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_EXCLUSIVE)
157 #define RX_GET_MRX_FCB(F) ((PMRX_FCB)((F)))
160 #define RxAcquireSharedFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED, __LINE__, __FILE__, 0)
162 #define RxAcquireSharedFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED)
166 #define RxAcquireSharedFcbWaitForEx(R, F) __RxAcquireFcb((F),(R), FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE, __LINE__, __FILE__,0)
168 #define RxAcquireSharedFcbWaitForEx(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE)
173 _Inout_opt_ PRX_CONTEXT RxContext
,
174 _Inout_ PMRX_FCB MrxFcb
177 _In_ ULONG LineNumber
,
179 _In_ ULONG SerialNumber
184 #define RxReleaseFcb(R, F) __RxReleaseFcb((R), RX_GET_MRX_FCB(F), __LINE__, __FILE__, 0)
186 #define RxReleaseFcb(R, F) __RxReleaseFcb((R), RX_GET_MRX_FCB(F))
190 __RxReleaseFcbForThread(
191 _Inout_opt_ PRX_CONTEXT RxContext
,
192 _Inout_ PMRX_FCB MrxFcb
,
193 _In_ ERESOURCE_THREAD ResourceThreadId
196 _In_ ULONG LineNumber
,
198 _In_ ULONG SerialNumber
203 #define RxReleaseFcbForThread(R, F, T) __RxReleaseFcbForThread((R), RX_GET_MRX_FCB(F), (T), __LINE__, __FILE__, 0)
205 #define RxReleaseFcbForThread(R, F, T) __RxReleaseFcbForThread((R), RX_GET_MRX_FCB(F), (T))
210 RxTrackerUpdateHistory(
211 _Inout_opt_ PRX_CONTEXT RxContext
,
212 _Inout_ PMRX_FCB MrxFcb
,
213 _In_ ULONG Operation
,
214 _In_ ULONG LineNumber
,
216 _In_ ULONG SerialNumber
);
218 #define RxTrackerUpdateHistory(R, F, O, L, F, S) { NOTHING; }
222 RxTrackPagingIoResource(
223 _Inout_ PVOID Instance
,
228 #define RxIsFcbAcquiredShared(Fcb) ExIsResourceAcquiredSharedLite((Fcb)->Header.Resource)
229 #define RxIsFcbAcquiredExclusive(Fcb) ExIsResourceAcquiredExclusiveLite((Fcb)->Header.Resource)
230 #define RxIsFcbAcquired(Fcb) (ExIsResourceAcquiredSharedLite((Fcb)->Header.Resource) || \
231 ExIsResourceAcquiredExclusiveLite((Fcb)->Header.Resource))
233 #define RxAcquirePagingIoResource(RxContext, Fcb) \
234 ExAcquireResourceExclusiveLite((Fcb)->Header.PagingIoResource, TRUE); \
235 if (RxContext != NULL) \
237 (RxContext)->FcbPagingIoResourceAcquired = TRUE; \
239 RxTrackPagingIoResource(Fcb, 1, __LINE__, __FILE__)
242 #define RxAcquirePagingIoResourceShared(RxContext, Fcb, Flag) \
243 ExAcquireResourceSharedLite((Fcb)->Header.PagingIoResource, Flag); \
246 if (RxContext != NULL) \
248 ((PRX_CONTEXT)RxContext)->FcbPagingIoResourceAcquired = TRUE; \
250 RxTrackPagingIoResource(Fcb, 2, __LINE__, __FILE__); \
253 #define RxAcquirePagingIoResourceShared(RxContext, Fcb, Flag) \
255 BOOLEAN AcquiredFile; \
256 AcquiredFile = ExAcquireResourceSharedLite((Fcb)->Header.PagingIoResource, Flag); \
259 if (RxContext != NULL) \
261 ((PRX_CONTEXT)RxContext)->FcbPagingIoResourceAcquired = TRUE; \
263 RxTrackPagingIoResource(Fcb, 2, __LINE__, __FILE__); \
268 #define RxReleasePagingIoResource(RxContext, Fcb) \
269 RxTrackPagingIoResource(Fcb, 3, __LINE__, __FILE__); \
270 if (RxContext != NULL) \
272 (RxContext)->FcbPagingIoResourceAcquired = FALSE; \
274 ExReleaseResourceLite((Fcb)->Header.PagingIoResource)
276 #define RxReleasePagingIoResourceForThread(RxContext, Fcb, Thread) \
277 RxTrackPagingIoResource(Fcb, 3, __LINE__, __FILE__); \
278 if (RxContext != NULL) \
280 (RxContext)->FcbPagingIoResourceAcquired = FALSE; \
282 ExReleaseResourceForThreadLite((Fcb)->Header.PagingIoResource, (Thread))
286 __RxWriteReleaseResources(
287 PRX_CONTEXT RxContext
,
288 BOOLEAN ResourceOwnerSet
298 #define RxWriteReleaseResources(R, B) __RxWriteReleaseResources((R), (B), __LINE__, __FILE__, 0)
300 #define RxWriteReleaseResources(R, B) __RxWriteReleaseResources((R), (B))
306 RxAcquireFcbForLazyWrite(
312 RxReleaseFcbFromLazyWrite(
317 RxAcquireFcbForReadAhead(
323 RxReleaseFcbFromReadAhead(
337 #define RxConvertToSharedFcb(R, F) ExConvertExclusiveToSharedLite(RX_GET_MRX_FCB(F)->Header.Resource)
340 RxVerifyOperationIsLegal(
341 _In_ PRX_CONTEXT RxContext
);
351 _In_ PRX_CONTEXT RxContext
,
356 _In_ PRX_CONTEXT RxContext
);
358 #define QuadAlign(V) (ALIGN_UP(V, ULONGLONG))
361 RxCompleteRequest_Real(
362 _In_ PRX_CONTEXT RxContext
,
364 _In_ NTSTATUS Status
);
368 _In_ PRX_CONTEXT pContext
,
369 _In_ NTSTATUS Status
);
371 #if (_WIN32_WINNT >= 0x600)
374 _In_ PRX_CONTEXT RxContext
,
376 _In_ PSRV_CALL SrvCall
,
377 _Out_ PLOCK_HOLDING_STATE LockHoldingState
);
381 _In_ PRX_CONTEXT RxContext
,
382 _In_ PSRV_CALL SrvCall
,
383 _Out_ PLOCK_HOLDING_STATE LockHoldingState
);
386 #define RxCompleteAsynchronousRequest(C, S) RxCompleteRequest(C, S)
390 _In_ PRX_CONTEXT RxContext
,
391 _In_ PSRV_CALL SrvCall
,
392 _In_ PNET_ROOT NetRoot
,
393 _In_ PV_NET_ROOT VirtualNetRoot
,
394 _Out_ PLOCK_HOLDING_STATE LockHoldingState
);
396 #if (_WIN32_WINNT >= 0x0600)
398 RxConstructVirtualNetRoot(
399 _In_ PRX_CONTEXT RxContext
,
401 _In_ PUNICODE_STRING CanonicalName
,
402 _In_ NET_ROOT_TYPE NetRootType
,
403 _In_ BOOLEAN TreeConnect
,
404 _Out_ PV_NET_ROOT
*VirtualNetRootPointer
,
405 _Out_ PLOCK_HOLDING_STATE LockHoldingState
,
406 _Out_ PRX_CONNECTION_ID RxConnectionId
);
409 RxFindOrConstructVirtualNetRoot(
410 _In_ PRX_CONTEXT RxContext
,
412 _In_ PUNICODE_STRING CanonicalName
,
413 _In_ NET_ROOT_TYPE NetRootType
,
414 _In_ PUNICODE_STRING RemainingName
);
417 RxConstructVirtualNetRoot(
418 _In_ PRX_CONTEXT RxContext
,
419 _In_ PUNICODE_STRING CanonicalName
,
420 _In_ NET_ROOT_TYPE NetRootType
,
421 _Out_ PV_NET_ROOT
*VirtualNetRootPointer
,
422 _Out_ PLOCK_HOLDING_STATE LockHoldingState
,
423 _Out_ PRX_CONNECTION_ID RxConnectionId
);
426 RxFindOrConstructVirtualNetRoot(
427 _In_ PRX_CONTEXT RxContext
,
428 _In_ PUNICODE_STRING CanonicalName
,
429 _In_ NET_ROOT_TYPE NetRootType
,
430 _In_ PUNICODE_STRING RemainingName
);
433 #if (_WIN32_WINNT >= 0x0600)
435 RxLowIoLockControlShell(
436 _In_ PRX_CONTEXT RxContext
,
441 RxLowIoLockControlShell(
442 _In_ PRX_CONTEXT RxContext
);
447 RxChangeBufferingState(
450 BOOLEAN ComputeNewState
);
454 RxIndicateChangeOfBufferingStateForSrvOpen(
455 PMRX_SRV_CALL SrvCall
,
456 PMRX_SRV_OPEN SrvOpen
,
462 RxPrepareToReparseSymbolicLink(
463 PRX_CONTEXT RxContext
,
464 BOOLEAN SymbolicLinkEmbeddedInOldPath
,
465 PUNICODE_STRING NewPath
,
466 BOOLEAN NewPathIsAbsolute
,
467 PBOOLEAN ReparseRequired
);
471 _Inout_ PVOID Instance
);
475 _Inout_ PVOID Instance
,
476 _In_ LOCK_HOLDING_STATE LockHoldingState
);
479 RxWaitForStableCondition(
480 _In_ PRX_BLOCK_CONDITION Condition
,
481 _Inout_ PLIST_ENTRY TransitionWaitList
,
482 _Inout_ PRX_CONTEXT RxContext
,
483 _Out_opt_ NTSTATUS
*AsyncStatus
);
487 _In_ RX_BLOCK_CONDITION NewConditionValue
,
488 _Out_ PRX_BLOCK_CONDITION Condition
,
489 _In_ OUT PLIST_ENTRY TransitionWaitList
);
491 #if (_WIN32_WINNT >= 0x0600)
493 RxCloseAssociatedSrvOpen(
494 _In_opt_ PRX_CONTEXT RxContext
,
498 RxCloseAssociatedSrvOpen(
500 _In_opt_ PRX_CONTEXT RxContext
);
505 RxFinalizeConnection(
506 _Inout_ PNET_ROOT NetRoot
,
507 _Inout_opt_ PV_NET_ROOT VNetRoot
,
508 _In_ LOGICAL ForceFilesClosed
);
515 _In_ PSZ wherelogtag
,
516 _In_ ACCESS_MASK DesiredAccess
,
517 _In_ ULONG DesiredShareAccess
);
523 _In_ PSZ wherelogtag
,
524 _In_ PSHARE_ACCESS ShareAccess
);
526 #define RxDumpWantedAccess(w1,w2,wlt,DA,DSA) {NOTHING;}
527 #define RxDumpCurrentAccess(w1,w2,wlt,SA) {NOTHING;}
531 RxCheckShareAccessPerSrvOpens(
533 _In_ ACCESS_MASK DesiredAccess
,
534 _In_ ULONG DesiredShareAccess
);
537 RxUpdateShareAccessPerSrvOpens(
538 _In_ PSRV_OPEN SrvOpen
);
541 RxRemoveShareAccessPerSrvOpens(
542 _Inout_ PSRV_OPEN SrvOpen
);
547 _In_ ACCESS_MASK DesiredAccess
,
548 _In_ ULONG DesiredShareAccess
,
549 _Inout_ PFILE_OBJECT FileObject
,
550 _Inout_ PSHARE_ACCESS ShareAccess
,
553 _In_ PSZ wherelogtag
);
557 _Inout_ PFILE_OBJECT FileObject
,
558 _Inout_ PSHARE_ACCESS ShareAccess
,
560 _In_ PSZ wherelogtag
);
564 _In_ ACCESS_MASK DesiredAccess
,
565 _In_ ULONG DesiredShareAccess
,
566 _Inout_ PFILE_OBJECT FileObject
,
567 _Out_ PSHARE_ACCESS ShareAccess
,
569 _In_ PSZ wherelogtag
);
573 _Inout_ PFILE_OBJECT FileObject
,
574 _Inout_ PSHARE_ACCESS ShareAccess
,
576 _In_ PSZ wherelogtag
);
578 #define RxCheckShareAccess(a1, a2, a3, a4, a5, a6, a7) IoCheckShareAccess(a1, a2, a3, a4, a5)
579 #define RxRemoveShareAccess(a1, a2, a3, a4) IoRemoveShareAccess(a1, a2)
580 #define RxSetShareAccess(a1, a2, a3, a4, a5, a6) IoSetShareAccess(a1, a2, a3, a4)
581 #define RxUpdateShareAccess(a1, a2, a3, a4) IoUpdateShareAccess(a1, a2)
587 _In_ PDRIVER_OBJECT DriverObject
,
588 _In_ PUNICODE_STRING RegistryPath
);
593 _In_ PDRIVER_OBJECT DriverObject
);
596 RxInitializeMinirdrDispatchTable(
597 _In_ PDRIVER_OBJECT DriverObject
);
600 RxGetNetworkProviderPriority(
601 _In_ PUNICODE_STRING DeviceName
);
604 RxPrepareRequestForReuse(
605 PCHANGE_BUFFERING_STATE_REQUEST Request
);
608 RxpDiscardChangeBufferingStateRequests(
609 _Inout_ PLIST_ENTRY DiscardedRequests
);
612 RxGatherRequestsForSrvOpen(
613 _Inout_ PSRV_CALL SrvCall
,
614 _In_ PSRV_OPEN SrvOpen
,
615 _Inout_ PLIST_ENTRY RequestsListHead
);
618 RxpLookupSrvOpenForRequestLite(
619 _In_ PSRV_CALL SrvCall
,
620 _Inout_ PCHANGE_BUFFERING_STATE_REQUEST Request
);
623 RxProcessChangeBufferingStateRequestsForSrvOpen(
627 RxPurgeFobxFromCache(
628 PFOBX FobxToBePurged
);
635 RxUndoScavengerFinalizationMarking(
639 RxTableComputePathHashValue(
640 _In_ PUNICODE_STRING Name
);
644 _In_ PUNICODE_STRING FilePathName
,
645 _Out_ PUNICODE_STRING SrvCallName
,
646 _Out_ PUNICODE_STRING RestOfName
);
650 RxCreateNetRootCallBack(
651 _In_ PMRX_CREATENETROOT_CONTEXT CreateNetRootContext
);
655 _In_ NODE_TYPE_CODE NodeType
,
656 _In_opt_ PMINIRDR_DISPATCH MRxDispatch
,
657 _In_ ULONG NameLength
);
664 RxInitializeSrvCallParameters(
665 _In_ PRX_CONTEXT RxContext
,
666 _Inout_ PSRV_CALL SrvCall
);
669 RxAddVirtualNetRootToNetRoot(
670 _In_ PNET_ROOT NetRoot
,
671 _In_ PV_NET_ROOT VNetRoot
);
674 RxRemoveVirtualNetRootFromNetRoot(
675 _In_ PNET_ROOT NetRoot
,
676 _In_ PV_NET_ROOT VNetRoot
);
680 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
681 _In_ NODE_TYPE_CODE NodeType
,
682 _In_ POOL_TYPE PoolType
,
684 _In_opt_ PVOID AlreadyAllocatedObject
);
697 _In_ BOOLEAN RecursiveFinalize
,
698 _In_ BOOLEAN ForceFinalize
,
699 _In_ LONG ReferenceCount
);
702 RxIsThisACscAgentOpen(
703 _In_ PRX_CONTEXT RxContext
);
707 RxCheckFcbStructuresForAlignment(
711 RxInitializeWorkQueueDispatcher(
712 _In_ PRX_WORK_QUEUE_DISPATCHER Dispatcher
);
715 RxInitializeWorkQueue(
716 _In_ PRX_WORK_QUEUE WorkQueue
,
717 _In_ WORK_QUEUE_TYPE WorkQueueType
,
718 _In_ ULONG MaximumNumberOfWorkerThreads
,
719 _In_ ULONG MinimumNumberOfWorkerThreads
);
722 RxSpinUpWorkerThread(
723 _In_ PRX_WORK_QUEUE WorkQueue
,
724 _In_ PRX_WORKERTHREAD_ROUTINE Routine
,
725 _In_ PVOID Parameter
);
728 RxSpinUpWorkerThreads(
729 _In_ PRX_WORK_QUEUE WorkQueue
);
733 RxSpinUpRequestsDispatcher(
734 _In_ PVOID Dispatcher
);
737 RxpWorkerThreadDispatcher(
738 _In_ PRX_WORK_QUEUE WorkQueue
,
739 _In_ PLARGE_INTEGER WaitInterval
);
743 RxBootstrapWorkerThreadDispatcher(
744 _In_ PVOID WorkQueue
);
747 RxTableLookupName_ExactLengthMatch(
748 _In_ PRX_PREFIX_TABLE ThisTable
,
749 _In_ PUNICODE_STRING Name
,
750 _In_ ULONG HashValue
,
751 _In_opt_ PRX_CONNECTION_ID RxConnectionId
);
755 _In_ PRX_PREFIX_TABLE ThisTable
,
756 _In_ PUNICODE_STRING Name
,
757 _Out_ PUNICODE_STRING RemainingName
,
758 _In_opt_ PRX_CONNECTION_ID RxConnectionId
);
762 _In_ PV_NET_ROOT ThisVNetRoot
);
769 RxOrphanSrvOpensForThisFcb(
771 _In_ PV_NET_ROOT ThisVNetRoot
,
772 _In_ BOOLEAN OrphanAll
);
774 #define RxEqualConnectionId(C1, C2) RtlEqualMemory(C1, C2, sizeof(RX_CONNECTION_ID))
778 RxLockOperationCompletion(
786 _In_ PFILE_LOCK_INFO LockInfo
);
788 #if (_WIN32_WINNT >= 0x0600)
790 RxPostStackOverflowRead(
791 _In_ PRX_CONTEXT RxContext
,
795 RxPostStackOverflowRead(
796 _In_ PRX_CONTEXT RxContext
);
802 _In_ PDEVICE_OBJECT DeviceObject
,
806 #define RxWriteCacheingAllowed(F, S) ( \
807 BooleanFlagOn((F)->FcbState, FCB_STATE_WRITECACHING_ENABLED) && \
808 !BooleanFlagOn((S)->Flags, SRVOPEN_FLAG_DONTUSE_WRITE_CACHING))