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
);
475 _In_ ACCESS_MASK DesiredAccess
,
476 _In_ ULONG DesiredShareAccess
,
477 _Inout_ PFILE_OBJECT FileObject
,
478 _Inout_ PSHARE_ACCESS ShareAccess
,
481 _In_ PSZ wherelogtag
);
485 _Inout_ PFILE_OBJECT FileObject
,
486 _Inout_ PSHARE_ACCESS ShareAccess
,
488 _In_ PSZ wherelogtag
);
492 _In_ ACCESS_MASK DesiredAccess
,
493 _In_ ULONG DesiredShareAccess
,
494 _Inout_ PFILE_OBJECT FileObject
,
495 _Out_ PSHARE_ACCESS ShareAccess
,
497 _In_ PSZ wherelogtag
);
501 _Inout_ PFILE_OBJECT FileObject
,
502 _Inout_ PSHARE_ACCESS ShareAccess
,
504 _In_ PSZ wherelogtag
);
506 #define RxCheckShareAccess(a1, a2, a3, a4, a5, a6, a7) IoCheckShareAccess(a1, a2, a3, a4, a5)
507 #define RxRemoveShareAccess(a1, a2, a3, a4) IoRemoveShareAccess(a1, a2)
508 #define RxSetShareAccess(a1, a2, a3, a4, a5, a6) IoSetShareAccess(a1, a2, a3, a4)
509 #define RxUpdateShareAccess(a1, a2, a3, a4) IoUpdateShareAccess(a1, a2)
515 _In_ PDRIVER_OBJECT DriverObject
,
516 _In_ PUNICODE_STRING RegistryPath
);
521 _In_ PDRIVER_OBJECT DriverObject
);
524 RxInitializeMinirdrDispatchTable(
525 _In_ PDRIVER_OBJECT DriverObject
);
528 RxGetNetworkProviderPriority(
529 _In_ PUNICODE_STRING DeviceName
);
532 RxpDiscardChangeBufferingStateRequests(
533 _Inout_ PLIST_ENTRY DiscardedRequests
);
536 RxUndoScavengerFinalizationMarking(
540 RxTableComputePathHashValue(
541 _In_ PUNICODE_STRING Name
);
545 _In_ PUNICODE_STRING FilePathName
,
546 _Out_ PUNICODE_STRING SrvCallName
,
547 _Out_ PUNICODE_STRING RestOfName
);
551 RxCreateNetRootCallBack(
552 _In_ PMRX_CREATENETROOT_CONTEXT CreateNetRootContext
);
556 _In_ NODE_TYPE_CODE NodeType
,
557 _In_opt_ PMINIRDR_DISPATCH MRxDispatch
,
558 _In_ ULONG NameLength
);
565 RxInitializeSrvCallParameters(
566 _In_ PRX_CONTEXT RxContext
,
567 _Inout_ PSRV_CALL SrvCall
);
570 RxAddVirtualNetRootToNetRoot(
571 _In_ PNET_ROOT NetRoot
,
572 _In_ PV_NET_ROOT VNetRoot
);
575 RxRemoveVirtualNetRootFromNetRoot(
576 _In_ PNET_ROOT NetRoot
,
577 _In_ PV_NET_ROOT VNetRoot
);
581 _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject
,
582 _In_ NODE_TYPE_CODE NodeType
,
583 _In_ POOL_TYPE PoolType
,
585 _In_opt_ PVOID AlreadyAllocatedObject
);
598 _In_ BOOLEAN RecursiveFinalize
,
599 _In_ BOOLEAN ForceFinalize
,
600 _In_ LONG ReferenceCount
);
603 RxIsThisACscAgentOpen(
604 _In_ PRX_CONTEXT RxContext
);
608 RxCheckFcbStructuresForAlignment(
612 RxInitializeWorkQueueDispatcher(
613 _In_ PRX_WORK_QUEUE_DISPATCHER Dispatcher
);
616 RxInitializeWorkQueue(
617 _In_ PRX_WORK_QUEUE WorkQueue
,
618 _In_ WORK_QUEUE_TYPE WorkQueueType
,
619 _In_ ULONG MaximumNumberOfWorkerThreads
,
620 _In_ ULONG MinimumNumberOfWorkerThreads
);
623 RxSpinUpWorkerThread(
624 _In_ PRX_WORK_QUEUE WorkQueue
,
625 _In_ PRX_WORKERTHREAD_ROUTINE Routine
,
626 _In_ PVOID Parameter
);
629 RxSpinUpWorkerThreads(
630 _In_ PRX_WORK_QUEUE WorkQueue
);
634 RxSpinUpRequestsDispatcher(
635 _In_ PVOID Dispatcher
);
638 RxpWorkerThreadDispatcher(
639 _In_ PRX_WORK_QUEUE WorkQueue
,
640 _In_ PLARGE_INTEGER WaitInterval
);
644 RxBootstrapWorkerThreadDispatcher(
645 _In_ PVOID WorkQueue
);
648 RxTableLookupName_ExactLengthMatch(
649 _In_ PRX_PREFIX_TABLE ThisTable
,
650 _In_ PUNICODE_STRING Name
,
651 _In_ ULONG HashValue
,
652 _In_opt_ PRX_CONNECTION_ID RxConnectionId
);
656 _In_ PRX_PREFIX_TABLE ThisTable
,
657 _In_ PUNICODE_STRING Name
,
658 _Out_ PUNICODE_STRING RemainingName
,
659 _In_opt_ PRX_CONNECTION_ID RxConnectionId
);
663 _In_ PV_NET_ROOT ThisVNetRoot
);
669 #define RxEqualConnectionId(C1, C2) RtlEqualMemory(C1, C2, sizeof(RX_CONNECTION_ID))
673 RxLockOperationCompletion(
681 _In_ PFILE_LOCK_INFO LockInfo
);
683 #if (_WIN32_WINNT >= 0x0600)
685 RxPostStackOverflowRead(
686 _In_ PRX_CONTEXT RxContext
,
690 RxPostStackOverflowRead(
691 _In_ PRX_CONTEXT RxContext
);
697 _In_ PDEVICE_OBJECT DeviceObject
,