Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / drivers / filesystems / npfs / fileobsup.c
diff --git a/drivers/filesystems/npfs/fileobsup.c b/drivers/filesystems/npfs/fileobsup.c
new file mode 100644 (file)
index 0000000..4bbe1f7
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * PROJECT:     ReactOS Named Pipe FileSystem
+ * LICENSE:     BSD - See COPYING.ARM in the top level directory
+ * FILE:        drivers/filesystems/npfs/fileobsup.c
+ * PURPOSE:     Pipes File Object Support
+ * PROGRAMMERS: ReactOS Portable Systems Group
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "npfs.h"
+
+// File ID number for NPFS bugchecking support
+#define NPFS_BUGCHECK_FILE_ID   (NPFS_BUGCHECK_FILEOBSUP)
+
+/* FUNCTIONS ******************************************************************/
+
+NODE_TYPE_CODE
+NTAPI
+NpDecodeFileObject(IN PFILE_OBJECT FileObject,
+                   OUT PVOID* PrimaryContext OPTIONAL,
+                   OUT PNP_CCB* Ccb,
+                   OUT PULONG NamedPipeEnd OPTIONAL)
+{
+    ULONG_PTR Context;
+    PNP_CCB Node;
+    PAGED_CODE();
+
+    Context = (ULONG_PTR)FileObject->FsContext;
+    if ((Context) && (Context != 1))
+    {
+        if (NamedPipeEnd) *NamedPipeEnd = Context & 1;
+
+        Node = (PVOID)(Context & ~1);
+
+        switch (Node->NodeType)
+        {
+            case NPFS_NTC_VCB:
+                return NPFS_NTC_VCB;
+
+            case NPFS_NTC_ROOT_DCB:
+                *Ccb = FileObject->FsContext2;
+                if (PrimaryContext) *PrimaryContext = Node;
+                return NPFS_NTC_ROOT_DCB;
+
+            case NPFS_NTC_CCB:
+                *Ccb = Node;
+                if (PrimaryContext) *PrimaryContext = Node->Fcb;
+                return NPFS_NTC_CCB;
+
+            default:
+                NpBugCheck(Node->NodeType, 0, 0);
+                break;
+            }
+    }
+
+    return 0;
+}
+
+VOID
+NTAPI
+NpSetFileObject(IN PFILE_OBJECT FileObject,
+                IN PVOID PrimaryContext,
+                IN PVOID Ccb,
+                IN ULONG NamedPipeEnd)
+{
+    BOOLEAN FileIsPipe;
+    PAGED_CODE();
+
+    if (!FileObject) return;
+
+    if ((PrimaryContext) && (((PNP_CCB)PrimaryContext)->NodeType == NPFS_NTC_CCB))
+    {
+        FileIsPipe = TRUE;
+        if (NamedPipeEnd == FILE_PIPE_SERVER_END)
+        {
+            PrimaryContext = (PVOID) ((ULONG_PTR) PrimaryContext | 1);
+        }
+    }
+    else
+    {
+        FileIsPipe = FALSE;
+    }
+
+    FileObject->FsContext = PrimaryContext;
+    FileObject->FsContext2 = Ccb;
+    FileObject->PrivateCacheMap = (PVOID)1;
+    if (FileIsPipe) FileObject->Flags |= FO_NAMED_PIPE;
+}
+
+/* EOF */