Author: cgutman
Date: Sat May 29 18:00:43 2010
New Revision: 47417
URL:
http://svn.reactos.org/svn/reactos?rev=47417&view=rev
Log:
[NTOSKRNL]
- Fix stack skipping logic in IofCompleteRequest
- Fixes displaying MULTIPLE_IRP_COMPLETE_REQUESTS bug check
- Patch by lassy with a typo fix by me
Modified:
trunk/reactos/ntoskrnl/io/iomgr/irp.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/irp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/irp.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/irp.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/irp.c [iso-8859-1] Sat May 29 18:00:43 2010
@@ -1217,15 +1217,22 @@
ErrorCode = PtrToUlong(LastStackPtr->Parameters.Others.Argument4);
}
- /* Get the Current Stack */
- StackPtr = IoGetCurrentIrpStackLocation(Irp);
-
- /* Loop the Stacks and complete the IRPs */
- do
- {
- /* Skip current stack location */
- IoSkipCurrentIrpStackLocation(Irp);
-
+ /*
+ * Start the loop with the current stack and point the IRP to the next stack
+ * and then keep incrementing the stack as we loop through. The IRP should
+ * always point to the next stack location w.r.t the one currently being
+ * analyzed, so completion routine code will see the appropriate value.
+ * Because of this, we must loop until the current stack location is +1 of
+ * the stack count, because when StackPtr is at the end, CurrentLocation is +1.
+ */
+ for (StackPtr = IoGetCurrentIrpStackLocation(Irp),
+ Irp->CurrentLocation++,
+ Irp->Tail.Overlay.CurrentStackLocation++;
+ Irp->CurrentLocation <= (Irp->StackCount + 1);
+ StackPtr++,
+ Irp->CurrentLocation++,
+ Irp->Tail.Overlay.CurrentStackLocation++)
+ {
/* Set Pending Returned */
Irp->PendingReturned = StackPtr->Control & SL_PENDING_RETURNED;
@@ -1287,10 +1294,7 @@
/* Clear the stack location */
IopClearStackLocation(StackPtr);
}
-
- /* Move pointer to next stack location */
- StackPtr++;
- } while (Irp->CurrentLocation <= Irp->StackCount);
+ }
/* Check if the IRP is an associated IRP */
if (Irp->Flags & IRP_ASSOCIATED_IRP)