From 33ab7e95671346410d53d568331f5bd0977fb078 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Sun, 30 Nov 2003 20:01:05 +0000 Subject: [PATCH] -hopefully fix bug where IoSecondStageCompletion was sometimes called at DISPATCH_LEVEL svn path=/trunk/; revision=6831 --- reactos/ntoskrnl/io/irp.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 9e839b09e25..b0e91d12e43 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,4 @@ -/* $Id: irp.c,v 1.54 2003/11/19 20:54:31 gdalsnes Exp $ +/* $Id: irp.c,v 1.55 2003/11/30 20:01:05 gdalsnes Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -229,10 +229,12 @@ IofCompleteRequest(PIRP Irp, NTSTATUS Status; PDEVICE_OBJECT DeviceObject; PFILE_OBJECT OriginalFileObject; + KIRQL oldIrql; DPRINT("IoCompleteRequest(Irp %x, PriorityBoost %d) Event %x THread %x\n", Irp,PriorityBoost, Irp->UserEvent, PsGetCurrentThread()); + assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); assert(Irp->CancelRoutine == NULL); assert(Irp->IoStatus.Status != STATUS_PENDING); @@ -285,10 +287,10 @@ IofCompleteRequest(PIRP Irp, //Windows NT File System Internals, page 154 OriginalFileObject = Irp->Tail.Overlay.OriginalFileObject; - if (Irp->PendingReturned) + if (Irp->PendingReturned || KeGetCurrentIrql() == DISPATCH_LEVEL) { BOOLEAN bStatus; - + DPRINT("Dispatching APC\n"); KeInitializeApc( &Irp->Tail.Apc, &Irp->Tail.Overlay.Thread->Tcb, @@ -314,7 +316,9 @@ IofCompleteRequest(PIRP Irp, else { DPRINT("Calling IoSecondStageCompletion routine directly\n"); + KeRaiseIrql(APC_LEVEL, &oldIrql); IoSecondStageCompletion(NULL,NULL,(PVOID)&OriginalFileObject,(PVOID) &Irp,(PVOID) &PriorityBoost); + KeLowerIrql(oldIrql); DPRINT("Finished completition routine\n"); }