/*
 * PROJECT:         ReactOS Kernel
 * LICENSE:         GPL - See COPYING in the top level directory
 * FILE:            ntoskrnl/include/internal/fsrtl.h
 * PURPOSE:         Internal header for the File System Runtime Library
 * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
 */

//
// Define this if you want debugging support
//
#define _FSRTL_DEBUG_                                   0x00

//
// These define the Debug Masks Supported
//
#define FSRTL_FASTIO_DEBUG                              0x01
#define FSRTL_OPLOCK_DEBUG                              0x02
#define FSRTL_TUNNEL_DEBUG                              0x04
#define FSRTL_MCB_DEBUG                                 0x08
#define FSRTL_NAME_DEBUG                                0x10
#define FSRTL_NOTIFY_DEBUG                              0x20
#define FSRTL_FILELOCK_DEBUG                            0x40
#define FSRTL_UNC_DEBUG                                 0x80
#define FSRTL_FILTER_DEBUG                              0x100
#define FSRTL_CONTEXT_DEBUG                             0x200

//
// Debug/Tracing support
//
#if _FSRTL_DEBUG_
#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
#define FSTRACE DbgPrintEx
#else
#define FSTRACE(x, ...)                                 \
    if (x & FsRtlpTraceLevel) DbgPrint(__VA_ARGS__)
#endif
#else
#define FSTRACE(x, ...) DPRINT(__VA_ARGS__)
#endif

//
// Number of internal ERESOURCE structures allocated for callers to request
//
#define FSRTL_MAX_RESOURCES 16

//
// Number of maximum pair count per MCB
//
#define MAXIMUM_PAIR_COUNT  15

//
// Notifications flags
//
#define WATCH_TREE         0x01
#define NOTIFY_IMMEDIATELY 0x02
#define CLEANUP_IN_PROCESS 0x04
#define NOTIFY_LATER       0x08
#define WATCH_ROOT         0x10
#define DELETE_IN_PROCESS  0x20

//
// Internal structure for NOTIFY_SYNC
//
typedef struct _REAL_NOTIFY_SYNC
{
    FAST_MUTEX FastMutex;
    ULONG_PTR OwningThread;
    ULONG OwnerCount;
} REAL_NOTIFY_SYNC, * PREAL_NOTIFY_SYNC;

//
// Internal structure for notifications
//
typedef struct _NOTIFY_CHANGE
{
    PREAL_NOTIFY_SYNC NotifySync;
    PVOID FsContext;
    PVOID StreamID;
    PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback;
    PSECURITY_SUBJECT_CONTEXT SubjectContext;
    PSTRING FullDirectoryName;
    LIST_ENTRY NotifyList;
    LIST_ENTRY NotifyIrps;
    PFILTER_REPORT_CHANGE FilterCallback;
    USHORT Flags;
    UCHAR CharacterSize;
    ULONG CompletionFilter;
    PVOID AllocatedBuffer;
    PVOID Buffer;
    ULONG BufferLength;
    ULONG ThisBufferLength;
    ULONG DataLength;
    ULONG LastEntry;
    ULONG ReferenceCount;
    PEPROCESS OwningProcess;
} NOTIFY_CHANGE, *PNOTIFY_CHANGE;

//
// Internal structure for MCB Mapping pointer
//
typedef struct _INT_MAPPING
{
    VBN Vbn;
    LBN Lbn;
} INT_MAPPING, *PINT_MAPPING;

//
// Initialization Routines
//
INIT_FUNCTION
VOID
NTAPI
FsRtlInitializeLargeMcbs(
    VOID
);

INIT_FUNCTION
VOID
NTAPI
FsRtlInitializeTunnels(
    VOID
);

//
// File contexts Routines
//
VOID
NTAPI
FsRtlPTeardownPerFileObjectContexts(
    IN PFILE_OBJECT FileObject
);

INIT_FUNCTION
BOOLEAN
NTAPI
FsRtlInitSystem(
    VOID
);

//
// Global data inside the File System Runtime Library
//
extern PERESOURCE FsRtlPagingIoResources;
extern PAGED_LOOKASIDE_LIST FsRtlFileLockLookasideList;