KeRemoveByKeyDeviceQueue
NTSTATUS __fastcall KeRemoveByKeyDeviceQueue(INT64 a1, UINT64 a2){
UINT8 v2;
unsigned int v3;
__int64 v5;
__int64 i;
bool v7;
__int64 v8;
__int64 v9;
_QWORD *v10;
_KLOCK_QUEUE_HANDLE LockHandle;
v3 = a2;
memset(&LockHandle, 0, sizeof(LockHandle));
LODWORD(v5) = 0;
KeAcquireInStackQueuedSpinLockForDpc((UINT64 *)(a1 + 24), &LockHandle, v2);
if( *(_QWORD *)(a1 + 8) == a1 + 8 )
{
*(_BYTE *)(a1 + 32) = 0;
}
else
{
if( *(_DWORD *)(*(_QWORD *)(a1 + 16) + 16i64) >= v3 )
{
i = *(__int64 *)(a1 + 32) >> 8;
if( i )
{
v7 = v3 <= *(_DWORD *)((*(__int64 *)(a1 + 32) >> 8) + 0x10);
if( v3 > *(_DWORD *)((*(__int64 *)(a1 + 32) >> 8) + 0x10) )
goto LABEL_10;
}
for( i = *(_QWORD *)(a1 + 8); ; i = *(_QWORD *)i )
{
v7 = v3 <= *(_DWORD *)(i + 16);
LABEL_10:
v5 = i;
if( v7 )
break;
}
}
else
{
v5 = *(_QWORD *)(a1 + 8);
}
v8 = 0i64;
if( *(_QWORD *)(v5 + 8) != a1 + 8 )
v8 = *(_QWORD *)(v5 + 8);
*(_QWORD *)(a1 + 32) = (unsigned __int8)*(_DWORD *)(a1 + 32) | (unsigned __int64)(v8 << 8);
v9 = *(_QWORD *)v5;
if( *(_QWORD *)(*(_QWORD *)v5 + 8i64) != v5 || (v10 = *(_QWORD **)(v5 + 8), *v10 != v5) )
__fastfail(3u);
*v10 = v9;
*(_QWORD *)(v9 + 8) = v10;
*(_BYTE *)(v5 + 20) = 0;
}
KeReleaseInStackQueuedSpinLockForDpc(&LockHandle);
return v5;
}Referenced by:
IopStartNextPacketByKey