Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 1370 of file irp.c.
Referenced by IKsPin_PrepareStreamHeader().
{ PIRP Irp; PLIST_ENTRY CurEntry; KIRQL OldIrql; DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation); /* check parameters */ if (!QueueHead || !SpinLock) return NULL; /* check if parameter ListLocation is valid */ if (ListLocation != KsListEntryTail && ListLocation != KsListEntryHead) return NULL; /* acquire list lock */ KeAcquireSpinLock(SpinLock, &OldIrql); /* point to queue head */ CurEntry = QueueHead; do { /* reset irp to null */ Irp = NULL; /* iterate to next entry */ if (ListLocation == KsListEntryHead) CurEntry = CurEntry->Flink; else CurEntry = CurEntry->Blink; /* is the end of list reached */ if (CurEntry == QueueHead) { /* reached end of list */ break; } /* get irp offset */ Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry); if (Irp->Cancel) { /* irp has been canceled */ break; } if (Irp->CancelRoutine) { /* remove cancel routine */ Irp->CancelRoutine = NULL; if (RemovalOperation == KsAcquireAndRemove || RemovalOperation == KsAcquireAndRemoveOnlySingleItem) { /* remove irp from list */ RemoveEntryList(&Irp->Tail.Overlay.ListEntry); } if (RemovalOperation == KsAcquireAndRemoveOnlySingleItem || RemovalOperation == KsAcquireOnlySingleItem) break; } }while(TRUE); /* release lock */ KeReleaseSpinLock(SpinLock, OldIrql); if (!Irp || Irp->CancelRoutine == NULL) { /* either an irp has been acquired or nothing found */ return Irp; } /* time to remove the canceled irp */ IoAcquireCancelSpinLock(&OldIrql); /* acquire list lock */ KeAcquireSpinLockAtDpcLevel(SpinLock); if (RemovalOperation == KsAcquireAndRemove || RemovalOperation == KsAcquireAndRemoveOnlySingleItem) { /* remove it */ RemoveEntryList(&Irp->Tail.Overlay.ListEntry); } /* release list lock */ KeReleaseSpinLockFromDpcLevel(SpinLock); /* release cancel spinlock */ IoReleaseCancelSpinLock(OldIrql); /* no non canceled irp has been found */ return NULL; }