[NPFS]
[reactos.git] / reactos / drivers / filesystems / npfs / npfs.h
index cb37cb0..8cf4651 100644 (file)
@@ -3,9 +3,23 @@
 
 #include <ntifs.h>
 #include <ndk/iotypes.h>
+#include <pseh/pseh2.h>
+
+#define TAG_NPFS_CCB 'cFpN'
+#define TAG_NPFS_CCB_DATA 'iFpN' /* correct? */
+#define TAG_NPFS_FCB 'FFpN'
+#define TAG_NPFS_NAMEBLOCK 'nFpN'
+#define TAG_NPFS_THREAD_CONTEXT 'tFpN'
+
+#define ROUND_DOWN(n, align) \
+    (((ULONG)n) & ~((align) - 1l))
+
+#define ROUND_UP(n, align) \
+    ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
 
 typedef enum _FCB_TYPE
 {
+    FCB_INVALID,
     FCB_DEVICE,
     FCB_DIRECTORY,
     FCB_PIPE
@@ -13,6 +27,7 @@ typedef enum _FCB_TYPE
 
 typedef enum _CCB_TYPE
 {
+    CCB_INVALID,
     CCB_DEVICE,
     CCB_DIRECTORY,
     CCB_PIPE
@@ -28,6 +43,7 @@ typedef struct _NPFS_VCB
     ULONG MinQuota;
     ULONG DefaultQuota;
     ULONG MaxQuota;
+    struct _NPFS_FCB *DeviceFcb;
     struct _NPFS_FCB *RootFcb;
 } NPFS_VCB, *PNPFS_VCB;
 
@@ -35,6 +51,7 @@ typedef struct _NPFS_FCB
 {
     FCB_TYPE Type;
     PNPFS_VCB Vcb;
+    volatile LONG RefCount;
     UNICODE_STRING PipeName;
     LIST_ENTRY PipeListEntry;
     KMUTEX CcbListLock;
@@ -54,11 +71,20 @@ typedef struct _NPFS_FCB
     LARGE_INTEGER TimeOut;
 } NPFS_FCB, *PNPFS_FCB;
 
+
+typedef struct _NPFS_CCB_DIRECTORY_DATA
+{
+    UNICODE_STRING SearchPattern;
+    ULONG FileIndex;
+} NPFS_CCB_DIRECTORY_DATA, *PNPFS_CCB_DIRECTORY_DATA;
+
+
 typedef struct _NPFS_CCB
 {
     LIST_ENTRY CcbListEntry;
     CCB_TYPE Type;
     PNPFS_FCB Fcb;
+    PFILE_OBJECT FileObject;
 
     struct _NPFS_CCB* OtherSide;
     struct ETHREAD *Thread;
@@ -69,6 +95,7 @@ typedef struct _NPFS_CCB
     ULONG PipeState;
     ULONG ReadDataAvailable;
     ULONG WriteQuotaAvailable;
+    volatile LONG RefCount;
 
     LIST_ENTRY ReadRequestListHead;
 
@@ -78,6 +105,12 @@ typedef struct _NPFS_CCB
     ULONG MaxDataLength;
 
     FAST_MUTEX DataListLock;    /* Data queue lock */
+
+    union
+    {
+        NPFS_CCB_DIRECTORY_DATA Directory;
+    } u;
+
 } NPFS_CCB, *PNPFS_CCB;
 
 typedef struct _NPFS_CONTEXT
@@ -129,6 +162,9 @@ NTSTATUS NTAPI NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 DRIVER_DISPATCH NpfsClose;
 NTSTATUS NTAPI NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
+DRIVER_DISPATCH NpfsDirectoryControl;
+NTSTATUS NTAPI NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
 DRIVER_DISPATCH NpfsRead;
 NTSTATUS NTAPI NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
@@ -154,9 +190,19 @@ NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
             PUNICODE_STRING RegistryPath);
 
+VOID
+NpfsDereferenceFcb(PNPFS_FCB Fcb);
+
 PNPFS_FCB
 NpfsFindPipe(PNPFS_VCB Vcb,
              PUNICODE_STRING PipeName);
 
+FCB_TYPE
+NpfsGetFcb(PFILE_OBJECT FileObject,
+           PNPFS_FCB *Fcb);
+
+CCB_TYPE
+NpfsGetCcb(PFILE_OBJECT FileObject,
+           PNPFS_CCB *Ccb);
 
 #endif /* __DRIVERS_FS_NP_NPFS_H */