- Update to r53061
[reactos.git] / drivers / filesystems / npfs / npfs.c
index 147f410..58b0ffc 100644 (file)
@@ -19,9 +19,10 @@ NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
             PUNICODE_STRING RegistryPath)
 {
-    PNPFS_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT DeviceObject;
     UNICODE_STRING DeviceName;
+    PNPFS_VCB Vcb;
+    PNPFS_FCB Fcb;
     NTSTATUS Status;
 
     DPRINT("Named Pipe FSD 0.0.2\n");
@@ -43,8 +44,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] =
@@ -56,7 +57,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
 
     RtlInitUnicodeString(&DeviceName, L"\\Device\\NamedPipe");
     Status = IoCreateDevice(DriverObject,
-        sizeof(NPFS_DEVICE_EXTENSION),
+        sizeof(NPFS_VCB),
         &DeviceName,
         FILE_DEVICE_NAMED_PIPE,
         0,
@@ -68,23 +69,85 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
         return Status;
     }
 
-    /* initialize the device object */
+    /* Initialize the device object */
     DeviceObject->Flags |= DO_DIRECT_IO;
     DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
-    /* initialize the device extension */
-    DeviceExtension = DeviceObject->DeviceExtension;
-    InitializeListHead(&DeviceExtension->PipeListHead);
-    InitializeListHead(&DeviceExtension->ThreadListHead);
-    KeInitializeMutex(&DeviceExtension->PipeListLock, 0);
-    DeviceExtension->EmptyWaiterCount = 0;
+    /* Initialize the Volume Control Block (VCB) */
+    Vcb = (PNPFS_VCB)DeviceObject->DeviceExtension;
+    InitializeListHead(&Vcb->PipeListHead);
+    InitializeListHead(&Vcb->ThreadListHead);
+    KeInitializeMutex(&Vcb->PipeListLock, 0);
+    Vcb->EmptyWaiterCount = 0;
 
     /* set the size quotas */
-    DeviceExtension->MinQuota = PAGE_SIZE;
-    DeviceExtension->DefaultQuota = 8 * PAGE_SIZE;
-    DeviceExtension->MaxQuota = 64 * PAGE_SIZE;
+    Vcb->MinQuota = PAGE_SIZE;
+    Vcb->DefaultQuota = 8 * PAGE_SIZE;
+    Vcb->MaxQuota = 64 * PAGE_SIZE;
+
+    /* Create the device FCB */
+    Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(NPFS_FCB), TAG_NPFS_FCB);
+    Fcb->Type = FCB_DEVICE;
+    Fcb->Vcb = Vcb;
+    Vcb->DeviceFcb = Fcb;
+
+    /* Create the root directory FCB */
+    Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(NPFS_FCB), TAG_NPFS_FCB);
+    Fcb->Type = FCB_DIRECTORY;
+    Fcb->Vcb = Vcb;
+    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 */