KeRemoveDeviceQueue
_KDEVICE_QUEUE_ENTRY *__stdcall KeRemoveDeviceQueue(_KDEVICE_QUEUE *DeviceQueue){
UINT8 v1;
_KDEVICE_QUEUE_ENTRY *v3;
_LIST_ENTRY *p_DeviceListHead;
_KDEVICE_QUEUE *Flink;
__int64 v6;
__int64 bf_0;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v3 = 0i64;
KeAcquireInStackQueuedSpinLockForDpc(&DeviceQueue->Lock, &LockHandle, v1);
p_DeviceListHead = &DeviceQueue->DeviceListHead;
Flink = (_KDEVICE_QUEUE *)DeviceQueue->DeviceListHead.Flink;
if( Flink == (_KDEVICE_QUEUE *)&DeviceQueue->DeviceListHead )
{
DeviceQueue->Busy = 0;
}
else
{
v3 = (_KDEVICE_QUEUE_ENTRY *)DeviceQueue->DeviceListHead.Flink;
if( Flink->DeviceListHead.Flink != p_DeviceListHead
|| (v6 = *(_QWORD *)&Flink->Type, *(_KDEVICE_QUEUE_ENTRY **)(v6 + 8) != v3) )
{
__fastfail(3u);
}
p_DeviceListHead->Flink = (_LIST_ENTRY *)v6;
*(_QWORD *)(v6 + 8) = p_DeviceListHead;
v3->Inserted = 0;
bf_0 = DeviceQueue->_bf_0;
if( v3 == (_KDEVICE_QUEUE_ENTRY *)(bf_0 >> 8) )
DeviceQueue->_bf_0 = (unsigned __int8)bf_0;
}
KeReleaseInStackQueuedSpinLockForDpc(&LockHandle);
return v3;
}Referenced by:
IoFreeAdapterChannelV2
IoFreeController
IopStartNextPacket