[NTFS]
[reactos.git] / reactos / drivers / filesystems / ntfs / dispatch.c
index 4670f45..acc7f51 100644 (file)
 
 /* FUNCTIONS ****************************************************************/
 
+static
+NTSTATUS
+NtfsDispatch(PNTFS_IRP_CONTEXT IrpContext)
+{
+    PIRP Irp = IrpContext->Irp;
+    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+
+    TRACE_(NTFS, "NtfsDispatch()\n");
+
+    FsRtlEnterFileSystem();
+
+    NtfsIsIrpTopLevel(Irp);
+
+    switch (IrpContext->MajorFunction)
+    {
+        case IRP_MJ_QUERY_VOLUME_INFORMATION:
+            Status = NtfsQueryVolumeInformation(IrpContext);
+            break;
+
+        case IRP_MJ_SET_VOLUME_INFORMATION:
+            Status = NtfsSetVolumeInformation(IrpContext);
+            break;
+
+        case IRP_MJ_QUERY_INFORMATION:
+            Status = NtfsQueryInformation(IrpContext);
+            break;
+
+        case IRP_MJ_DIRECTORY_CONTROL:
+            Status = NtfsDirectoryControl(IrpContext);
+            break;
+
+        case IRP_MJ_READ:
+            Status = NtfsRead(IrpContext);
+            break;
+
+        case IRP_MJ_DEVICE_CONTROL:
+            Status = NtfsDeviceControl(IrpContext);
+             break;
+
+        case IRP_MJ_WRITE:
+            Status = NtfsWrite(IrpContext);
+            break;
+    }
+
+    ASSERT((!(IrpContext->Flags & IRPCONTEXT_COMPLETE) && !(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
+           ((IrpContext->Flags & IRPCONTEXT_COMPLETE) && !(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
+           (!(IrpContext->Flags & IRPCONTEXT_COMPLETE) && (IrpContext->Flags & IRPCONTEXT_QUEUE)));
+
+    if (IrpContext->Flags & IRPCONTEXT_COMPLETE)
+    {
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IrpContext->PriorityBoost);
+    }
+
+    if (IrpContext->Flags & IRPCONTEXT_QUEUE)
+    {
+        /* Reset our status flags before queueing the IRP */
+        IrpContext->Flags |= IRPCONTEXT_COMPLETE;
+        IrpContext->Flags &= ~IRPCONTEXT_QUEUE;
+        UNIMPLEMENTED_DBGBREAK();
+    }
+    else
+    {
+        ExFreePoolWithTag(IrpContext, 'PRIN');
+    }
+
+    IoSetTopLevelIrp(NULL);
+    FsRtlExitFileSystem();
+
+    return Status;
+}
+
 /*
  * FUNCTION: This function manages IRP for various major functions
  * ARGUMENTS:
@@ -46,41 +118,21 @@ NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
                 PIRP Irp)
 {
     PNTFS_IRP_CONTEXT IrpContext = NULL;
-    NTSTATUS Status = STATUS_UNSUCCESSFUL;
+    NTSTATUS Status;
 
     TRACE_(NTFS, "NtfsFsdDispatch()\n");
 
-    FsRtlEnterFileSystem();
-    ASSERT(DeviceObject);
-    ASSERT(Irp);
-
-    NtfsIsIrpTopLevel(Irp);
-
     IrpContext = NtfsAllocateIrpContext(DeviceObject, Irp);
-    if (IrpContext)
+    if (IrpContext == NULL)
     {
-        switch (IrpContext->MajorFunction)
-        {
-            case IRP_MJ_QUERY_VOLUME_INFORMATION:
-                Status = NtfsQueryVolumeInformation(IrpContext);
-                break;
-
-            case IRP_MJ_SET_VOLUME_INFORMATION:
-                Status = NtfsSetVolumeInformation(IrpContext);
-                break;
-        }
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
     }
     else
-        Status = STATUS_INSUFFICIENT_RESOURCES;
-
-    Irp->IoStatus.Status = Status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    if (IrpContext)
-        ExFreePoolWithTag(IrpContext, 'PRIN');
-
-    IoSetTopLevelIrp(NULL);
-    FsRtlExitFileSystem();
+    {
+        Status = NtfsDispatch(IrpContext);
+    }
 
-    return Status;
+     return Status;
 }