mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-30 12:23:28 +00:00
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:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user