[NPFS]
[reactos.git] / reactos / drivers / filesystems / npfs / npfs.c
index 74fe99b..f794964 100644 (file)
@@ -1,7 +1,7 @@
 /*
 * COPYRIGHT:  See COPYING in the top level directory
 * PROJECT:    ReactOS kernel
-* FILE:       drivers/fs/np/mount.c
+* FILE:       drivers/filesystems/npfs/npfs.c
 * PURPOSE:    Named pipe filesystem
 * PROGRAMMER: David Welch <welch@cwcom.net>
 */
@@ -25,6 +25,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     PNPFS_FCB Fcb;
     NTSTATUS Status;
 
+    UNREFERENCED_PARAMETER(RegistryPath);
+
     DPRINT("Named Pipe FSD 0.0.2\n");
 
     ASSERT (sizeof(NPFS_CONTEXT) <= FIELD_OFFSET(IRP, Tail.Overlay.DriverContext));
@@ -44,8 +46,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
         NpfsQueryVolumeInformation;
     DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup;
     DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers;
-    //   DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
-    //     NpfsDirectoryControl;
+    DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
+        NpfsDirectoryControl;
     DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
         NpfsFileSystemControl;
     //   DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] =
@@ -86,18 +88,83 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     Vcb->MaxQuota = 64 * PAGE_SIZE;
 
     /* Create the device FCB */
-    Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB));
+    Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(NPFS_FCB), TAG_NPFS_FCB);
+    if (!Fcb)
+    {
+        DPRINT1("Out of memory for device FCB!\n");
+        IoDeleteDevice(DeviceObject);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
     Fcb->Type = FCB_DEVICE;
     Fcb->Vcb = Vcb;
+    Fcb->RefCount = 1;
     Vcb->DeviceFcb = Fcb;
 
     /* Create the root directory FCB */
-    Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB));
+    Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(NPFS_FCB), TAG_NPFS_FCB);
+    if (!Fcb)
+    {
+        DPRINT1("Out of memory for root FCB!\n");
+        IoDeleteDevice(DeviceObject);
+        ExFreePoolWithTag(Vcb->DeviceFcb, TAG_NPFS_FCB);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
     Fcb->Type = FCB_DIRECTORY;
     Fcb->Vcb = Vcb;
+    Fcb->RefCount = 1;
     Vcb->RootFcb = Fcb;
 
     return STATUS_SUCCESS;
 }
 
+
+FCB_TYPE
+NpfsGetFcb(PFILE_OBJECT FileObject,
+           PNPFS_FCB *Fcb)
+{
+    PNPFS_FCB LocalFcb = NULL;
+    FCB_TYPE FcbType = FCB_INVALID;
+
+    _SEH2_TRY
+    {
+        LocalFcb = (PNPFS_FCB)FileObject->FsContext;
+        FcbType = LocalFcb->Type;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        LocalFcb = NULL;
+        FcbType = FCB_INVALID;
+    }
+    _SEH2_END;
+
+    *Fcb = LocalFcb;
+
+    return FcbType;
+}
+
+
+CCB_TYPE
+NpfsGetCcb(PFILE_OBJECT FileObject,
+           PNPFS_CCB *Ccb)
+{
+    PNPFS_CCB LocalCcb = NULL;
+    CCB_TYPE CcbType = CCB_INVALID;
+
+    _SEH2_TRY
+    {
+        LocalCcb = (PNPFS_CCB)FileObject->FsContext2;
+        CcbType = LocalCcb->Type;
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        LocalCcb = NULL;
+        CcbType = CCB_INVALID;
+    }
+    _SEH2_END;
+
+    *Ccb = LocalCcb;
+
+    return CcbType;
+}
+
 /* EOF */