Author: pschweitzer
Date: Sun May 24 10:48:15 2015
New Revision: 67875
URL: http://svn.reactos.org/svn/reactos?rev=67875&view=rev
Log:
[NTFS]
Split NtfsFsdDispatch() in two.
Now, NtfsFsdDispatch() will only take care of allocating the IRP context and complete the IRP in case it failed (that fixes a null-pointer dereference, just for the record).
NtfsDispatch() will really dispatch the IRP to the internal functions. So that it can be called either directly from NtfsFsdDispatch() or by a queued IRP (to be implemented).
Modified:
trunk/reactos/drivers/filesystems/ntfs/dispatch.c
Modified: trunk/reactos/drivers/filesystems/ntfs/dispatch.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/ntfs/d…
==============================================================================
--- trunk/reactos/drivers/filesystems/ntfs/dispatch.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/ntfs/dispatch.c [iso-8859-1] Sun May 24 10:48:15 2015
@@ -33,61 +33,45 @@
/* FUNCTIONS ****************************************************************/
-/*
- * FUNCTION: This function manages IRP for various major functions
- * ARGUMENTS:
- * DriverObject = object describing this driver
- * Irp = IRP to be passed to internal functions
- * RETURNS: Status of I/O Request
- */
+static
NTSTATUS
-NTAPI
-NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
+NtfsDispatch(PNTFS_IRP_CONTEXT IrpContext)
{
- PNTFS_IRP_CONTEXT IrpContext = NULL;
+ PIRP Irp = IrpContext->Irp;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
- TRACE_(NTFS, "NtfsFsdDispatch()\n");
+ TRACE_(NTFS, "NtfsDispatch()\n");
FsRtlEnterFileSystem();
- ASSERT(DeviceObject);
- ASSERT(Irp);
NtfsIsIrpTopLevel(Irp);
- IrpContext = NtfsAllocateIrpContext(DeviceObject, Irp);
- if (IrpContext)
+ switch (IrpContext->MajorFunction)
{
- switch (IrpContext->MajorFunction)
- {
- case IRP_MJ_QUERY_VOLUME_INFORMATION:
- Status = NtfsQueryVolumeInformation(IrpContext);
- break;
+ case IRP_MJ_QUERY_VOLUME_INFORMATION:
+ Status = NtfsQueryVolumeInformation(IrpContext);
+ break;
- case IRP_MJ_SET_VOLUME_INFORMATION:
- Status = NtfsSetVolumeInformation(IrpContext);
- break;
+ case IRP_MJ_SET_VOLUME_INFORMATION:
+ Status = NtfsSetVolumeInformation(IrpContext);
+ break;
- case IRP_MJ_QUERY_INFORMATION:
- Status = NtfsQueryInformation(IrpContext);
- break;
+ case IRP_MJ_QUERY_INFORMATION:
+ Status = NtfsQueryInformation(IrpContext);
+ break;
- case IRP_MJ_DIRECTORY_CONTROL:
- Status = NtfsDirectoryControl(IrpContext);
- break;
+ case IRP_MJ_DIRECTORY_CONTROL:
+ Status = NtfsDirectoryControl(IrpContext);
+ break;
- case IRP_MJ_READ:
- Status = NtfsRead(IrpContext);
- break;
+ case IRP_MJ_READ:
+ Status = NtfsRead(IrpContext);
+ break;
- case IRP_MJ_DEVICE_CONTROL:
- Status = NtfsDeviceControl(IrpContext);
- break;
- }
+ case IRP_MJ_DEVICE_CONTROL:
+ Status = NtfsDeviceControl(IrpContext);
+ break;
}
- else
- Status = STATUS_INSUFFICIENT_RESOURCES;
ASSERT((!(IrpContext->Flags & IRPCONTEXT_COMPLETE) && !(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
((IrpContext->Flags & IRPCONTEXT_COMPLETE) && !(IrpContext->Flags & IRPCONTEXT_QUEUE)) ||
@@ -107,3 +91,35 @@
return Status;
}
+
+/*
+ * FUNCTION: This function manages IRP for various major functions
+ * ARGUMENTS:
+ * DriverObject = object describing this driver
+ * Irp = IRP to be passed to internal functions
+ * RETURNS: Status of I/O Request
+ */
+NTSTATUS
+NTAPI
+NtfsFsdDispatch(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ PNTFS_IRP_CONTEXT IrpContext = NULL;
+ NTSTATUS Status;
+
+ TRACE_(NTFS, "NtfsFsdDispatch()\n");
+
+ IrpContext = NtfsAllocateIrpContext(DeviceObject, Irp);
+ if (IrpContext == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+ else
+ {
+ Status = NtfsDispatch(IrpContext);
+ }
+
+ return Status;
+}