KiActivateWaiterKQueue
VOID __stdcall KiActivateWaiterKQueue(_KQUEUE *Queue){
char *v2;
_KQUEUE *v3;
__int64 v4;
_KQUEUE **v5;
char v6;
__int64 v7;
if( *((_DWORD *)Queue + 10) < *((_DWORD *)Queue + 11) )
{
v2 = (char *)Queue + 24;
v3 = (_KQUEUE *)*((_QWORD *)Queue + 3);
if( v3 != (_KQUEUE *)((char *)Queue + 24) && *((_KQUEUE **)Queue + 1) != (_KQUEUE *)((char *)Queue + 8) )
{
v4 = *(_QWORD *)v3;
v5 = (_KQUEUE **)*((_QWORD *)v3 + 1);
if( *(_KQUEUE **)(*(_QWORD *)v3 + 8i64) == v3 && *v5 == v3 )
{
*v5 = (_KQUEUE *)v4;
*(_QWORD *)(v4 + 8) = v5;
*(_QWORD *)v3 = 0i64;
KiWakeQueueWaiter(KeGetCurrentPrcb(), Queue, (INT64)v3);
if( v6 )
{
--*((_DWORD *)Queue + 1);
goto LABEL_3;
}
v7 = *(_QWORD *)v2;
if( *(char **)(*(_QWORD *)v2 + 8i64) == v2 )
{
*(_QWORD *)v3 = v7;
*((_QWORD *)v3 + 1) = v2;
*(_QWORD *)(v7 + 8) = v3;
*(_QWORD *)v2 = v3;
goto LABEL_3;
}
}
__fastfail(3u);
}
}
LABEL_3:
_InterlockedAnd((volatile signed __int32 *)Queue, 0xFFFFFF7F);
}Referenced by:
KiActivateWaiterQueueWithNoLocks