2003-05-16 Casper S. Hornstrup <[email protected]>

* 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
This commit is contained in:
Casper Hornstrup
2003-05-16 12:03:11 +00:00
parent f728ec4f27
commit 270cb3a0ec
4 changed files with 68 additions and 13 deletions
+9
View File
@@ -1,3 +1,12 @@
2003-05-16 Casper S. Hornstrup <[email protected]>
* 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 <[email protected]>
* ntoskrnl/Makefile (OBJECTS_IO): Add io/rawfs.o.
-8
View File
@@ -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);
+7 -2
View File
@@ -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);
}
+52 -3
View File
@@ -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;