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