- current_entry = RemoveHeadList(&DpcQueueHead);
- if (current_entry != &DpcQueueHead)
- {
- DpcQueueSize--;
- }
- KeReleaseSpinLockFromDpcLevel(&DpcQueueLock);
- current = CONTAINING_RECORD(current_entry,KDPC,DpcListEntry);
- current->Lock=FALSE;
- KeLowerIrql(oldlvl);
- while (current_entry!=(&DpcQueueHead))
- {
- current->DeferredRoutine(current,current->DeferredContext,
- current->SystemArgument1,
- current->SystemArgument2);
-
- KeRaiseIrql(HIGH_LEVEL, &oldlvl);
- KeAcquireSpinLockAtDpcLevel(&DpcQueueLock);
- current_entry = RemoveHeadList(&DpcQueueHead);
- if (current_entry != &DpcQueueHead)
- {
- DpcQueueSize--;
- }
- KeReleaseSpinLockFromDpcLevel(&DpcQueueLock);
- current = CONTAINING_RECORD(current_entry,KDPC,DpcListEntry);
- current->Lock=FALSE;
- KeLowerIrql(oldlvl);
- }
+
+ while (!IsListEmpty(&DpcQueueHead))
+ {
+ current_entry = RemoveHeadList(&DpcQueueHead);
+ DpcQueueSize--;
+ current = CONTAINING_RECORD(current_entry,KDPC,DpcListEntry);
+ current->Lock=FALSE;
+ KeReleaseSpinLock(&DpcQueueLock, oldlvl);
+ current->DeferredRoutine(current,current->DeferredContext,
+ current->SystemArgument1,
+ current->SystemArgument2);
+
+ KeRaiseIrql(HIGH_LEVEL, &oldlvl);
+ KeAcquireSpinLockAtDpcLevel(&DpcQueueLock);
+ }
+ KeReleaseSpinLock(&DpcQueueLock, oldlvl);