KeRemoveByKeyDeviceQueue
_KDEVICE_QUEUE_ENTRY *__stdcall KeRemoveByKeyDeviceQueue(_KDEVICE_QUEUE *DeviceQueue, UINT64 SortKey){
unsigned int v2;
_KDEVICE_QUEUE_ENTRY *Flink;
_KDEVICE_QUEUE_ENTRY *i;
bool v6;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v8;
_LIST_ENTRY *v9;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v2 = SortKey;
memset(&LockHandle, 0, sizeof(LockHandle));
Flink = 0i64;
KeAcquireInStackQueuedSpinLockForDpc(&DeviceQueue->Lock, &LockHandle);
if( DeviceQueue->DeviceListHead.Flink == &DeviceQueue->DeviceListHead )
{
DeviceQueue->Busy = 0;
}
else
{
if( LODWORD(DeviceQueue->DeviceListHead.Blink[1].Flink) >= v2 )
{
i = (_KDEVICE_QUEUE_ENTRY *)(*(_QWORD *)&DeviceQueue->32 >> 8);
if( i )
{
v6 = v2 <= *(_DWORD *)((*(_QWORD *)&DeviceQueue->32 >> 8) + 0x10);
if( v2 > *(_DWORD *)((*(_QWORD *)&DeviceQueue->32 >> 8) + 0x10) )
goto LABEL_10;
}
for( i = (_KDEVICE_QUEUE_ENTRY *)DeviceQueue->DeviceListHead.Flink;
;
i = (_KDEVICE_QUEUE_ENTRY *)i->DeviceListEntry.Flink )
{
v6 = v2 <= i->SortKey;
LABEL_10:
Flink = i;
if( v6 )
break;
}
}
else
{
Flink = (_KDEVICE_QUEUE_ENTRY *)DeviceQueue->DeviceListHead.Flink;
}
Blink = 0i64;
if( Flink->DeviceListEntry.Blink != &DeviceQueue->DeviceListHead )
Blink = Flink->DeviceListEntry.Blink;
DeviceQueue->1 = ($18E3EACC1E717291AA7C720ECCD5C45C)((unsigned __int8)*(_DWORD *)&DeviceQueue->Busy | ((_QWORD)Blink << 8));
v8 = Flink->DeviceListEntry.Flink;
if( (_KDEVICE_QUEUE_ENTRY *)Flink->DeviceListEntry.Flink->Blink != Flink
|| (v9 = Flink->DeviceListEntry.Blink, (_KDEVICE_QUEUE_ENTRY *)v9->Flink != Flink) )
{
__fastfail(3u);
}
v9->Flink = v8;
v8->Blink = v9;
Flink->Inserted = 0;
}
KeReleaseInStackQueuedSpinLockForDpc(&LockHandle);
return Flink;
}Referenced by:
IopStartNextPacketByKey