diff options
-rw-r--r-- | src/Driver/EncryptedIoQueue.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/src/Driver/EncryptedIoQueue.c b/src/Driver/EncryptedIoQueue.c index 85d7ccff..d68c3f09 100644 --- a/src/Driver/EncryptedIoQueue.c +++ b/src/Driver/EncryptedIoQueue.c @@ -271,6 +271,7 @@ static VOID CompleteIrpWorkItemRoutine(PDEVICE_OBJECT DeviceObject, PVOID Contex PCOMPLETE_IRP_WORK_ITEM workItem = (PCOMPLETE_IRP_WORK_ITEM)Context; EncryptedIoQueueItem* item = (EncryptedIoQueueItem * ) workItem->Item; EncryptedIoQueue* queue = item->Queue; + KIRQL oldIrql; UNREFERENCED_PARAMETER(DeviceObject); __try @@ -283,19 +284,14 @@ static VOID CompleteIrpWorkItemRoutine(PDEVICE_OBJECT DeviceObject, PVOID Contex } __finally { - // Return the work item to the free list - KIRQL oldIrql; - KeAcquireSpinLock(&queue->WorkItemLock, &oldIrql); - - // Decrement ActiveWorkItems - LONG activeWorkItems = InterlockedDecrement(&queue->ActiveWorkItems); - // If no active work items remain, signal the event - if (activeWorkItems == 0) + if (InterlockedDecrement(&queue->ActiveWorkItems) == 0) { KeSetEvent(&queue->NoActiveWorkItemsEvent, IO_NO_INCREMENT, FALSE); } + // Return the work item to the free list + KeAcquireSpinLock(&queue->WorkItemLock, &oldIrql); InsertTailList(&queue->FreeWorkItemsList, &workItem->ListEntry); KeReleaseSpinLock(&queue->WorkItemLock, oldIrql); |