PDRIVER_OBJECT DriverObject;
PIO_STACK_LOCATION StackPtr;
+ /* Make sure this is a valid IRP */
+ ASSERT(Irp->Type == IO_TYPE_IRP);
+
/* Get the Driver Object */
DriverObject = DeviceObject->DriverObject;
if (LastStackPtr->Control & SL_ERROR_RETURNED)
{
/* Get the error code */
- ErrorCode = (NTSTATUS)LastStackPtr->Parameters.Others.Argument4;
+ ErrorCode = PtrToUlong(LastStackPtr->Parameters.Others.Argument4);
}
- /* Get the Current Stack and skip it */
+ /* Get the Current Stack */
StackPtr = IoGetCurrentIrpStackLocation(Irp);
- IoSkipCurrentIrpStackLocation(Irp);
/* Loop the Stacks and complete the IRPs */
do
{
+ /* Skip current stack location */
+ IoSkipCurrentIrpStackLocation(Irp);
+
/* Set Pending Returned */
Irp->PendingReturned = StackPtr->Control & SL_PENDING_RETURNED;
/* Update the error for the current stack */
ErrorCode = Irp->IoStatus.Status;
StackPtr->Control |= SL_ERROR_RETURNED;
- LastStackPtr->Parameters.Others.Argument4 = (PVOID)ErrorCode;
+ LastStackPtr->Parameters.Others.Argument4 = UlongToPtr(ErrorCode);
LastStackPtr->Control |= SL_ERROR_RETURNED;
}
}
IopClearStackLocation(StackPtr);
}
- /* Move to next stack location and pointer */
- IoSkipCurrentIrpStackLocation(Irp);
+ /* Move pointer to next stack location */
StackPtr++;
- } while (Irp->CurrentLocation <= (Irp->StackCount + 1));
+ } while (Irp->CurrentLocation <= Irp->StackCount);
/* Check if the IRP is an associated IRP */
if (Irp->Flags & IRP_ASSOCIATED_IRP)
IoGetRequestorProcessId(IN PIRP Irp)
{
/* Return the requestor process' id */
- return (ULONG)(IoGetRequestorProcess(Irp)->UniqueProcessId);
+ return PtrToUlong(IoGetRequestorProcess(Irp)->UniqueProcessId);
}
/*
IoSetTopLevelIrp(IN PIRP Irp)
{
/* Set the IRP */
- PsGetCurrentThread()->TopLevelIrp = (ULONG)Irp;
+ PsGetCurrentThread()->TopLevelIrp = (ULONG_PTR)Irp;
}