diff --git a/reactos/ntoskrnl/ke/devqueue.c b/reactos/ntoskrnl/ke/devqueue.c index 94b5f6b51ac..f57f27a4756 100644 --- a/reactos/ntoskrnl/ke/devqueue.c +++ b/reactos/ntoskrnl/ke/devqueue.c @@ -45,6 +45,8 @@ KeInsertDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, BOOLEAN Inserted; ASSERT_DEVICE_QUEUE(DeviceQueue); + DPRINT("KeInsertDeviceQueue() DevQueue %p, Entry %p\n", DeviceQueue, DeviceQueueEntry); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); @@ -86,6 +88,8 @@ KeInsertByKeyDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, BOOLEAN Inserted; ASSERT_DEVICE_QUEUE(DeviceQueue); + DPRINT("KeInsertByKeyDeviceQueue() DevQueue %p, Entry %p, SortKey 0x%x\n", DeviceQueue, DeviceQueueEntry, SortKey); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); @@ -129,6 +133,8 @@ KeRemoveDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue) KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue); + DPRINT("KeRemoveDeviceQueue() DevQueue %p\n", DeviceQueue); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); ASSERT(DeviceQueue->Busy); @@ -172,6 +178,8 @@ KeRemoveByKeyDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue); + DPRINT("KeRemoveByKeyDeviceQueue() DevQueue %p, SortKey 0x%x\n", DeviceQueue, SortKey); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); ASSERT(DeviceQueue->Busy); @@ -185,26 +193,44 @@ KeRemoveByKeyDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, } else { - /* Find entry with SortKey greater than or equal to the passed-in SortKey */ - LIST_FOR_EACH(ReturnEntry, &DeviceQueue->DeviceListHead, KDEVICE_QUEUE_ENTRY, DeviceListEntry) - { - /* Check if keys match */ - if (ReturnEntry->SortKey >= SortKey) - { - /* We found it, so just remove it */ - RemoveEntryList(&ReturnEntry->DeviceListEntry); - break; - } - } + /* If SortKey is greater than the last key, then return the first entry right away */ + ListEntry = &DeviceQueue->DeviceListHead; + ReturnEntry = CONTAINING_RECORD(ListEntry->Blink, + KDEVICE_QUEUE_ENTRY, + DeviceListEntry); - /* Check if we found something */ - if (!ReturnEntry) + if (SortKey >= ReturnEntry->SortKey) { - /* Not found, return the first entry */ - ListEntry = RemoveHeadList(&DeviceQueue->DeviceListHead); - ReturnEntry = CONTAINING_RECORD(ListEntry, + ReturnEntry = CONTAINING_RECORD(ListEntry->Flink, KDEVICE_QUEUE_ENTRY, DeviceListEntry); + + /* Remove it from the list */ + RemoveEntryList(&ReturnEntry->DeviceListEntry); + } + else + { + /* Find entry with SortKey greater than or equal to the passed-in SortKey */ + LIST_FOR_EACH(ReturnEntry, &DeviceQueue->DeviceListHead, KDEVICE_QUEUE_ENTRY, DeviceListEntry) + { + /* Check if keys match */ + if (ReturnEntry->SortKey >= SortKey) + { + /* We found it, so just remove it */ + RemoveEntryList(&ReturnEntry->DeviceListEntry); + break; + } + } + + /* Check if we found something */ + if (!ReturnEntry) + { + /* Not found, return the first entry */ + ListEntry = RemoveHeadList(&DeviceQueue->DeviceListHead); + ReturnEntry = CONTAINING_RECORD(ListEntry, + KDEVICE_QUEUE_ENTRY, + DeviceListEntry); + } } /* Set it as non-inserted */ @@ -231,6 +257,8 @@ KeRemoveByKeyDeviceQueueIfBusy(IN PKDEVICE_QUEUE DeviceQueue, KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue); + DPRINT("KeRemoveByKeyDeviceQueueIfBusy() DevQueue %p, SortKey 0x%x\n", DeviceQueue, SortKey); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); @@ -288,6 +316,8 @@ KeRemoveEntryDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue, KLOCK_QUEUE_HANDLE DeviceLock; ASSERT_DEVICE_QUEUE(DeviceQueue); + DPRINT("KeRemoveEntryDeviceQueue() DevQueue %p, Entry %p\n", DeviceQueue, DeviceQueueEntry); + /* Lock the queue */ KiAcquireDeviceQueueLock(DeviceQueue, &DeviceLock); ASSERT(DeviceQueue->Busy);