Whether probably to use “Queued Spin Lock” with “Cancel-Safe IRP Queue” ?
e.g.
typedef struct _MY_DEV_EXT {
// …
IO_CSQ MyCsq;
KSPIN_LOCK MySpinLock;
// …
} MY_DEV_EXT, *PMY_DEV_EXT;
void MyCsqAcquireLock(PIO_CSQ pCsq, PKIRQL pIrql)
{
PLOCK_QUEUE_HANDLE SpinHandle;
PMY_DEV_EXT DevExt;
SpinHandle = CONTAINING_RECORD(pIrql, KLOCK_QUEUE_HANDLE, OldIrql);
DevExt = CONTAINING_RECORD(pCsq, MY_DEV_EXT, MyCsq);
KeAcquireInStackQueuedSpinLock(&DevExt->MyLock, SpinHandle);
}
IoCsqInitialize(
&MyCsq,
MyCsqInsertIrp,
MyCsqRemoveIrp,
MyCsqPeekNextIrp,
MyCsqAcquireLock, // <–
MyCsqReleaseLock,
MyCsqCompleteCanceledIrp
);
// …
You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com