From 270cb3a0ecb49be83e76b227d0367a1f0eed59b2 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup Date: Fri, 16 May 2003 12:03:11 +0000 Subject: [PATCH] 2003-05-16 Casper S. Hornstrup * ntoskrnl/io/cleanup.c (IopCompleteRequest1, IoSecondStageCompletion): Don't dereference Irp->UserEvent here. * ntoskrnl/io/irp.c (IofCallDriver): Reference FileObject. * ntoskrnl/io/rw.c (IopReadWriteIoComplete): New function. * (NtReadFile, NtWriteFile): Set I/O completion routine if using an event that is under object manager control. svn path=/trunk/; revision=4688 --- reactos/ChangeLog | 9 ++++++ reactos/ntoskrnl/io/cleanup.c | 8 ----- reactos/ntoskrnl/io/irp.c | 9 ++++-- reactos/ntoskrnl/io/rw.c | 55 +++++++++++++++++++++++++++++++++-- 4 files changed, 68 insertions(+), 13 deletions(-) diff --git a/reactos/ChangeLog b/reactos/ChangeLog index ed34e93253c..c75abbe141e 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,12 @@ +2003-05-16 Casper S. Hornstrup + + * ntoskrnl/io/cleanup.c (IopCompleteRequest1, IoSecondStageCompletion): + Don't dereference Irp->UserEvent here. + * ntoskrnl/io/irp.c (IofCallDriver): Reference FileObject. + * ntoskrnl/io/rw.c (IopReadWriteIoComplete): New function. + * (NtReadFile, NtWriteFile): Set I/O completion routine if using an + event that is under object manager control. + 2003-05-13 Casper S. Hornstrup * ntoskrnl/Makefile (OBJECTS_IO): Add io/rawfs.o. diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index 5fc68f60b49..6aabc894055 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -56,10 +56,6 @@ IopCompleteRequest1(struct _KAPC* Apc, if (!(Irp->Flags & IRP_PAGING_IO) && FileObject) { - // if the event is not the one in the file object, it needs dereferenced - if (Irp->UserEvent && Irp->UserEvent != &FileObject->Event) - ObDereferenceObject(Irp->UserEvent); - if (IoStack->MajorFunction != IRP_MJ_CLOSE) { ObDereferenceObject(FileObject); @@ -263,10 +259,6 @@ VOID IoSecondStageCompletion(PIRP Irp, CCHAR PriorityBoost) if (!(Irp->Flags & IRP_PAGING_IO) && FileObject) { - // if the event is not the one in the file object, it needs dereferenced - if (Irp->UserEvent && Irp->UserEvent != &FileObject->Event) - ObDereferenceObject(Irp->UserEvent); - if (IoStack->MajorFunction != IRP_MJ_CLOSE) { ObDereferenceObject(FileObject); diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 9b1347c88ec..d5a3ff3e18a 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.47 2003/01/25 16:16:54 hbirr Exp $ +/* $Id: irp.c,v 1.48 2003/05/16 12:03:11 chorns Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -128,7 +128,12 @@ IofCallDriver(PDEVICE_OBJECT DeviceObject, DPRINT("MajorFunction %d\n", Param->MajorFunction); DPRINT("DriverObject->MajorFunction[Param->MajorFunction] %x\n", DriverObject->MajorFunction[Param->MajorFunction]); - + + if ((Param->FileObject) && (Param->MajorFunction != IRP_MJ_CLOSE)) + { + ObReferenceObject(Param->FileObject); + } + return DriverObject->MajorFunction[Param->MajorFunction](DeviceObject, Irp); } diff --git a/reactos/ntoskrnl/io/rw.c b/reactos/ntoskrnl/io/rw.c index d75dc074c61..2e1e75609a2 100644 --- a/reactos/ntoskrnl/io/rw.c +++ b/reactos/ntoskrnl/io/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.41 2003/01/11 15:32:40 hbirr Exp $ +/* $Id: rw.c,v 1.42 2003/05/16 12:03:11 chorns Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -21,6 +21,23 @@ /* FUNCTIONS ***************************************************************/ +NTSTATUS STDCALL +IopReadWriteIoComplete(PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context) +{ + PIO_STACK_LOCATION IrpStack; + + DPRINT("IopReadWriteIoComplete(DeviceObject %p Irp %p Context %p) called\n", + DeviceObject, Irp, Context); + + IrpStack = IoGetCurrentIrpStackLocation(Irp); + + ObDereferenceObject(Irp->UserEvent); + + return STATUS_SUCCESS; +} + /********************************************************************** * NAME EXPORTED * NtReadFile @@ -51,6 +68,7 @@ NTSTATUS STDCALL NtReadFile(HANDLE FileHandle, PKEVENT Event = NULL; IO_STATUS_BLOCK Iosb; PIO_STATUS_BLOCK IoStatusBlock; + BOOLEAN SetIoCompletionRoutine; DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, " "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset, @@ -85,11 +103,13 @@ NTSTATUS STDCALL NtReadFile(HANDLE FileHandle, ObDereferenceObject(FileObject); return(Status); } + SetIoCompletionRoutine = TRUE; } else { Event = &FileObject->Event; KeResetEvent(Event); + SetIoCompletionRoutine = FALSE; } if (FileObject->Flags & FO_SYNCHRONOUS_IO) @@ -123,6 +143,17 @@ NTSTATUS STDCALL NtReadFile(HANDLE FileHandle, StackPtr->Parameters.Read.Key = 0; } + if (SetIoCompletionRoutine) + { + /* Set completion routine */ + IoSetCompletionRoutine(Irp, + IopReadWriteIoComplete, + NULL, + TRUE, + TRUE, + TRUE); + } + Status = IoCallDriver(FileObject->DeviceObject, Irp); if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO) { @@ -147,9 +178,11 @@ NTSTATUS STDCALL NtReadFile(HANDLE FileHandle, /* Wait failed. */ return(Status); } + Status = Iosb.Status; return(Status); } + if (FileObject->Flags & FO_SYNCHRONOUS_IO) { *UserIoStatusBlock = Iosb; @@ -188,7 +221,8 @@ NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle, PKEVENT Event = NULL; IO_STATUS_BLOCK Iosb; PIO_STATUS_BLOCK IoStatusBlock; - + BOOLEAN SetIoCompletionRoutine; + DPRINT("NtWriteFile(FileHandle %x Buffer %x Length %x ByteOffset %x, " "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset, IoStatusBlock); @@ -222,11 +256,13 @@ NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle, ObDereferenceObject(FileObject); return(Status); } + SetIoCompletionRoutine = TRUE; } else { Event = &FileObject->Event; KeResetEvent(Event); + SetIoCompletionRoutine = FALSE; } if (FileObject->Flags & FO_SYNCHRONOUS_IO) @@ -259,7 +295,18 @@ NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle, { StackPtr->Parameters.Write.Key = 0; } - + + if (SetIoCompletionRoutine) + { + /* Set completion routine */ + IoSetCompletionRoutine(Irp, + IopReadWriteIoComplete, + NULL, + TRUE, + TRUE, + TRUE); + } + Status = IoCallDriver(FileObject->DeviceObject, Irp); if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO) { @@ -284,9 +331,11 @@ NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle, /* Wait failed. */ return(Status); } + Status = Iosb.Status; return(Status); } + if (FileObject->Flags & FO_SYNCHRONOUS_IO) { *UserIoStatusBlock = Iosb;