[FASTFAT] Start implementing FAT32 statistics support
[reactos.git] / drivers / filesystems / npfs / npfs.h
index 77c7fce..5d36d0c 100644 (file)
@@ -6,26 +6,31 @@
  * PROGRAMMERS: ReactOS Portable Systems Group
  */
 
+#ifndef _NPFS_PCH_
+#define _NPFS_PCH_
+
 /* INCLUDES *******************************************************************/
 
-//
-// System Headers
-//
+/* System Headers */
 #include <ntifs.h>
-#include <ntndk.h>
+#include <ndk/obfuncs.h>
 #include <pseh/pseh2.h>
-#define UNIMPLEMENTED
-#define DPRINT1 DbgPrint
+//#define UNIMPLEMENTED
+//#define DPRINT1 DbgPrint
 
-//
-// Allow Microsoft Extensions
-//
+#define NDEBUG
+#include <debug.h>
+#define TRACE(...) /* DPRINT1("%s: ", __FUNCTION__); DbgPrint(__VA_ARGS__) */
+
+/* Allow Microsoft Extensions */
 #ifdef _MSC_VER
 #pragma warning(disable:4201)
 #pragma warning(disable:4214)
 #pragma warning(disable:4100)
 #endif
 
+#define MIN_INDEXED_LENGTH 5
+#define MAX_INDEXED_LENGTH 9
 
 /* TYPEDEFS & DEFINES *********************************************************/
 
 //  NpFs - npfs.sys - Client security context
 //  NpFw - npfs.sys - Write block
 //  NpFW - npfs.sys - Write block
-#define NPFS_CCB_TAG            'NpFc'
-#define NPFS_ROOT_DCB_CCB_TAG   'NpFC'
-#define NPFS_DCB_TAG            'NpFD'
-#define NPFS_FCB_TAG            'NpFf'
-#define NPFS_GLOBAL_TAG         'NpFg'
-#define NPFS_CLIENT_INFO_TAG    'NpFi'
-#define NPFS_NAME_BLOCK_TAG     'NpFn'
-#define NPFS_QUERY_TEMPLATE_TAG 'NpFq'
-#define NPFS_DATA_ENTRY_TAG     'NpFr'
-#define NPFS_CLIENT_SEC_CTX_TAG 'NpFs'
-#define NPFS_WAIT_BLOCK_TAG     'NpFt'
-#define NPFS_WRITE_BLOCK_TAG    'NpFw'
+#define NPFS_CCB_TAG            'cFpN'
+#define NPFS_ROOT_DCB_CCB_TAG   'CFpN'
+#define NPFS_DCB_TAG            'DFpN'
+#define NPFS_FCB_TAG            'fFpN'
+#define NPFS_GLOBAL_TAG         'gFpN'
+#define NPFS_CLIENT_INFO_TAG    'iFpN'
+#define NPFS_NAME_BLOCK_TAG     'nFpN'
+#define NPFS_QUERY_TEMPLATE_TAG 'qFpN'
+#define NPFS_DATA_ENTRY_TAG     'rFpN'
+#define NPFS_CLIENT_SEC_CTX_TAG 'sFpN'
+#define NPFS_WAIT_BLOCK_TAG     'tFpN'
+#define NPFS_WRITE_BLOCK_TAG    'wFpN'
 
 //
 // NPFS bugchecking support
                  (NPFS_BUGCHECK_FILE_ID << 16) | __LINE__,  \
                  (p1), (p2), (p3))
 
-//
-// Node Type Codes for NPFS
-//
+/* Node Type Codes for NPFS */
 #define NPFS_NTC_VCB            1
 #define NPFS_NTC_ROOT_DCB       2
 #define NPFS_NTC_FCB            4
 #define NPFS_NTC_ROOT_DCB_CCB   8
 typedef USHORT NODE_TYPE_CODE, *PNODE_TYPE_CODE;
 
-//
-// Data Queue States
-//
+/* Data Queue States */
 typedef enum _NP_DATA_QUEUE_STATE
 {
     ReadEntries = 0,
@@ -124,18 +125,14 @@ typedef enum _NP_DATA_QUEUE_STATE
     Empty = 2
 } NP_DATA_QUEUE_STATE;
 
-//
-// Data Queue Entry Types
-//
+/* Data Queue Entry Types */
 typedef enum _NP_DATA_QUEUE_ENTRY_TYPE
 {
     Buffered = 0,
     Unbuffered
 } NP_DATA_QUEUE_ENTRY_TYPE;
 
-//
-// An Input or Output Data Queue. Each CCB has two of these.
-//
+/* An Input or Output Data Queue. Each CCB has two of these. */
 typedef struct _NP_DATA_QUEUE
 {
     LIST_ENTRY Queue;
@@ -147,9 +144,7 @@ typedef struct _NP_DATA_QUEUE
     ULONG Quota;
 } NP_DATA_QUEUE, *PNP_DATA_QUEUE;
 
-//
-// The Entries that go into the Queue
-//
+/* The Entries that go into the Queue */
 typedef struct _NP_DATA_QUEUE_ENTRY
 {
     LIST_ENTRY QueueEntry;
@@ -160,18 +155,14 @@ typedef struct _NP_DATA_QUEUE_ENTRY
     ULONG DataSize;
 } NP_DATA_QUEUE_ENTRY, *PNP_DATA_QUEUE_ENTRY;
 
-//
-// A Wait Queue. Only the VCB has one of these.
-//
+/* A Wait Queue. Only the VCB has one of these. */
 typedef struct _NP_WAIT_QUEUE
 {
     LIST_ENTRY WaitList;
     KSPIN_LOCK WaitLock;
 } NP_WAIT_QUEUE, *PNP_WAIT_QUEUE;
 
-//
-// The Entries in the Queue above, one for each Waiter.
-//
+/* The Entries in the Queue above, one for each Waiter. */
 typedef struct _NP_WAIT_QUEUE_ENTRY
 {
     PIRP Irp;
@@ -182,17 +173,13 @@ typedef struct _NP_WAIT_QUEUE_ENTRY
     PFILE_OBJECT FileObject;
 } NP_WAIT_QUEUE_ENTRY, *PNP_WAIT_QUEUE_ENTRY;
 
-//
-// The event buffer in the NonPaged CCB
-//
+/* The event buffer in the NonPaged CCB */
 typedef struct _NP_EVENT_BUFFER
 {
     PKEVENT Event;
 } NP_EVENT_BUFFER, *PNP_EVENT_BUFFER;
 
-//
-// The CCB for the Root DCB
-//
+/* The CCB for the Root DCB */
 typedef struct _NP_ROOT_DCB_CCB
 {
     NODE_TYPE_CODE NodeType;
@@ -200,9 +187,7 @@ typedef struct _NP_ROOT_DCB_CCB
     ULONG Unknown2;
 } NP_ROOT_DCB_CCB, *PNP_ROOT_DCB_FCB;
 
-//
-// The header that both FCB and DCB share
-//
+/* The header that both FCB and DCB share */
 typedef struct _NP_CB_HEADER
 {
     NODE_TYPE_CODE NodeType;
@@ -213,9 +198,7 @@ typedef struct _NP_CB_HEADER
     PSECURITY_DESCRIPTOR SecurityDescriptor;
 } NP_CB_HEADER, *PNP_CB_HEADER;
 
-//
-// The footer that both FCB and DCB share
-//
+/* The footer that both FCB and DCB share */
 typedef struct _NP_CB_FOOTER
 {
     UNICODE_STRING FullName;
@@ -223,19 +206,13 @@ typedef struct _NP_CB_FOOTER
     UNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry;
 } NP_CB_FOOTER;
 
-//
-// A Directory Control Block (DCB)
-//
+/* A Directory Control Block (DCB) */
 typedef struct _NP_DCB
 {
-    //
-    // Common Header
-    //
+    /* Common Header */
     NP_CB_HEADER;
 
-    //
-    // DCB-specific data
-    //
+    /* DCB-specific data */
     LIST_ENTRY NotifyList;
     LIST_ENTRY NotifyList2;
     LIST_ENTRY FcbList;
@@ -243,25 +220,17 @@ typedef struct _NP_DCB
     ULONG Pad;
 #endif
 
-    //
-    // Common Footer
-    //
+    /* Common Footer */
     NP_CB_FOOTER;
 } NP_DCB, *PNP_DCB;
 
-//
-// A File Control BLock (FCB)
-//
+/* A File Control BLock (FCB) */
 typedef struct _NP_FCB
 {
-    //
-    // Common Header
-    //
+    /* Common Header */
     NP_CB_HEADER;
 
-    //
-    // FCB-specific fields
-    //
+    /* FCB-specific fields */
     ULONG MaximumInstances;
     USHORT NamedPipeConfiguration;
     USHORT NamedPipeType;
@@ -271,17 +240,13 @@ typedef struct _NP_FCB
     PVOID Pad[2];
 #endif
 
-    //
-    // Common Footer
-    //
+    /* Common Footer */
     NP_CB_FOOTER;
 } NP_FCB, *PNP_FCB;
 
 C_ASSERT(FIELD_OFFSET(NP_FCB, PrefixTableEntry) == FIELD_OFFSET(NP_DCB, PrefixTableEntry));
 
-//
-// The nonpaged portion of the CCB
-//
+/* The nonpaged portion of the CCB */
 typedef struct _NP_NONPAGED_CCB
 {
     NODE_TYPE_CODE NodeType;
@@ -289,9 +254,7 @@ typedef struct _NP_NONPAGED_CCB
     ERESOURCE Lock;
 } NP_NONPAGED_CCB, *PNP_NONPAGED_CCB;
 
-//
-// A Client Control Block (CCB)
-//
+/* A Client Control Block (CCB) */
 typedef struct _NP_CCB
 {
     NODE_TYPE_CODE NodeType;
@@ -310,9 +273,7 @@ typedef struct _NP_CCB
     LIST_ENTRY IrpList;
 } NP_CCB, *PNP_CCB;
 
-//
-// A Volume Control Block (VCB)
-//
+/* A Volume Control Block (VCB) */
 typedef struct _NP_VCB
 {
     NODE_TYPE_CODE NodeType;
@@ -326,12 +287,42 @@ typedef struct _NP_VCB
 
 extern PNP_VCB NpVcb;
 
+/* Defines an alias */
+typedef struct _NPFS_ALIAS
+{
+    struct _NPFS_ALIAS *Next;
+    PUNICODE_STRING TargetName;
+    UNICODE_STRING Name;
+} NPFS_ALIAS, *PNPFS_ALIAS;
+
+/* Private structure used to enumerate the alias values */
+typedef struct _NPFS_QUERY_VALUE_CONTEXT
+{
+    BOOLEAN SizeOnly;
+    SIZE_T FullSize;
+    ULONG NumberOfAliases;
+    ULONG NumberOfEntries;
+    PNPFS_ALIAS CurrentAlias;
+    PUNICODE_STRING CurrentTargetName;
+    PWCHAR CurrentStringPointer;
+} NPFS_QUERY_VALUE_CONTEXT, *PNPFS_QUERY_VALUE_CONTEXT;
+
+extern PNPFS_ALIAS NpAliasList;
+extern PNPFS_ALIAS NpAliasListByLength[MAX_INDEXED_LENGTH + 1 - MIN_INDEXED_LENGTH];
+
+/* This structure is actually a user-mode structure and should go into a share header */
+typedef struct _NP_CLIENT_PROCESS
+{
+    PVOID Unknown;
+    PVOID Process;
+    USHORT DataLength;
+    WCHAR Buffer[17];
+} NP_CLIENT_PROCESS, *PNP_CLIENT_PROCESS;
 
 /* FUNCTIONS ******************************************************************/
 
-//
-// Functions to lock/unlock the global VCB lock
-//
+/* Functions to lock/unlock the global VCB lock */
+
 FORCEINLINE
 VOID
 NpAcquireSharedVcb(VOID)
@@ -356,14 +347,12 @@ NpReleaseVcb(VOID)
     ExReleaseResourceLite(&NpVcb->Lock);
 }
 
-
-
 //
 // Function to process deferred IRPs outside the VCB lock but still within the
 // critical region
 //
-VOID
 FORCEINLINE
+VOID
 NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
 {
     PLIST_ENTRY ThisEntry, NextEntry;
@@ -385,6 +374,12 @@ NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
     }
 }
 
+LONG
+NTAPI
+NpCompareAliasNames(
+    _In_ PCUNICODE_STRING String1,
+    _In_ PCUNICODE_STRING String2);
+
 BOOLEAN
 NTAPI
 NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
@@ -394,7 +389,6 @@ VOID
 NTAPI
 NpInitializeWaitQueue(IN PNP_WAIT_QUEUE WaitQueue);
 
-
 NTSTATUS
 NTAPI
 NpUninitializeDataQueue(IN PNP_DATA_QUEUE DataQueue);
@@ -415,7 +409,7 @@ NTAPI
 NpAddDataQueueEntry(IN ULONG NamedPipeEnd,
                     IN PNP_CCB Ccb,
                     IN PNP_DATA_QUEUE DataQueue,
-                    IN ULONG Who, 
+                    IN ULONG Who,
                     IN ULONG Type,
                     IN ULONG DataSize,
                     IN PIRP Irp,
@@ -490,7 +484,6 @@ NTAPI
 NpFsdClose(IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP Irp);
 
-
 NTSTATUS
 NTAPI
 NpFsdCleanup(IN PDEVICE_OBJECT DeviceObject,
@@ -510,20 +503,19 @@ NpSetConnectedPipeState(IN PNP_CCB Ccb,
 NTSTATUS
 NTAPI
 NpSetListeningPipeState(IN PNP_CCB Ccb,
-                        IN PIRP Irp, 
+                        IN PIRP Irp,
                         IN PLIST_ENTRY List);
 
-
 NTSTATUS
 NTAPI
-NpSetDisconnectedPipeState(IN PNP_CCB Ccb, 
+NpSetDisconnectedPipeState(IN PNP_CCB Ccb,
                            IN PLIST_ENTRY List);
 
 NTSTATUS
 NTAPI
 NpSetClosingPipeState(IN PNP_CCB Ccb,
-                      IN PIRP Irp, 
-                      IN ULONG NamedPipeEnd, 
+                      IN PIRP Irp,
+                      IN ULONG NamedPipeEnd,
                       IN PLIST_ENTRY List);
 
 VOID
@@ -594,7 +586,7 @@ NTSTATUS
 NTAPI
 NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue,
             IN LARGE_INTEGER WaitTime,
-            IN PIRP Irp, 
+            IN PIRP Irp,
             IN PUNICODE_STRING AliasName);
 
 NTSTATUS
@@ -607,27 +599,27 @@ NpCancelWaiter(IN PNP_WAIT_QUEUE WaitQueue,
 
 IO_STATUS_BLOCK
 NTAPI
-NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, 
+NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue,
                 IN BOOLEAN Peek,
                 IN BOOLEAN ReadOverflowOperation,
                 IN PVOID Buffer,
-                IN ULONG BufferSize, 
-                IN ULONG Mode, 
+                IN ULONG BufferSize,
+                IN ULONG Mode,
                 IN PNP_CCB Ccb,
                 IN PLIST_ENTRY List);
 
 
-NTSTATUS 
+NTSTATUS
 NTAPI
 NpWriteDataQueue(IN PNP_DATA_QUEUE WriteQueue,
-                 IN ULONG Mode, 
-                 IN PVOID OutBuffer, 
-                 IN ULONG OutBufferSize, 
-                 IN ULONG PipeType, 
-                 OUT PULONG BytesWritten, 
-                 IN PNP_CCB Ccb, 
-                 IN ULONG NamedPipeEnd, 
-                 IN PETHREAD Thread, 
+                 IN ULONG Mode,
+                 IN PVOID OutBuffer,
+                 IN ULONG OutBufferSize,
+                 IN ULONG PipeType,
+                 OUT PULONG BytesWritten,
+                 IN PNP_CCB Ccb,
+                 IN ULONG NamedPipeEnd,
+                 IN PETHREAD Thread,
                  IN PLIST_ENTRY List);
 
 NTSTATUS
@@ -635,6 +627,34 @@ NTAPI
 NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
           IN PIRP Irp);
 
+_Function_class_(FAST_IO_READ)
+_IRQL_requires_same_
+BOOLEAN
+NTAPI
+NpFastRead(
+    _In_ PFILE_OBJECT FileObject,
+    _In_ PLARGE_INTEGER FileOffset,
+    _In_ ULONG Length,
+    _In_ BOOLEAN Wait,
+    _In_ ULONG LockKey,
+    _Out_ PVOID Buffer,
+    _Out_ PIO_STATUS_BLOCK IoStatus,
+    _In_ PDEVICE_OBJECT DeviceObject);
+
+_Function_class_(FAST_IO_WRITE)
+_IRQL_requires_same_
+BOOLEAN
+NTAPI
+NpFastWrite(
+    _In_ PFILE_OBJECT FileObject,
+    _In_ PLARGE_INTEGER FileOffset,
+    _In_ ULONG Length,
+    _In_ BOOLEAN Wait,
+    _In_ ULONG LockKey,
+    _In_ PVOID Buffer,
+    _Out_ PIO_STATUS_BLOCK IoStatus,
+    _In_ PDEVICE_OBJECT DeviceObject);
+
 
 NTSTATUS
 NTAPI
@@ -672,4 +692,4 @@ NTAPI
 NpFsdQueryVolumeInformation(IN PDEVICE_OBJECT DeviceObject,
                             IN PIRP Irp);
 
-/* EOF */
+#endif /* _NPFS_PCH_ */