[ros-diffs] [pschweitzer] 32621: - Reworked NtfsAllocateIrpContext to avoid working with null IRP.... - Rewritten NtfsFsdDirectoryControl (using IrpContext, etc)

pschweitzer at svn.reactos.org pschweitzer at svn.reactos.org
Sun Mar 9 14:58:25 CET 2008


Author: pschweitzer
Date: Sun Mar  9 08:58:25 2008
New Revision: 32621

URL: http://svn.reactos.org/svn/reactos?rev=3D32621&view=3Drev
Log:
- Reworked NtfsAllocateIrpContext to avoid working with null IRP....
- Rewritten NtfsFsdDirectoryControl (using IrpContext, etc)

Modified:
    trunk/reactos/drivers/filesystems/ntfs/dirctl.c
    trunk/reactos/drivers/filesystems/ntfs/misc.c

Modified: trunk/reactos/drivers/filesystems/ntfs/dirctl.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/n=
tfs/dirctl.c?rev=3D32621&r1=3D32620&r2=3D32621&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/drivers/filesystems/ntfs/dirctl.c (original)
+++ trunk/reactos/drivers/filesystems/ntfs/dirctl.c Sun Mar  9 08:58:25 2008
@@ -477,10 +477,11 @@
 }
 #endif
 =

-static NTSTATUS
-NtfsQueryDirectory(PDEVICE_OBJECT DeviceObject,
-		   PIRP Irp)
+NTSTATUS
+NtfsQueryDirectory(PNTFS_IRP_CONTEXT IrpContext)
 {
+  PIRP Irp;
+  PDEVICE_OBJECT DeviceObject;
   PDEVICE_EXTENSION DeviceExtension;
   LONG BufferLength =3D 0;
   PUNICODE_STRING SearchPattern =3D NULL;
@@ -498,6 +499,10 @@
 =

   DPRINT1("NtfsQueryDirectory() called\n");
 =

+  ASSERT(IrpContext);
+  Irp =3D IrpContext->Irp;
+  DeviceObject =3D IrpContext->DeviceObject;
+
   DeviceExtension =3D DeviceObject->DeviceExtension;
   Stack =3D IoGetCurrentIrpStackLocation(Irp);
   FileObject =3D Stack->FileObject;
@@ -672,37 +677,49 @@
 NtfsFsdDirectoryControl(PDEVICE_OBJECT DeviceObject,
                         PIRP Irp)
 {
-  PIO_STACK_LOCATION Stack;
-  NTSTATUS Status;
+  PNTFS_IRP_CONTEXT IrpContext =3D NULL;
+  NTSTATUS Status =3D STATUS_UNSUCCESSFUL;
 =

   DPRINT1("NtfsDirectoryControl() called\n");
 =

-  Stack =3D IoGetCurrentIrpStackLocation(Irp);
-
-  switch (Stack->MinorFunction)
-  {
-    case IRP_MN_QUERY_DIRECTORY:
-      Status =3D NtfsQueryDirectory(DeviceObject,
-                                  Irp);
-      break;
-
-    case IRP_MN_NOTIFY_CHANGE_DIRECTORY:
-      DPRINT1("IRP_MN_NOTIFY_CHANGE_DIRECTORY\n");
-      Status =3D STATUS_NOT_IMPLEMENTED;
-      break;
-
-    default:
-      DPRINT1("NTFS: MinorFunction %d\n", Stack->MinorFunction);
-      Status =3D STATUS_INVALID_DEVICE_REQUEST;
-      break;
-  }
-
+  FsRtlEnterFileSystem();
+  ASSERT(DeviceObject);
+  ASSERT(Irp);
+
+  NtfsIsIrpTopLevel(Irp);
+
+  IrpContext =3D NtfsAllocateIrpContext(DeviceObject, Irp);
+  if (IrpContext)
+  {
+    switch (IrpContext->MinorFunction)
+    {
+      case IRP_MN_QUERY_DIRECTORY:
+        Status =3D NtfsQueryDirectory(IrpContext);
+        break;
+      =

+      case IRP_MN_NOTIFY_CHANGE_DIRECTORY:
+        DPRINT1("IRP_MN_NOTIFY_CHANGE_DIRECTORY\n");
+        Status =3D STATUS_NOT_IMPLEMENTED;
+        break;
+        =

+      default:
+        Status =3D STATUS_INVALID_DEVICE_REQUEST;
+        break;
+    }
+  }
+  else
+    Status =3D STATUS_INSUFFICIENT_RESOURCES;
+  =

   Irp->IoStatus.Status =3D Status;
   Irp->IoStatus.Information =3D 0;
-
   IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-  return(Status);
+  =

+  if (IrpContext)
+    ExFreePoolWithTag(IrpContext, TAG('N', 'I', 'R', 'P'));
+  =

+  IoSetTopLevelIrp(NULL);
+  FsRtlExitFileSystem();
+  return Status;
 }
 =

 /* EOF */

Modified: trunk/reactos/drivers/filesystems/ntfs/misc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/n=
tfs/misc.c?rev=3D32621&r1=3D32620&r2=3D32621&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/drivers/filesystems/ntfs/misc.c (original)
+++ trunk/reactos/drivers/filesystems/ntfs/misc.c Sun Mar  9 08:58:25 2008
@@ -74,20 +74,24 @@
   =

   TRACE_(NTFS, "NtfsAllocateIrpContext()\n");
   =

-  IoStackLocation =3D IoGetCurrentIrpStackLocation(Irp);
-  =

   IrpContext =3D (PNTFS_IRP_CONTEXT)ExAllocatePoolWithTag(NonPagedPool, si=
zeof(NTFS_IRP_CONTEXT), TAG('N', 'I', 'R', 'P'));
   if (IrpContext =3D=3D NULL)
     return NULL;
-    =

   RtlZeroMemory(IrpContext, sizeof(NTFS_IRP_CONTEXT));
+
   IrpContext->Identifier.Type =3D NTFS_TYPE_IRP_CONTEST;
   IrpContext->Identifier.Size =3D sizeof(NTFS_IRP_CONTEXT);
   IrpContext->Irp =3D Irp;
-  IrpContext->MajorFunction =3D IoStackLocation->MajorFunction;
-  IrpContext->MinorFunction =3D IoStackLocation->MinorFunction;
   IrpContext->DeviceObject =3D DeviceObject;
-  IrpContext->IsTopLevel =3D (IoGetTopLevelIrp() =3D=3D Irp);
+  if (Irp)
+  {
+    IoStackLocation =3D IoGetCurrentIrpStackLocation(Irp);
+    ASSERT(IoStackLocation);
+
+    IrpContext->MajorFunction =3D IoStackLocation->MajorFunction;
+    IrpContext->MinorFunction =3D IoStackLocation->MinorFunction;
+    IrpContext->IsTopLevel =3D (IoGetTopLevelIrp() =3D=3D Irp);
+  }
   =

   return IrpContext;
 }




More information about the Ros-diffs mailing list