RX_BUFFERING_MANAGER BufferingManager;
} SRV_CALL, *PSRV_CALL;
+#define NETROOT_FLAG_FINALIZATION_IN_PROGRESS 0x00040000
+#define NETROOT_FLAG_NAME_ALREADY_REMOVED 0x00080000
+
typedef struct _NET_ROOT
{
union
} FCB, *PFCB;
#define FCB_STATE_DELETE_ON_CLOSE 0x00000001
+#define FCB_STATE_TRUNCATE_ON_CLOSE 0x00000002
#define FCB_STATE_PAGING_FILE 0x00000004
#define FCB_STATE_DISABLE_LOCAL_BUFFERING 0x00000010
#define FCB_STATE_TEMPORARY 0x00000020
#define FCB_STATE_FILE_IS_BUF_COMPRESSED 0x00004000
#define FCB_STATE_FILE_IS_DISK_COMPRESSED 0x00008000
#define FCB_STATE_FILE_IS_SHADOWED 0x00010000
+#define FCB_STATE_BUFFERSTATE_CHANGING 0x00002000
#define FCB_STATE_SPECIAL_PATH 0x00020000
#define FCB_STATE_TIME_AND_SIZE_ALREADY_SET 0x00040000
+#define FCB_STATE_FILETIMECACHEING_ENABLED 0x00080000
#define FCB_STATE_FILESIZECACHEING_ENABLED 0x00100000
+#define FCB_STATE_LOCK_BUFFERING_ENABLED 0x00200000
#define FCB_STATE_COLLAPSING_ENABLED 0x00400000
+#define FCB_STATE_OPENSHARING_ENABLED 0x00800000
#define FCB_STATE_READBUFFERING_ENABLED 0x01000000
#define FCB_STATE_READCACHING_ENABLED 0x02000000
#define FCB_STATE_WRITEBUFFERING_ENABLED 0x04000000
#define FCB_STATE_FOBX_USED 0x40000000
#define FCB_STATE_SRVOPEN_USED 0x80000000
+#define FCB_STATE_BUFFERING_STATE_MASK \
+ ((FCB_STATE_WRITECACHING_ENABLED \
+ | FCB_STATE_WRITEBUFFERING_ENABLED \
+ | FCB_STATE_READCACHING_ENABLED \
+ | FCB_STATE_READBUFFERING_ENABLED \
+ | FCB_STATE_OPENSHARING_ENABLED \
+ | FCB_STATE_COLLAPSING_ENABLED \
+ | FCB_STATE_LOCK_BUFFERING_ENABLED \
+ | FCB_STATE_FILESIZECACHEING_ENABLED \
+ | FCB_STATE_FILETIMECACHEING_ENABLED))
+
typedef struct _FCB_INIT_PACKET
{
PULONG pAttributes;
#define FOBX_FLAG_MATCH_ALL 0x10000
#define FOBX_FLAG_FREE_UNICODE 0x20000
+#define FOBX_FLAG_USER_SET_LAST_WRITE 0x40000
+#define FOBX_FLAG_USER_SET_LAST_ACCESS 0x80000
+#define FOBX_FLAG_USER_SET_CREATION 0x100000
+#define FOBX_FLAG_USER_SET_LAST_CHANGE 0x200000
#define FOBX_FLAG_DELETE_ON_CLOSE 0x800000
+#define FOBX_FLAG_SRVOPEN_CLOSED 0x1000000
#define FOBX_FLAG_UNC_NAME 0x2000000
#define FOBX_FLAG_ENCLOSED_ALLOCATED 0x4000000
+#define FOBX_FLAG_MARKED_AS_DORMANT 0x8000000
+#ifdef __REACTOS__
+#define FOBX_FLAG_DISABLE_COLLAPSING 0x20000000
+#endif
typedef struct _FOBX
{
#define RDBSS_REF_TRACK_NETFCB 0x00000010
#define RDBSS_REF_TRACK_SRVOPEN 0x00000020
#define RX_PRINT_REF_TRACKING 0x40000000
+#define RX_LOG_REF_TRACKING 0x80000000
extern ULONG RdbssReferenceTracingValue;
_In_ PVOID Instance);
#define REF_TRACING_ON(TraceMask) (TraceMask & RdbssReferenceTracingValue)
+#ifndef __REACTOS__
#define PRINT_REF_COUNT(TYPE, Count) \
if (REF_TRACING_ON( RDBSS_REF_TRACK_ ## TYPE) && \
(RdbssReferenceTracingValue & RX_PRINT_REF_TRACKING)) \
{ \
DbgPrint("%ld\n", Count); \
}
+#else
+#define PRINT_REF_COUNT(TYPE, Count) \
+ if (REF_TRACING_ON( RDBSS_REF_TRACK_ ## TYPE) && \
+ (RdbssReferenceTracingValue & RX_PRINT_REF_TRACKING)) \
+ { \
+ DbgPrint("(%s:%d) %s: %ld\n", __FILE__, __LINE__, #TYPE, Count); \
+ }
+#endif
+
+#define RxReferenceSrvCall(SrvCall) \
+ RxpTrackReference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
+ RxReference(SrvCall)
-#define RxReferenceSrvCall(SrvCall) \
- RxpTrackReference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
- RxReference(SrvCall)
+#define RxDereferenceSrvCall(SrvCall, LockHoldingState) \
+ RxpTrackDereference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
+ RxDereference(SrvCall, LockHoldingState)
-#define RxDereferenceSrvCall(SrvCall, LockHoldingState) \
- RxpTrackDereference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
- RxDereference(SrvCall, LockHoldingState)
+#define RxReferenceNetRoot(NetRoot) \
+ RxpTrackReference(RDBSS_REF_TRACK_NETROOT, __FILE__, __LINE__, NetRoot); \
+ RxReference(NetRoot)
-#define RxReferenceNetRoot(NetRoot) \
- RxpTrackReference(RDBSS_REF_TRACK_NETROOT, __FILE__, __LINE__, NetRoot); \
- RxReference(NetRoot)
+#define RxDereferenceNetRoot(NetRoot, LockHoldingState) \
+ RxpTrackDereference(RDBSS_REF_TRACK_NETROOT, __FILE__, __LINE__, NetRoot); \
+ RxDereference(NetRoot, LockHoldingState)
-#define RxDereferenceNetRoot(NetRoot, LockHoldingState) \
- RxpTrackDereference(RDBSS_REF_TRACK_NETROOT, __FILE__, __LINE__, NetRoot); \
- RxDereference(NetRoot, LockHoldingState)
+#define RxReferenceVNetRoot(VNetRoot) \
+ RxpTrackReference(RDBSS_REF_TRACK_VNETROOT, __FILE__, __LINE__, VNetRoot); \
+ RxReference(VNetRoot)
-#define RxReferenceVNetRoot(VNetRoot) \
- RxpTrackReference(RDBSS_REF_TRACK_VNETROOT, __FILE__, __LINE__, VNetRoot); \
- RxReference(VNetRoot)
+#define RxDereferenceVNetRoot(VNetRoot, LockHoldingState) \
+ RxpTrackDereference(RDBSS_REF_TRACK_VNETROOT, __FILE__, __LINE__, VNetRoot); \
+ RxDereference(VNetRoot, LockHoldingState)
-#define RxDereferenceVNetRoot(VNetRoot, LockHoldingState) \
- RxpTrackDereference(RDBSS_REF_TRACK_VNETROOT, __FILE__, __LINE__, VNetRoot); \
- RxDereference(VNetRoot, LockHoldingState)
+#define RxReferenceNetFobx(Fobx) \
+ RxpTrackReference(RDBSS_REF_TRACK_NETFOBX, __FILE__, __LINE__, Fobx); \
+ RxReference(Fobx)
-#define RxDereferenceNetFobx(Fobx, LockHoldingState) \
- RxpTrackDereference(RDBSS_REF_TRACK_NETFOBX, __FILE__, __LINE__, Fobx); \
- RxDereference(Fobx, LockHoldingState)
+#define RxDereferenceNetFobx(Fobx, LockHoldingState) \
+ RxpTrackDereference(RDBSS_REF_TRACK_NETFOBX, __FILE__, __LINE__, Fobx); \
+ RxDereference(Fobx, LockHoldingState)
-#define RxReferenceSrvOpen(SrvOpen) \
- RxpTrackReference(RDBSS_REF_TRACK_SRVOPEN, __FILE__, __LINE__, SrvOpen); \
- RxReference(SrvOpen)
+#define RxReferenceSrvOpen(SrvOpen) \
+ RxpTrackReference(RDBSS_REF_TRACK_SRVOPEN, __FILE__, __LINE__, SrvOpen); \
+ RxReference(SrvOpen)
-#define RxDereferenceSrvOpen(SrvOpen, LockHoldingState) \
- RxpTrackDereference(RDBSS_REF_TRACK_SRVOPEN, __FILE__, __LINE__, SrvOpen); \
- RxDereference(SrvOpen, LockHoldingState)
+#define RxDereferenceSrvOpen(SrvOpen, LockHoldingState) \
+ RxpTrackDereference(RDBSS_REF_TRACK_SRVOPEN, __FILE__, __LINE__, SrvOpen); \
+ RxDereference(SrvOpen, LockHoldingState)
-#define RxReferenceNetFcb(Fcb) \
- (RxpTrackReference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
- RxpReferenceNetFcb(Fcb))
+#define RxReferenceNetFcb(Fcb) \
+ (RxpTrackReference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
+ RxpReferenceNetFcb(Fcb))
-#define RxDereferenceNetFcb(Fcb) \
- ((LONG)RxpTrackDereference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
- RxpDereferenceNetFcb(Fcb))
+#define RxDereferenceNetFcb(Fcb) \
+ ((LONG)RxpTrackDereference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
+ RxpDereferenceNetFcb(Fcb))
-#define RxDereferenceAndFinalizeNetFcb(Fcb, RxContext, RecursiveFinalize, ForceFinalize) \
- (RxpTrackDereference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
- RxpDereferenceAndFinalizeNetFcb(Fcb, RxContext, RecursiveFinalize, ForceFinalize))
+#define RxDereferenceAndFinalizeNetFcb(Fcb, RxContext, RecursiveFinalize, ForceFinalize) \
+ (RxpTrackDereference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
+ RxpDereferenceAndFinalizeNetFcb(Fcb, RxContext, RecursiveFinalize, ForceFinalize))
PSRV_CALL
RxCreateSrvCall(
_In_ PUNICODE_STRING FilePath,
_In_ PRX_CONNECTION_ID RxConnectionId);
+BOOLEAN
+RxFinalizeVNetRoot(
+ _Out_ PV_NET_ROOT ThisVNetRoot,
+ _In_ BOOLEAN RecursiveFinalize,
+ _In_ BOOLEAN ForceFinalize);
+
#define RxWaitForStableVNetRoot(V, R) RxWaitForStableCondition(&(V)->Condition, &(V)->TransitionWaitList, (R), NULL)
#define RxTransitionVNetRoot(V, C) RxUpdateCondition((C), &(V)->Condition, &(V)->TransitionWaitList)
+VOID
+RxSetFileSizeWithLock(
+ _Inout_ PFCB Fcb,
+ _In_ PLONGLONG FileSize);
+
VOID
RxGetFileSizeWithLock(
_In_ PFCB Fcb,
#define RxWaitForStableSrvOpen(S, R) RxWaitForStableCondition(&(S)->Condition, &(S)->TransitionWaitList, (R), NULL)
#define RxTransitionSrvOpen(S, C) RxUpdateCondition((C), &(S)->Condition, &(S)->TransitionWaitList)
+VOID
+RxRemoveNameNetFcb(
+ _Out_ PFCB ThisFcb);
+
LONG
RxpReferenceNetFcb(
_In_ PFCB Fcb);
_In_ BOOLEAN RecursiveFinalize,
_In_ BOOLEAN ForceFinalize);
-extern INLINE
+FORCEINLINE
PUNICODE_STRING
GET_ALREADY_PREFIXED_NAME(
PMRX_SRV_OPEN SrvOpen,
_Out_ PRX_CONTEXT RxContext,
_In_ PMRX_SRV_OPEN MrxSrvOpen);
+BOOLEAN
+RxFinalizeNetFobx(
+ _Out_ PFOBX ThisFobx,
+ _In_ BOOLEAN RecursiveFinalize,
+ _In_ BOOLEAN ForceFinalize);
+
#ifdef __REACTOS__
-#define FILL_IN_FCB(Fcb, a, nl, ct, lat, lwt, lct, as, fs, vdl) \
- (Fcb)->Attributes = a; \
- (Fcb)->NumberOfLinks = nl; \
- (Fcb)->CreationTime.QuadPart = ct; \
- (Fcb)->LastAccessTime.QuadPart = lat; \
- (Fcb)->LastWriteTime.QuadPart = lwt; \
- (Fcb)->LastChangeTime.QuadPart = lct; \
- (Fcb)->ActualAllocationLength = as; \
- (Fcb)->Header.AllocationSize.QuadPart = as; \
- (Fcb)->Header.FileSize.QuadPart = fs; \
- (Fcb)->Header.ValidDataLength.QuadPart = vdl; \
- (Fcb)->FcbState |= FCB_STATE_TIME_AND_SIZE_ALREADY_SET
+#define FILL_IN_FCB(Fcb, a, nl, ct, lat, lwt, lct, as, fs, vdl) \
+ (Fcb)->Attributes = a; \
+ (Fcb)->NumberOfLinks = nl; \
+ (Fcb)->CreationTime.QuadPart = ct; \
+ (Fcb)->LastAccessTime.QuadPart = lat; \
+ (Fcb)->LastWriteTime.QuadPart = lwt; \
+ (Fcb)->LastChangeTime.QuadPart = lct; \
+ (Fcb)->ActualAllocationLength = as; \
+ (Fcb)->Header.AllocationSize.QuadPart = as; \
+ (Fcb)->Header.FileSize.QuadPart = fs; \
+ (Fcb)->Header.ValidDataLength.QuadPart = vdl; \
+ SetFlag((Fcb)->FcbState, FCB_STATE_TIME_AND_SIZE_ALREADY_SET)
#define TRACKER_ACQUIRE_FCB 0x61616161
#define TRACKER_RELEASE_FCB_NO_BUFF_PENDING 0x72727272
#define TRACKER_RELEASE_NON_EXCL_FCB_FOR_THRD_BUFF_PENDING 0x72727430
#define TRACKER_RELEASE_EXCL_FCB_FOR_THRD_BUFF_PENDING 0x72727431
#define TRACKER_FCB_FREE 0x72724372
+
+#define FCB_STATE_BUFFERING_STATE_WITH_NO_SHARES \
+ (( FCB_STATE_WRITECACHING_ENABLED \
+ | FCB_STATE_WRITEBUFFERING_ENABLED \
+ | FCB_STATE_READCACHING_ENABLED \
+ | FCB_STATE_READBUFFERING_ENABLED \
+ | FCB_STATE_LOCK_BUFFERING_ENABLED \
+ | FCB_STATE_FILESIZECACHEING_ENABLED \
+ | FCB_STATE_FILETIMECACHEING_ENABLED))
+
#endif
#endif