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 #if (_WIN32_WINNT >= 0x0600)
81 _In_ PRX_CONTEXT RxContext
,
87 _In_ PRX_CONTEXT RxContext
);
90 #if (_WIN32_WINNT >= 0x0600)
93 _In_ PRX_CONTEXT RxContext
,
95 _In_ LOCK_OPERATION Operation
,
96 _In_ ULONG BufferLength
);
100 _In_ PRX_CONTEXT RxContext
,
105 _In_ PRX_CONTEXT RxContext
,
106 _In_ LOCK_OPERATION Operation
,
107 _In_ ULONG BufferLength
);
111 _In_ PRX_CONTEXT RxContext
);
114 #define FCB_MODE_EXCLUSIVE 1
115 #define FCB_MODE_SHARED 2
116 #define FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE 3
117 #define FCB_MODE_SHARED_STARVE_EXCLUSIVE 4
122 _Inout_opt_ PRX_CONTEXT RxContext
,
126 _In_ ULONG LineNumber
,
128 _In_ ULONG SerialNumber
133 #define RxAcquireExclusiveFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_EXCLUSIVE, __LINE__, __FILE__, 0)
135 #define RxAcquireExclusiveFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_EXCLUSIVE)
138 #define RX_GET_MRX_FCB(F) ((PMRX_FCB)((F)))
141 #define RxAcquireSharedFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED, __LINE__, __FILE__, 0)
143 #define RxAcquireSharedFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED)
147 #define RxAcquireSharedFcbWaitForEx(R, F) __RxAcquireFcb((F),(R), FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE, __LINE__, __FILE__,0)
149 #define RxAcquireSharedFcbWaitForEx(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE)
154 _Inout_opt_ PRX_CONTEXT RxContext
,
155 _Inout_ PMRX_FCB MrxFcb
158 _In_ ULONG LineNumber
,
160 _In_ ULONG SerialNumber
165 #define RxReleaseFcb(R, F) __RxReleaseFcb((R), RX_GET_MRX_FCB(F), __LINE__, __FILE__, 0)
167 #define RxReleaseFcb(R, F) __RxReleaseFcb((R), RX_GET_MRX_FCB(F))
171 __RxReleaseFcbForThread(
172 _Inout_opt_ PRX_CONTEXT RxContext
,
173 _Inout_ PMRX_FCB MrxFcb
,
174 _In_ ERESOURCE_THREAD ResourceThreadId
177 _In_ ULONG LineNumber
,
179 _In_ ULONG SerialNumber
184 #define RxReleaseFcbForThread(R, F, T) __RxReleaseFcbForThread((R), RX_GET_MRX_FCB(F), (T), __LINE__, __FILE__, 0)
186 #define RxReleaseFcbForThread(R, F, T) __RxReleaseFcbForThread((R), RX_GET_MRX_FCB(F), (T))
191 RxTrackerUpdateHistory(
192 _Inout_opt_ PRX_CONTEXT RxContext
,
193 _Inout_ PMRX_FCB MrxFcb
,
194 _In_ ULONG Operation
,
195 _In_ ULONG LineNumber
,
197 _In_ ULONG SerialNumber
);
199 #define RxTrackerUpdateHistory(R, F, O, L, F, S) { NOTHING; }
203 RxTrackPagingIoResource(
204 _Inout_ PVOID Instance
,
209 #define RxIsFcbAcquiredShared(Fcb) ExIsResourceAcquiredSharedLite((Fcb)->Header.Resource)
210 #define RxIsFcbAcquiredExclusive(Fcb) ExIsResourceAcquiredExclusiveLite((Fcb)->Header.Resource)
211 #define RxIsFcbAcquired(Fcb) (ExIsResourceAcquiredSharedLite((Fcb)->Header.Resource) || \
212 ExIsResourceAcquiredExclusiveLite((Fcb)->Header.Resource))
214 #define RxAcquirePagingIoResource(RxContext, Fcb) \
215 ExAcquireResourceExclusiveLite((Fcb)->Header.PagingIoResource, TRUE); \
216 if (RxContext != NULL) \
218 (RxContext)->FcbPagingIoResourceAcquired = TRUE; \
220 RxTrackPagingIoResource(Fcb, 1, __LINE__, __FILE__)
222 #define RxAcquirePagingIoResourceShared(RxContext, Fcb, Flag) \
223 ExAcquireResourceSharedLite((Fcb)->Header.PagingIoResource, Flag); \
226 if (RxContext != NULL) \
228 ((PRX_CONTEXT)RxContext)->FcbPagingIoResourceAcquired = TRUE; \
230 RxTrackPagingIoResource(Fcb, 2, __LINE__, __FILE__); \
233 #define RxReleasePagingIoResource(RxContext, Fcb) \
234 RxTrackPagingIoResource(Fcb, 3, __LINE__, __FILE__); \
235 if (RxContext != NULL) \
237 (RxContext)->FcbPagingIoResourceAcquired = FALSE; \
239 ExReleaseResourceLite((Fcb)->Header.PagingIoResource)
241 #define RxReleasePagingIoResourceForThread(RxContext, Fcb, Thread) \
242 RxTrackPagingIoResource(Fcb, 3, __LINE__, __FILE__); \
243 if (RxContext != NULL) \
245 (RxContext)->FcbPagingIoResourceAcquired = FALSE; \
247 ExReleaseResourceForThreadLite((Fcb)->Header.PagingIoResource, (Thread))
251 RxAcquireFcbForLazyWrite(
257 RxReleaseFcbFromLazyWrite(
262 RxAcquireFcbForReadAhead(
268 RxReleaseFcbFromReadAhead(
282 #define RxConvertToSharedFcb(R, F) ExConvertExclusiveToSharedLite(RX_GET_MRX_FCB(F)->Header.Resource)
285 RxVerifyOperationIsLegal(
286 _In_ PRX_CONTEXT RxContext
);
295 _In_ PRX_CONTEXT RxContext
,
300 _In_ PRX_CONTEXT RxContext
);
302 #define QuadAlign(V) (ALIGN_UP(V, ULONGLONG))
305 RxCompleteRequest_Real(
306 _In_ PRX_CONTEXT RxContext
,
308 _In_ NTSTATUS Status
);
312 _In_ PRX_CONTEXT pContext
,
313 _In_ NTSTATUS Status
);
315 #if (_WIN32_WINNT >= 0x600)
318 _In_ PRX_CONTEXT RxContext
,
320 _In_ PSRV_CALL SrvCall
,
321 _Out_ PLOCK_HOLDING_STATE LockHoldingState
);
325 _In_ PRX_CONTEXT RxContext
,
326 _In_ PSRV_CALL SrvCall
,
327 _Out_ PLOCK_HOLDING_STATE LockHoldingState
);
330 #define RxCompleteAsynchronousRequest(C, S) RxCompleteRequest(C, S)
334 _In_ PRX_CONTEXT RxContext
,
335 _In_ PSRV_CALL SrvCall
,
336 _In_ PNET_ROOT NetRoot
,
337 _In_ PV_NET_ROOT VirtualNetRoot
,
338 _Out_ PLOCK_HOLDING_STATE LockHoldingState
);
340 #if (_WIN32_WINNT >= 0x0600)
342 RxConstructVirtualNetRoot(
343 _In_ PRX_CONTEXT RxContext
,
345 _In_ PUNICODE_STRING CanonicalName
,
346 _In_ NET_ROOT_TYPE NetRootType
,
347 _In_ BOOLEAN TreeConnect
,
348 _Out_ PV_NET_ROOT
*VirtualNetRootPointer
,
349 _Out_ PLOCK_HOLDING_STATE LockHoldingState
,
350 _Out_ PRX_CONNECTION_ID RxConnectionId
);
353 RxFindOrConstructVirtualNetRoot(
354 _In_ PRX_CONTEXT RxContext
,
356 _In_ PUNICODE_STRING CanonicalName
,
357 _In_ NET_ROOT_TYPE NetRootType
,
358 _In_ PUNICODE_STRING RemainingName
);
361 RxConstructVirtualNetRoot(
362 _In_ PRX_CONTEXT RxContext
,
363 _In_ PUNICODE_STRING CanonicalName
,
364 _In_ NET_ROOT_TYPE NetRootType
,
365 _Out_ PV_NET_ROOT
*VirtualNetRootPointer
,
366 _Out_ PLOCK_HOLDING_STATE LockHoldingState
,
367 _Out_ PRX_CONNECTION_ID RxConnectionId
);
370 RxFindOrConstructVirtualNetRoot(
371 _In_ PRX_CONTEXT RxContext
,
372 _In_ PUNICODE_STRING CanonicalName
,
373 _In_ NET_ROOT_TYPE NetRootType
,
374 _In_ PUNICODE_STRING RemainingName
);
379 RxChangeBufferingState(
382 BOOLEAN ComputeNewState
);
386 RxIndicateChangeOfBufferingStateForSrvOpen(
387 PMRX_SRV_CALL SrvCall
,
388 PMRX_SRV_OPEN SrvOpen
,
394 RxPrepareToReparseSymbolicLink(
395 PRX_CONTEXT RxContext
,
396 BOOLEAN SymbolicLinkEmbeddedInOldPath
,
397 PUNICODE_STRING NewPath
,
398 BOOLEAN NewPathIsAbsolute
,
399 PBOOLEAN ReparseRequired
);
403 _Inout_ PVOID Instance
);
407 _Inout_ PVOID Instance
,
408 _In_ LOCK_HOLDING_STATE LockHoldingState
);
411 RxWaitForStableCondition(
412 _In_ PRX_BLOCK_CONDITION Condition
,
413 _Inout_ PLIST_ENTRY TransitionWaitList
,
414 _Inout_ PRX_CONTEXT RxContext
,
415 _Out_opt_ NTSTATUS
*AsyncStatus
);
419 _In_ RX_BLOCK_CONDITION NewConditionValue
,
420 _Out_ PRX_BLOCK_CONDITION Condition
,
421 _In_ OUT PLIST_ENTRY TransitionWaitList
);
423 #if (_WIN32_WINNT >= 0x0600)
425 RxCloseAssociatedSrvOpen(
426 _In_opt_ PRX_CONTEXT RxContext
,
430 RxCloseAssociatedSrvOpen(
432 _In_opt_ PRX_CONTEXT RxContext
);
437 RxFinalizeConnection(
438 _Inout_ PNET_ROOT NetRoot
,
439 _Inout_opt_ PV_NET_ROOT VNetRoot
,
440 _In_ LOGICAL ForceFilesClosed
);
447 _In_ PSZ wherelogtag
,
448 _In_ ACCESS_MASK DesiredAccess
,
449 _In_ ULONG DesiredShareAccess
);
455 _In_ PSZ wherelogtag
,
456 _In_ PSHARE_ACCESS ShareAccess
);
458 #define RxDumpWantedAccess(w1,w2,wlt,DA,DSA) {NOTHING;}
459 #define RxDumpCurrentAccess(w1,w2,wlt,SA) {NOTHING;}
463 RxCheckShareAccessPerSrvOpens(
465 _In_ ACCESS_MASK DesiredAccess
,
466 _In_ ULONG DesiredShareAccess
);
469 RxUpdateShareAccessPerSrvOpens(
470 _In_ PSRV_OPEN SrvOpen
);
473 RxRemoveShareAccessPerSrvOpens(
474 _Inout_ PSRV_OPEN SrvOpen
);
479 _In_ ACCESS_MASK DesiredAccess
,
480 _In_ ULONG DesiredShareAccess
,
481 _Inout_ PFILE_OBJECT FileObject
,
482 _Inout_ PSHARE_ACCESS ShareAccess
,
485 _In_ PSZ wherelogtag
);
489 _Inout_ PFILE_OBJECT FileObject
,
490 _Inout_ PSHARE_ACCESS ShareAccess
,
492 _In_ PSZ wherelogtag
);
496 _In_ ACCESS_MASK DesiredAccess
,
497 _In_ ULONG DesiredShareAccess
,
498 _Inout_ PFILE_OBJECT FileObject
,
499 _Out_ PSHARE_ACCESS ShareAccess
,
501 _In_ PSZ wherelogtag
);
505 _Inout_ PFILE_OBJECT FileObject
,
506 _Inout_ PSHARE_ACCESS ShareAccess
,
508 _In_ PSZ wherelogtag
);
510 #define RxCheckShareAccess(a1, a2, a3, a4, a5, a6, a7) IoCheckShareAccess(a1, a2, a3, a4, a5)
511 #define RxRemoveShareAccess(a1, a2, a3, a4) IoRemoveShareAccess(a1, a2)
512 #define RxSetShareAccess(a1, a2, a3, a4, a5, a6) IoSetShareAccess(a1, a2, a3, a4)
513 #define RxUpdateShareAccess(a1, a2, a3, a4) IoUpdateShareAccess(a1, a2)
519 _In_ PDRIVER_OBJECT DriverObject
,
520 _In_ PUNICODE_STRING RegistryPath
);
525 _In_ PDRIVER_OBJECT DriverObject
);
528 RxInitializeMinirdrDispatchTable(
529 _In_ PDRIVER_OBJECT DriverObject
);
532 RxGetNetworkProviderPriority(
533 _In_ PUNICODE_STRING DeviceName
);
536 RxPrepareRequestForReuse(
537 PCHANGE_BUFFERING_STATE_REQUEST Request
);
540 RxpDiscardChangeBufferingStateRequests(
541 _Inout_ PLIST_ENTRY DiscardedRequests
);
544 RxGatherRequestsForSrvOpen(
545 _Inout_ PSRV_CALL SrvCall
,
546 _In_ PSRV_OPEN SrvOpen
,
547 _Inout_ PLIST_ENTRY RequestsListHead
);
550 RxpLookupSrvOpenForRequestLite(
551 _In_ PSRV_CALL SrvCall
,
552 _Inout_ PCHANGE_BUFFERING_STATE_REQUEST Request
);
555 RxProcessChangeBufferingStateRequestsForSrvOpen(
559 RxPurgeFobxFromCache(
560 PFOBX FobxToBePurged
);
563 RxUndoScavengerFinalizationMarking(
567 RxTableComputePathHashValue(
568 _In_ PUNICODE_STRING Name
);
572 _In_ PUNICODE_STRING FilePathName
,
573 _Out_ PUNICODE_STRING SrvCallName
,
574 _Out_ PUNICODE_STRING RestOfName
);
578 RxCreateNetRootCallBack(
579 _In_ PMRX_CREATENETROOT_CONTEXT CreateNetRootContext
);
583 _In_ NODE_TYPE_CODE NodeType
,
584 _In_opt_ PMINIRDR_DISPATCH MRxDispatch
,
585 _In_ ULONG NameLength
);
592 RxInitializeSrvCallParameters(
593 _In_ PRX_CONTEXT RxContext
,
594 _Inout_ PSRV_CALL SrvCall
);
597 RxAddVirtualNetRootToNetRoot(
598 _In_ PNET_ROOT NetRoot
,
599 _In_ PV_NET_ROOT VNetRoot
);
602 RxRemoveVirtualNetRootFromNetRoot(
603 _In_ PNET_ROOT NetRoot
,
604 _In_ PV_NET_ROOT VNetRoot
);
608 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
609 _In_ NODE_TYPE_CODE NodeType
,
610 _In_ POOL_TYPE PoolType
,
612 _In_opt_ PVOID AlreadyAllocatedObject
);
625 _In_ BOOLEAN RecursiveFinalize
,
626 _In_ BOOLEAN ForceFinalize
,
627 _In_ LONG ReferenceCount
);
630 RxIsThisACscAgentOpen(
631 _In_ PRX_CONTEXT RxContext
);
635 RxCheckFcbStructuresForAlignment(
639 RxInitializeWorkQueueDispatcher(
640 _In_ PRX_WORK_QUEUE_DISPATCHER Dispatcher
);
643 RxInitializeWorkQueue(
644 _In_ PRX_WORK_QUEUE WorkQueue
,
645 _In_ WORK_QUEUE_TYPE WorkQueueType
,
646 _In_ ULONG MaximumNumberOfWorkerThreads
,
647 _In_ ULONG MinimumNumberOfWorkerThreads
);
650 RxSpinUpWorkerThread(
651 _In_ PRX_WORK_QUEUE WorkQueue
,
652 _In_ PRX_WORKERTHREAD_ROUTINE Routine
,
653 _In_ PVOID Parameter
);
656 RxSpinUpWorkerThreads(
657 _In_ PRX_WORK_QUEUE WorkQueue
);
661 RxSpinUpRequestsDispatcher(
662 _In_ PVOID Dispatcher
);
665 RxpWorkerThreadDispatcher(
666 _In_ PRX_WORK_QUEUE WorkQueue
,
667 _In_ PLARGE_INTEGER WaitInterval
);
671 RxBootstrapWorkerThreadDispatcher(
672 _In_ PVOID WorkQueue
);
675 RxTableLookupName_ExactLengthMatch(
676 _In_ PRX_PREFIX_TABLE ThisTable
,
677 _In_ PUNICODE_STRING Name
,
678 _In_ ULONG HashValue
,
679 _In_opt_ PRX_CONNECTION_ID RxConnectionId
);
683 _In_ PRX_PREFIX_TABLE ThisTable
,
684 _In_ PUNICODE_STRING Name
,
685 _Out_ PUNICODE_STRING RemainingName
,
686 _In_opt_ PRX_CONNECTION_ID RxConnectionId
);
690 _In_ PV_NET_ROOT ThisVNetRoot
);
696 #define RxEqualConnectionId(C1, C2) RtlEqualMemory(C1, C2, sizeof(RX_CONNECTION_ID))
700 RxLockOperationCompletion(
708 _In_ PFILE_LOCK_INFO LockInfo
);
710 #if (_WIN32_WINNT >= 0x0600)
712 RxPostStackOverflowRead(
713 _In_ PRX_CONTEXT RxContext
,
717 RxPostStackOverflowRead(
718 _In_ PRX_CONTEXT RxContext
);
724 _In_ PDEVICE_OBJECT DeviceObject
,