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 */