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 */
Show replies by date