#ifndef _RDBSSPROCS_ #define _RDBSSPROCS_ #include "backpack.h" #include "rxlog.h" #include "rxtimer.h" #include "rxstruc.h" extern PVOID RxNull; #define RxLogFailure(DO, Originator, Event, Status) \ RxLogEventDirect(DO, Originator, Event, Status, __LINE__) VOID NTAPI RxLogEventDirect( _In_ PRDBSS_DEVICE_OBJECT DeviceObject, _In_ PUNICODE_STRING OriginatorId, _In_ ULONG EventId, _In_ NTSTATUS Status, _In_ ULONG Line); VOID NTAPI RxLogEventWithAnnotation( _In_ PRDBSS_DEVICE_OBJECT DeviceObject, _In_ ULONG EventId, _In_ NTSTATUS Status, _In_ PVOID DataBuffer, _In_ USHORT DataBufferLength, _In_ PUNICODE_STRING Annotation, _In_ ULONG AnnotationCount); NTSTATUS RxPrefixClaim( _In_ PRX_CONTEXT RxContext); VOID RxpPrepareCreateContextForReuse( _In_ PRX_CONTEXT RxContext); NTSTATUS RxLowIoCompletionTail( _In_ PRX_CONTEXT RxContext); LUID RxGetUid( _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); ULONG RxGetSessionId( _In_ PIO_STACK_LOCATION IrpSp); #if (_WIN32_WINNT >= 0x0600) NTSTATUS RxFindOrCreateConnections( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PUNICODE_STRING CanonicalName, _In_ NET_ROOT_TYPE NetRootType, _In_ BOOLEAN TreeConnect, _Out_ PUNICODE_STRING LocalNetRootName, _Out_ PUNICODE_STRING FilePathName, _Inout_ PLOCK_HOLDING_STATE LockState, _In_ PRX_CONNECTION_ID RxConnectionId); #else NTSTATUS RxFindOrCreateConnections( _In_ PRX_CONTEXT RxContext, _In_ PUNICODE_STRING CanonicalName, _In_ NET_ROOT_TYPE NetRootType, _Out_ PUNICODE_STRING LocalNetRootName, _Out_ PUNICODE_STRING FilePathName, _Inout_ PLOCK_HOLDING_STATE LockState, _In_ PRX_CONNECTION_ID RxConnectionId); #endif typedef enum _RX_NAME_CONJURING_METHODS { VNetRoot_As_Prefix, VNetRoot_As_UNC_Name, VNetRoot_As_DriveLetter } RX_NAME_CONJURING_METHODS; VOID RxConjureOriginalName( _Inout_ PFCB Fcb, _Inout_ PFOBX Fobx, _Out_ PULONG ActualNameLength, _Out_writes_bytes_( *LengthRemaining) PWCHAR OriginalName, _Inout_ PLONG LengthRemaining, _In_ RX_NAME_CONJURING_METHODS NameConjuringMethod); #if (_WIN32_WINNT >= 0x0600) NTSTATUS RxCompleteMdl( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp); #else NTSTATUS NTAPI RxCompleteMdl( _In_ PRX_CONTEXT RxContext); #endif #if (_WIN32_WINNT >= 0x0600) VOID RxLockUserBuffer( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ LOCK_OPERATION Operation, _In_ ULONG BufferLength); PVOID RxMapSystemBuffer( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp); #else VOID RxLockUserBuffer( _In_ PRX_CONTEXT RxContext, _In_ LOCK_OPERATION Operation, _In_ ULONG BufferLength); PVOID RxMapSystemBuffer( _In_ PRX_CONTEXT RxContext); #endif #define FCB_MODE_EXCLUSIVE 1 #define FCB_MODE_SHARED 2 #define FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE 3 #define FCB_MODE_SHARED_STARVE_EXCLUSIVE 4 #define CHANGE_BUFFERING_STATE_CONTEXT ((PRX_CONTEXT)IntToPtr(0xffffffff)) #define CHANGE_BUFFERING_STATE_CONTEXT_WAIT ((PRX_CONTEXT)IntToPtr(0xfffffffe)) NTSTATUS __RxAcquireFcb( _Inout_ PFCB Fcb, _Inout_opt_ PRX_CONTEXT RxContext, _In_ ULONG Mode #ifdef RDBSS_TRACKER , _In_ ULONG LineNumber, _In_ PCSTR FileName, _In_ ULONG SerialNumber #endif ); #ifdef RDBSS_TRACKER #define RxAcquireExclusiveFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_EXCLUSIVE, __LINE__, __FILE__, 0) #else #define RxAcquireExclusiveFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_EXCLUSIVE) #endif #define RX_GET_MRX_FCB(F) ((PMRX_FCB)((F))) #ifdef RDBSS_TRACKER #define RxAcquireSharedFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED, __LINE__, __FILE__, 0) #else #define RxAcquireSharedFcb(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED) #endif #ifdef RDBSS_TRACKER #define RxAcquireSharedFcbWaitForEx(R, F) __RxAcquireFcb((F),(R), FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE, __LINE__, __FILE__,0) #else #define RxAcquireSharedFcbWaitForEx(R, F) __RxAcquireFcb((F), (R), FCB_MODE_SHARED_WAIT_FOR_EXCLUSIVE) #endif VOID __RxReleaseFcb( _Inout_opt_ PRX_CONTEXT RxContext, _Inout_ PMRX_FCB MrxFcb #ifdef RDBSS_TRACKER , _In_ ULONG LineNumber, _In_ PCSTR FileName, _In_ ULONG SerialNumber #endif ); #ifdef RDBSS_TRACKER #define RxReleaseFcb(R, F) __RxReleaseFcb((R), RX_GET_MRX_FCB(F), __LINE__, __FILE__, 0) #else #define RxReleaseFcb(R, F) __RxReleaseFcb((R), RX_GET_MRX_FCB(F)) #endif VOID __RxReleaseFcbForThread( _Inout_opt_ PRX_CONTEXT RxContext, _Inout_ PMRX_FCB MrxFcb, _In_ ERESOURCE_THREAD ResourceThreadId #ifdef RDBSS_TRACKER , _In_ ULONG LineNumber, _In_ PCSTR FileName, _In_ ULONG SerialNumber #endif ); #ifdef RDBSS_TRACKER #define RxReleaseFcbForThread(R, F, T) __RxReleaseFcbForThread((R), RX_GET_MRX_FCB(F), (T), __LINE__, __FILE__, 0) #else #define RxReleaseFcbForThread(R, F, T) __RxReleaseFcbForThread((R), RX_GET_MRX_FCB(F), (T)) #endif #ifdef RDBSS_TRACKER VOID RxTrackerUpdateHistory( _Inout_opt_ PRX_CONTEXT RxContext, _Inout_ PMRX_FCB MrxFcb, _In_ ULONG Operation, _In_ ULONG LineNumber, _In_ PCSTR FileName, _In_ ULONG SerialNumber); #else #define RxTrackerUpdateHistory(R, F, O, L, F, S) { NOTHING; } #endif VOID RxTrackPagingIoResource( _Inout_ PVOID Instance, _In_ ULONG Type, _In_ ULONG Line, _In_ PCSTR File); #define RxIsFcbAcquiredShared(Fcb) ExIsResourceAcquiredSharedLite((Fcb)->Header.Resource) #define RxIsFcbAcquiredExclusive(Fcb) ExIsResourceAcquiredExclusiveLite((Fcb)->Header.Resource) #define RxIsFcbAcquired(Fcb) (ExIsResourceAcquiredSharedLite((Fcb)->Header.Resource) || \ ExIsResourceAcquiredExclusiveLite((Fcb)->Header.Resource)) #define RxAcquirePagingIoResource(RxContext, Fcb) \ ExAcquireResourceExclusiveLite((Fcb)->Header.PagingIoResource, TRUE); \ if (RxContext != NULL) \ { \ (RxContext)->FcbPagingIoResourceAcquired = TRUE; \ } \ RxTrackPagingIoResource(Fcb, 1, __LINE__, __FILE__) #ifndef __REACTOS__ #define RxAcquirePagingIoResourceShared(RxContext, Fcb, Flag) \ ExAcquireResourceSharedLite((Fcb)->Header.PagingIoResource, Flag); \ if (AcquiredFile) \ { \ if (RxContext != NULL) \ { \ ((PRX_CONTEXT)RxContext)->FcbPagingIoResourceAcquired = TRUE; \ } \ RxTrackPagingIoResource(Fcb, 2, __LINE__, __FILE__); \ } #else #define RxAcquirePagingIoResourceShared(RxContext, Fcb, Flag) \ { \ BOOLEAN AcquiredFile; \ AcquiredFile = ExAcquireResourceSharedLite((Fcb)->Header.PagingIoResource, Flag); \ if (AcquiredFile) \ { \ if (RxContext != NULL) \ { \ ((PRX_CONTEXT)RxContext)->FcbPagingIoResourceAcquired = TRUE; \ } \ RxTrackPagingIoResource(Fcb, 2, __LINE__, __FILE__); \ } \ } #endif #define RxReleasePagingIoResource(RxContext, Fcb) \ RxTrackPagingIoResource(Fcb, 3, __LINE__, __FILE__); \ if (RxContext != NULL) \ { \ (RxContext)->FcbPagingIoResourceAcquired = FALSE; \ } \ ExReleaseResourceLite((Fcb)->Header.PagingIoResource) #define RxReleasePagingIoResourceForThread(RxContext, Fcb, Thread) \ RxTrackPagingIoResource(Fcb, 3, __LINE__, __FILE__); \ if (RxContext != NULL) \ { \ (RxContext)->FcbPagingIoResourceAcquired = FALSE; \ } \ ExReleaseResourceForThreadLite((Fcb)->Header.PagingIoResource, (Thread)) #ifdef __REACTOS__ VOID __RxWriteReleaseResources( PRX_CONTEXT RxContext, BOOLEAN ResourceOwnerSet #ifdef RDBSS_TRACKER , ULONG LineNumber, PCSTR FileName, ULONG SerialNumber #endif ); #ifdef RDBSS_TRACKER #define RxWriteReleaseResources(R, B) __RxWriteReleaseResources((R), (B), __LINE__, __FILE__, 0) #else #define RxWriteReleaseResources(R, B) __RxWriteReleaseResources((R), (B)) #endif #endif BOOLEAN NTAPI RxAcquireFcbForLazyWrite( _In_ PVOID Null, _In_ BOOLEAN Wait); VOID NTAPI RxReleaseFcbFromLazyWrite( _In_ PVOID Null); BOOLEAN NTAPI RxAcquireFcbForReadAhead( _In_ PVOID Null, _In_ BOOLEAN Wait); VOID NTAPI RxReleaseFcbFromReadAhead( _In_ PVOID Null); BOOLEAN NTAPI RxNoOpAcquire( _In_ PVOID Fcb, _In_ BOOLEAN Wait); VOID NTAPI RxNoOpRelease( _In_ PVOID Fcb); #define RxConvertToSharedFcb(R, F) ExConvertExclusiveToSharedLite(RX_GET_MRX_FCB(F)->Header.Resource) VOID RxVerifyOperationIsLegal( _In_ PRX_CONTEXT RxContext); VOID RxPrePostIrp( _In_ PVOID Context, _In_ PIRP Irp); VOID NTAPI RxAddToWorkque( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp); NTSTATUS RxFsdPostRequest( _In_ PRX_CONTEXT RxContext); #define QuadAlign(V) (ALIGN_UP(V, ULONGLONG)) VOID RxCompleteRequest_Real( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ NTSTATUS Status); NTSTATUS RxCompleteRequest( _In_ PRX_CONTEXT pContext, _In_ NTSTATUS Status); #if (_WIN32_WINNT >= 0x600) NTSTATUS RxConstructSrvCall( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PSRV_CALL SrvCall, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #else NTSTATUS RxConstructSrvCall( _In_ PRX_CONTEXT RxContext, _In_ PSRV_CALL SrvCall, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #endif #define RxCompleteAsynchronousRequest(C, S) RxCompleteRequest(C, S) NTSTATUS RxConstructNetRoot( _In_ PRX_CONTEXT RxContext, _In_ PSRV_CALL SrvCall, _In_ PNET_ROOT NetRoot, _In_ PV_NET_ROOT VirtualNetRoot, _Out_ PLOCK_HOLDING_STATE LockHoldingState); #if (_WIN32_WINNT >= 0x0600) NTSTATUS RxConstructVirtualNetRoot( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PUNICODE_STRING CanonicalName, _In_ NET_ROOT_TYPE NetRootType, _In_ BOOLEAN TreeConnect, _Out_ PV_NET_ROOT *VirtualNetRootPointer, _Out_ PLOCK_HOLDING_STATE LockHoldingState, _Out_ PRX_CONNECTION_ID RxConnectionId); NTSTATUS RxFindOrConstructVirtualNetRoot( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PUNICODE_STRING CanonicalName, _In_ NET_ROOT_TYPE NetRootType, _In_ PUNICODE_STRING RemainingName); #else NTSTATUS RxConstructVirtualNetRoot( _In_ PRX_CONTEXT RxContext, _In_ PUNICODE_STRING CanonicalName, _In_ NET_ROOT_TYPE NetRootType, _Out_ PV_NET_ROOT *VirtualNetRootPointer, _Out_ PLOCK_HOLDING_STATE LockHoldingState, _Out_ PRX_CONNECTION_ID RxConnectionId); NTSTATUS RxFindOrConstructVirtualNetRoot( _In_ PRX_CONTEXT RxContext, _In_ PUNICODE_STRING CanonicalName, _In_ NET_ROOT_TYPE NetRootType, _In_ PUNICODE_STRING RemainingName); #endif #if (_WIN32_WINNT >= 0x0600) NTSTATUS RxLowIoLockControlShell( _In_ PRX_CONTEXT RxContext, _In_ PIRP Irp, _In_ PFCB Fcb); #else NTSTATUS RxLowIoLockControlShell( _In_ PRX_CONTEXT RxContext); #endif NTSTATUS NTAPI RxChangeBufferingState( PSRV_OPEN SrvOpen, PVOID Context, BOOLEAN ComputeNewState); VOID NTAPI RxIndicateChangeOfBufferingStateForSrvOpen( PMRX_SRV_CALL SrvCall, PMRX_SRV_OPEN SrvOpen, PVOID SrvOpenKey, PVOID Context); NTSTATUS NTAPI RxPrepareToReparseSymbolicLink( PRX_CONTEXT RxContext, BOOLEAN SymbolicLinkEmbeddedInOldPath, PUNICODE_STRING NewPath, BOOLEAN NewPathIsAbsolute, PBOOLEAN ReparseRequired); VOID RxReference( _Inout_ PVOID Instance); VOID RxDereference( _Inout_ PVOID Instance, _In_ LOCK_HOLDING_STATE LockHoldingState); VOID RxWaitForStableCondition( _In_ PRX_BLOCK_CONDITION Condition, _Inout_ PLIST_ENTRY TransitionWaitList, _Inout_ PRX_CONTEXT RxContext, _Out_opt_ NTSTATUS *AsyncStatus); VOID RxUpdateCondition( _In_ RX_BLOCK_CONDITION NewConditionValue, _Out_ PRX_BLOCK_CONDITION Condition, _In_ OUT PLIST_ENTRY TransitionWaitList); #if (_WIN32_WINNT >= 0x0600) NTSTATUS RxCloseAssociatedSrvOpen( _In_opt_ PRX_CONTEXT RxContext, _In_ PFOBX Fobx); #else NTSTATUS RxCloseAssociatedSrvOpen( _In_ PFOBX Fobx, _In_opt_ PRX_CONTEXT RxContext); #endif NTSTATUS NTAPI RxFinalizeConnection( _Inout_ PNET_ROOT NetRoot, _Inout_opt_ PV_NET_ROOT VNetRoot, _In_ LOGICAL ForceFilesClosed); #if DBG VOID RxDumpWantedAccess( _In_ PSZ where1, _In_ PSZ where2, _In_ PSZ wherelogtag, _In_ ACCESS_MASK DesiredAccess, _In_ ULONG DesiredShareAccess); VOID RxDumpCurrentAccess( _In_ PSZ where1, _In_ PSZ where2, _In_ PSZ wherelogtag, _In_ PSHARE_ACCESS ShareAccess); #else #define RxDumpWantedAccess(w1,w2,wlt,DA,DSA) {NOTHING;} #define RxDumpCurrentAccess(w1,w2,wlt,SA) {NOTHING;} #endif NTSTATUS RxCheckShareAccessPerSrvOpens( _In_ PFCB Fcb, _In_ ACCESS_MASK DesiredAccess, _In_ ULONG DesiredShareAccess); VOID RxUpdateShareAccessPerSrvOpens( _In_ PSRV_OPEN SrvOpen); VOID RxRemoveShareAccessPerSrvOpens( _Inout_ PSRV_OPEN SrvOpen); #if DBG NTSTATUS RxCheckShareAccess( _In_ ACCESS_MASK DesiredAccess, _In_ ULONG DesiredShareAccess, _Inout_ PFILE_OBJECT FileObject, _Inout_ PSHARE_ACCESS ShareAccess, _In_ BOOLEAN Update, _In_ PSZ where, _In_ PSZ wherelogtag); VOID RxRemoveShareAccess( _Inout_ PFILE_OBJECT FileObject, _Inout_ PSHARE_ACCESS ShareAccess, _In_ PSZ where, _In_ PSZ wherelogtag); VOID RxSetShareAccess( _In_ ACCESS_MASK DesiredAccess, _In_ ULONG DesiredShareAccess, _Inout_ PFILE_OBJECT FileObject, _Out_ PSHARE_ACCESS ShareAccess, _In_ PSZ where, _In_ PSZ wherelogtag); VOID RxUpdateShareAccess( _Inout_ PFILE_OBJECT FileObject, _Inout_ PSHARE_ACCESS ShareAccess, _In_ PSZ where, _In_ PSZ wherelogtag); #else #define RxCheckShareAccess(a1, a2, a3, a4, a5, a6, a7) IoCheckShareAccess(a1, a2, a3, a4, a5) #define RxRemoveShareAccess(a1, a2, a3, a4) IoRemoveShareAccess(a1, a2) #define RxSetShareAccess(a1, a2, a3, a4, a5, a6) IoSetShareAccess(a1, a2, a3, a4) #define RxUpdateShareAccess(a1, a2, a3, a4) IoUpdateShareAccess(a1, a2) #endif NTSTATUS NTAPI RxDriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath); VOID NTAPI RxUnload( _In_ PDRIVER_OBJECT DriverObject); VOID RxInitializeMinirdrDispatchTable( _In_ PDRIVER_OBJECT DriverObject); ULONG RxGetNetworkProviderPriority( _In_ PUNICODE_STRING DeviceName); VOID RxPrepareRequestForReuse( PCHANGE_BUFFERING_STATE_REQUEST Request); VOID RxpDiscardChangeBufferingStateRequests( _Inout_ PLIST_ENTRY DiscardedRequests); VOID RxGatherRequestsForSrvOpen( _Inout_ PSRV_CALL SrvCall, _In_ PSRV_OPEN SrvOpen, _Inout_ PLIST_ENTRY RequestsListHead); NTSTATUS RxpLookupSrvOpenForRequestLite( _In_ PSRV_CALL SrvCall, _Inout_ PCHANGE_BUFFERING_STATE_REQUEST Request); VOID RxProcessChangeBufferingStateRequestsForSrvOpen( PSRV_OPEN SrvOpen); NTSTATUS RxPurgeFobxFromCache( PFOBX FobxToBePurged); BOOLEAN RxPurgeFobx( PFOBX pFobx); VOID RxUndoScavengerFinalizationMarking( PVOID Instance); ULONG RxTableComputePathHashValue( _In_ PUNICODE_STRING Name); VOID RxExtractServerName( _In_ PUNICODE_STRING FilePathName, _Out_ PUNICODE_STRING SrvCallName, _Out_ PUNICODE_STRING RestOfName); VOID NTAPI RxCreateNetRootCallBack( _In_ PMRX_CREATENETROOT_CONTEXT CreateNetRootContext); PVOID RxAllocateObject( _In_ NODE_TYPE_CODE NodeType, _In_opt_ PMINIRDR_DISPATCH MRxDispatch, _In_ ULONG NameLength); VOID RxFreeObject( _In_ PVOID pObject); NTSTATUS RxInitializeSrvCallParameters( _In_ PRX_CONTEXT RxContext, _Inout_ PSRV_CALL SrvCall); VOID RxAddVirtualNetRootToNetRoot( _In_ PNET_ROOT NetRoot, _In_ PV_NET_ROOT VNetRoot); VOID RxRemoveVirtualNetRootFromNetRoot( _In_ PNET_ROOT NetRoot, _In_ PV_NET_ROOT VNetRoot); PVOID RxAllocateFcbObject( _In_ PRDBSS_DEVICE_OBJECT RxDeviceObject, _In_ NODE_TYPE_CODE NodeType, _In_ POOL_TYPE PoolType, _In_ ULONG NameSize, _In_opt_ PVOID AlreadyAllocatedObject); VOID RxFreeFcbObject( _In_ PVOID Object); VOID RxPurgeFcb( _In_ PFCB Fcb); BOOLEAN RxFinalizeNetFcb( _Out_ PFCB ThisFcb, _In_ BOOLEAN RecursiveFinalize, _In_ BOOLEAN ForceFinalize, _In_ LONG ReferenceCount); BOOLEAN RxIsThisACscAgentOpen( _In_ PRX_CONTEXT RxContext); VOID NTAPI RxCheckFcbStructuresForAlignment( VOID); NTSTATUS RxInitializeWorkQueueDispatcher( _In_ PRX_WORK_QUEUE_DISPATCHER Dispatcher); VOID RxInitializeWorkQueue( _In_ PRX_WORK_QUEUE WorkQueue, _In_ WORK_QUEUE_TYPE WorkQueueType, _In_ ULONG MaximumNumberOfWorkerThreads, _In_ ULONG MinimumNumberOfWorkerThreads); NTSTATUS RxSpinUpWorkerThread( _In_ PRX_WORK_QUEUE WorkQueue, _In_ PRX_WORKERTHREAD_ROUTINE Routine, _In_ PVOID Parameter); VOID RxSpinUpWorkerThreads( _In_ PRX_WORK_QUEUE WorkQueue); VOID NTAPI RxSpinUpRequestsDispatcher( _In_ PVOID Dispatcher); VOID RxpWorkerThreadDispatcher( _In_ PRX_WORK_QUEUE WorkQueue, _In_ PLARGE_INTEGER WaitInterval); VOID NTAPI RxBootstrapWorkerThreadDispatcher( _In_ PVOID WorkQueue); PRX_PREFIX_ENTRY RxTableLookupName_ExactLengthMatch( _In_ PRX_PREFIX_TABLE ThisTable, _In_ PUNICODE_STRING Name, _In_ ULONG HashValue, _In_opt_ PRX_CONNECTION_ID RxConnectionId); PVOID RxTableLookupName( _In_ PRX_PREFIX_TABLE ThisTable, _In_ PUNICODE_STRING Name, _Out_ PUNICODE_STRING RemainingName, _In_opt_ PRX_CONNECTION_ID RxConnectionId); VOID RxOrphanSrvOpens( _In_ PV_NET_ROOT ThisVNetRoot); VOID RxOrphanThisFcb( _In_ PFCB Fcb); VOID RxOrphanSrvOpensForThisFcb( _In_ PFCB Fcb, _In_ PV_NET_ROOT ThisVNetRoot, _In_ BOOLEAN OrphanAll); #define RxEqualConnectionId(C1, C2) RtlEqualMemory(C1, C2, sizeof(RX_CONNECTION_ID)) NTSTATUS NTAPI RxLockOperationCompletion( _In_ PVOID Context, _In_ PIRP Irp); VOID NTAPI RxUnlockOperation( _In_ PVOID Context, _In_ PFILE_LOCK_INFO LockInfo); #if (_WIN32_WINNT >= 0x0600) NTSTATUS RxPostStackOverflowRead( _In_ PRX_CONTEXT RxContext, _In_ PFCB Fcb); #else NTSTATUS RxPostStackOverflowRead( _In_ PRX_CONTEXT RxContext); #endif VOID NTAPI RxCancelRoutine( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp); #ifdef __REACTOS__ #define RxWriteCacheingAllowed(F, S) ( \ BooleanFlagOn((F)->FcbState, FCB_STATE_WRITECACHING_ENABLED) && \ !BooleanFlagOn((S)->Flags, SRVOPEN_FLAG_DONTUSE_WRITE_CACHING)) #endif #endif