4 Boiler plate for irp cancelation, for irp queues you manage yourself
15 //don't need this since we have our own sync. protecting irp cancellation
16 IoReleaseCancelSpinLock(Irp
->CancelIrql
);
18 theLock
= Irp
->Tail
.Overlay
.DriverContext
[3];
21 RemoveEntryList(&Irp
->Tail
.Overlay
.ListEntry
);
24 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
25 Irp
->IoStatus
.Information
= 0;
27 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
36 Irp
->Tail
.Overlay
.DriverContext
[3] = &theLock
;
38 IoSetCancelRoutine(Irp
, CancelRoutine
);
39 if (Irp
->Cancel
&& IoSetCancelRoutine(Irp
, NULL
))
41 // IRP has already been cancelled (before we got to queue it),
42 // but we got to remove the cancel routine before the canceler could,
43 // so complete irp ourself
47 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
48 Irp
->IoStatus
.Information
= 0;
49 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
57 Irp
->IoStatus
.Status
= STATUS_PENDING
;
58 IoMarkIrpPending(Irp
);
60 InsertTailList(Queue
);
71 Irp
= RemoveHeadList(Queue
);
73 if (!IoSetCancelRoutine(Irp
, NULL
))
76 Cancel routine WILL be called after we release the spinlock. It will try to remove
77 the irp from the list and cancel/complete this irp. Since we allready removed it,
78 make its ListEntry point to itself.
81 InitializeListHead(&Irp
->Tail
.Overlay
.ListEntry
);
86 Cancel routine will NOT be called, canceled or not.
87 The Irp might have been canceled (Irp->Cancel flag set) but we don't care,
88 since we are to complete this Irp now anyways.
93 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
94 Irp
->IoStatus
.Information
= 0;
95 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);