cleanup NtDeviceIoControlFile a bit...remove some redundant stuff
Modified: trunk/reactos/ntoskrnl/io/device.c

Modified: trunk/reactos/ntoskrnl/io/device.c
--- trunk/reactos/ntoskrnl/io/device.c	2005-05-12 03:00:49 UTC (rev 15234)
+++ trunk/reactos/ntoskrnl/io/device.c	2005-05-12 04:17:43 UTC (rev 15235)
@@ -1104,114 +1104,123 @@
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-NtDeviceIoControlFile (IN HANDLE DeviceHandle,
-		       IN HANDLE Event OPTIONAL,
-		       IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
-		       IN PVOID UserApcContext OPTIONAL,
-		       OUT PIO_STATUS_BLOCK IoStatusBlock,
-		       IN ULONG IoControlCode,
-		       IN PVOID InputBuffer,
-		       IN ULONG InputBufferLength OPTIONAL,
-		       OUT PVOID OutputBuffer,
-		       IN ULONG OutputBufferLength OPTIONAL)
+NTSTATUS 
+STDCALL
+NtDeviceIoControlFile(IN HANDLE DeviceHandle,
+                      IN HANDLE Event OPTIONAL,
+                      IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
+                      IN PVOID UserApcContext OPTIONAL,
+                      OUT PIO_STATUS_BLOCK IoStatusBlock,
+                      IN ULONG IoControlCode,
+                      IN PVOID InputBuffer,
+                      IN ULONG InputBufferLength OPTIONAL,
+                      OUT PVOID OutputBuffer,
+                      IN ULONG OutputBufferLength OPTIONAL)
 {
-  NTSTATUS Status;
-  PFILE_OBJECT FileObject;
-  PDEVICE_OBJECT DeviceObject;
-  PIRP Irp;
-  PIO_STACK_LOCATION StackPtr;
-  PKEVENT EventObject;
-  KPROCESSOR_MODE PreviousMode;
+    NTSTATUS Status = STATUS_SUCCESS;
+    PFILE_OBJECT FileObject;
+    PDEVICE_OBJECT DeviceObject;
+    PIRP Irp;
+    PIO_STACK_LOCATION StackPtr;
+    PKEVENT EventObject = NULL;
+    BOOLEAN LocalEvent;
+    KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
 
-  DPRINT("NtDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x "
-         "UserApcContext %x IoStatusBlock %x IoControlCode %x "
-         "InputBuffer %x InputBufferLength %x OutputBuffer %x "
-         "OutputBufferLength %x)\n",
-         DeviceHandle,Event,UserApcRoutine,UserApcContext,IoStatusBlock,
-         IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,
-         OutputBufferLength);
+    DPRINT("NtDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x "
+           "UserApcContext %x IoStatusBlock %x IoControlCode %x "
+           "InputBuffer %x InputBufferLength %x OutputBuffer %x "
+           "OutputBufferLength %x)\n",
+           DeviceHandle,Event,UserApcRoutine,UserApcContext,IoStatusBlock,
+           IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,
+           OutputBufferLength);
 
-  if (IoStatusBlock == NULL)
-    return STATUS_ACCESS_VIOLATION;
+    if (IoStatusBlock == NULL) return STATUS_ACCESS_VIOLATION;
 
-  PreviousMode = ExGetPreviousMode();
+    /* Check granted access against the access rights from IoContolCode */
+    Status = ObReferenceObjectByHandle(DeviceHandle,
+                                       (IoControlCode >> 14) & 0x3,
+                                       IoFileObjectType,
+                                       PreviousMode,
+                                       (PVOID *) &FileObject,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) return Status;
 
-  /* Check granted access against the access rights from IoContolCode */
-  Status = ObReferenceObjectByHandle (DeviceHandle,
-				      (IoControlCode >> 14) & 0x3,
-				      IoFileObjectType,
-				      PreviousMode,
-				      (PVOID *) &FileObject,
-				      NULL);
-  if (!NT_SUCCESS(Status))
+    /* Check for an event */
+    if (Event)
     {
-      return Status;
+        /* Reference it */
+        Status = ObReferenceObjectByHandle(Event,
+                                           EVENT_MODIFY_STATE,
+                                           ExEventObjectType,
+                                           PreviousMode,
+                                           (PVOID*)&EventObject,
+                                           NULL);
+        if (!NT_SUCCESS(Status))
+        {
+            ObDereferenceObject (FileObject);
+            return Status;
+        }
+        
+        /* Clear it */
+        KeClearEvent(EventObject);
     }
 
-  if (Event != NULL)
+    /* Check if this is a direct open or not */
+    if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
     {
-      Status = ObReferenceObjectByHandle (Event,
-                                          SYNCHRONIZE,
-                                          ExEventObjectType,
-                                          PreviousMode,
-                                          (PVOID*)&EventObject,
-                                          NULL);
-      if (!NT_SUCCESS(Status))
-	{
-	  ObDereferenceObject (FileObject);
-	  return Status;
-	}
-     }
-   else
-     {
-       EventObject = &FileObject->Event;
-       KeResetEvent (EventObject);
-     }
+        DeviceObject = IoGetAttachedDevice(FileObject->DeviceObject);
+    }
+    else
+    {
+        DeviceObject = IoGetRelatedDeviceObject(FileObject);
+    }
 
-  DeviceObject = FileObject->DeviceObject;
+    /* Check if we should use Sync IO or not */
+    if (FileObject->Flags & FO_SYNCHRONOUS_IO)
+    {
+        /* Use File Object event */
+        KeClearEvent(&FileObject->Event);
+    }
+    else
+    {
+        /* Use local event */
+        LocalEvent = TRUE;
+    }
 
-  Irp = IoBuildDeviceIoControlRequest (IoControlCode,
-				       DeviceObject,
-				       InputBuffer,
-				       InputBufferLength,
-				       OutputBuffer,
-				       OutputBufferLength,
-				       FALSE,
-				       EventObject,
-				       IoStatusBlock);
+    /* Build the IRP */
+    Irp = IoBuildDeviceIoControlRequest(IoControlCode,
+                                        DeviceObject,
+                                        InputBuffer,
+                                        InputBufferLength,
+                                        OutputBuffer,
+                                        OutputBufferLength,
+                                        FALSE,
+                                        EventObject,
+                                        IoStatusBlock);
 
-  /* Trigger FileObject/Event dereferencing */
-  Irp->Tail.Overlay.OriginalFileObject = FileObject;
+    /* Set some extra settings */
+    Irp->Tail.Overlay.OriginalFileObject = FileObject;
+    Irp->RequestorMode = PreviousMode;
+    StackPtr = IoGetNextIrpStackLocation(Irp);
+    StackPtr->FileObject = FileObject;
 
-  Irp->RequestorMode = PreviousMode;
-  Irp->Overlay.AsynchronousParameters.UserApcRoutine = UserApcRoutine;
-  Irp->Overlay.AsynchronousParameters.UserApcContext = UserApcContext;
-
-  StackPtr = IoGetNextIrpStackLocation(Irp);
-  StackPtr->FileObject = FileObject;
-  StackPtr->DeviceObject = DeviceObject;
-  StackPtr->Parameters.DeviceIoControl.InputBufferLength = InputBufferLength;
-  StackPtr->Parameters.DeviceIoControl.OutputBufferLength = OutputBufferLength;
-
-  Status = IoCallDriver(DeviceObject,Irp);
-  if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+    /* Call the Driver */
+    Status = IoCallDriver(DeviceObject, Irp);
+    if (Status == STATUS_PENDING)
     {
-      Status = KeWaitForSingleObject (EventObject,
-				      Executive,
-				      PreviousMode,
-				      FileObject->Flags & FO_ALERTABLE_IO,
-				      NULL);
-      if (Status != STATUS_WAIT_0)
-	{
-	  /* Wait failed. */
-	  return Status;
-	}
-
-      Status = IoStatusBlock->Status;
+        if (!LocalEvent)
+        {
+            KeWaitForSingleObject(&FileObject->Event,
+                                  Executive,
+                                  PreviousMode,
+                                  FileObject->Flags & FO_ALERTABLE_IO,
+                                  NULL);
+            Status = FileObject->FinalStatus;
+        }
     }
 
-  return Status;
+    /* Return the Status */
+    return Status;
 }
 
 /* EOF */