Sorry for the nonatomic commit Modified: trunk/reactos/ntoskrnl/io/device.c _____
Modified: trunk/reactos/ntoskrnl/io/device.c --- trunk/reactos/ntoskrnl/io/device.c 2005-05-17 19:04:57 UTC (rev 15382) +++ trunk/reactos/ntoskrnl/io/device.c 2005-05-17 19:06:59 UTC (rev 15383) @@ -1110,129 +1110,4 @@
return STATUS_NOT_IMPLEMENTED; }
-/* - * @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 Status = STATUS_SUCCESS; - PFILE_OBJECT FileObject; - PDEVICE_OBJECT DeviceObject; - PIRP Irp; - PIO_STACK_LOCATION StackPtr; - PKEVENT EventObject = NULL; - BOOLEAN LocalEvent = FALSE; - 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); - - if (IoStatusBlock == NULL) return STATUS_ACCESS_VIOLATION; - - /* 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 for an event */ - if (Event) - { - /* 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); - } - - /* Check if this is a direct open or not */ - if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN) - { - DeviceObject = IoGetAttachedDevice(FileObject->DeviceObject); - } - else - { - DeviceObject = IoGetRelatedDeviceObject(FileObject); - } - - /* 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; - } - - /* Build the IRP */ - Irp = IoBuildDeviceIoControlRequest(IoControlCode, - DeviceObject, - InputBuffer, - InputBufferLength, - OutputBuffer, - OutputBufferLength, - FALSE, - EventObject, - IoStatusBlock); - - /* Set some extra settings */ - Irp->Tail.Overlay.OriginalFileObject = FileObject; - Irp->RequestorMode = PreviousMode; - Irp->Overlay.AsynchronousParameters.UserApcRoutine = UserApcRoutine; - Irp->Overlay.AsynchronousParameters.UserApcContext = UserApcContext; - StackPtr = IoGetNextIrpStackLocation(Irp); - StackPtr->FileObject = FileObject; - - - /* Call the Driver */ - Status = IoCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - if (!LocalEvent) - { - KeWaitForSingleObject(&FileObject->Event, - Executive, - PreviousMode, - FileObject->Flags & FO_ALERTABLE_IO, - NULL); - Status = FileObject->FinalStatus; - } - } - - /* Return the Status */ - return Status; -} - /* EOF */