From 0afb1fb12d182aefaeb7bf747abaeab7f24a1bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Sun, 26 Dec 2004 21:18:34 +0000 Subject: [PATCH] Move the I/O completion port setting to second stage and fix the async I/O test. Thanks to Alex Ionescu for explaining this stuff to me. svn path=/trunk/; revision=12348 --- reactos/ntoskrnl/io/cleanup.c | 14 ++++++++++++++ reactos/ntoskrnl/io/irp.c | 15 +-------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index d112fecbb8e..19bb86ab11b 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -300,5 +300,19 @@ IoSecondStageCompletion( } + if (NULL != IoStack->FileObject + && NULL != IoStack->FileObject->CompletionContext + && (0 != (Irp->Flags & IRP_SYNCHRONOUS_API) + || 0 == (IoStack->FileObject->Flags & FO_SYNCHRONOUS_IO))) + { + PFILE_OBJECT FileObject = IoStack->FileObject; + IoSetIoCompletion(FileObject->CompletionContext->Port, + FileObject->CompletionContext->Key, + Irp->Overlay.AsynchronousParameters.UserApcContext, + Irp->IoStatus.Status, + Irp->IoStatus.Information, + FALSE); + } + IoFreeIrp(Irp); } diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 03ce8aec9e2..be2108102b4 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.71 2004/12/26 15:55:14 gvg Exp $ +/* $Id: irp.c,v 1.72 2004/12/26 21:18:34 gvg Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -447,19 +447,6 @@ IofCompleteRequest(PIRP Irp, //Windows NT File System Internals, page 154 OriginalFileObject = Irp->Tail.Overlay.OriginalFileObject; - if (NULL != Stack->FileObject - && NULL != Stack->FileObject->CompletionContext - && Irp->PendingReturned) - { - PFILE_OBJECT FileObject = Stack->FileObject; - IoSetIoCompletion(FileObject->CompletionContext->Port, - FileObject->CompletionContext->Key, - Irp->Overlay.AsynchronousParameters.UserApcContext, - Irp->IoStatus.Status, - Irp->IoStatus.Information, - FALSE); - } - if (Irp->PendingReturned || KeGetCurrentIrql() == DISPATCH_LEVEL) { BOOLEAN bStatus;