[RDBSS]
[reactos.git] / reactos / sdk / include / ddk / fcb.h
index 726750e..417b610 100644 (file)
@@ -27,6 +27,9 @@ typedef struct _SRV_CALL
     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
@@ -197,6 +200,7 @@ typedef struct _FCB
 } 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
@@ -208,10 +212,14 @@ typedef struct _FCB
 #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
@@ -221,6 +229,17 @@ typedef struct _FCB
 #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;
@@ -269,9 +288,18 @@ typedef struct _SRV_OPEN
 
 #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
 {
@@ -325,6 +353,7 @@ 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;
 
@@ -343,60 +372,73 @@ RxpTrackDereference(
     _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(
@@ -463,9 +505,20 @@ RxCreateVNetRoot(
     _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,
@@ -523,6 +576,10 @@ RxFinishFcbInitialization(
 #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);
@@ -549,7 +606,7 @@ RxFinalizeSrvOpen(
     _In_ BOOLEAN RecursiveFinalize,
     _In_ BOOLEAN ForceFinalize);
 
-extern INLINE
+FORCEINLINE
 PUNICODE_STRING
 GET_ALREADY_PREFIXED_NAME(
     PMRX_SRV_OPEN SrvOpen,
@@ -578,19 +635,25 @@ RxCreateNetFobx(
     _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
@@ -600,6 +663,16 @@ RxCreateNetFobx(
 #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