KiEpfComplete
VOID __stdcall KiEpfComplete(_LIST_ENTRY *a1){
__int64 v2;
_QWORD *v3;
_QWORD *v4;
_QWORD *v5;
_QWORD *v6;
__int64 v7;
v2 = KiEpfHashTable + 32i64 * (((unsigned int)a1 + (unsigned int)((unsigned __int64)a1 >> 12)) % 0x25);
KxAcquireSpinLock((UINT64 *)(v2 + 16));
v3 = *(_QWORD **)v2;
v4 = *(_QWORD **)v2;
if( *(_QWORD *)v2 == v2 )
{
LABEL_5:
++*(_DWORD *)(v2 + 24);
v4 = 0i64;
goto LABEL_12;
}
do
{
v5 = (_QWORD *)*v4;
if( (_LIST_ENTRY *)v4[2] == a1 )
{
if( (_QWORD *)v5[1] == v4 )
{
v6 = (_QWORD *)v4[1];
if( (_QWORD *)*v6 == v4 )
{
*v6 = v5;
v5[1] = v6;
goto LABEL_12;
}
}
LABEL_15:
__fastfail(3u);
}
v4 = (_QWORD *)*v4;
}
while( v5 != (_QWORD *)v2 );
if( v3 == (_QWORD *)v2 )
goto LABEL_5;
v4 = *(_QWORD **)v2;
if( v3[1] != v2 )
goto LABEL_15;
v7 = *v3;
if( *(_QWORD **)(*v3 + 8i64) != v3 )
goto LABEL_15;
*(_QWORD *)v2 = v7;
*(_QWORD *)(v7 + 8) = v2;
LABEL_12:
KxReleaseSpinLock((UINT64 *)(v2 + 16));
if( v4 )
{
_InterlockedIncrement(&dword_140C2AE44);
KeSignalGate((_KGATE *)(v4 + 3), 0i64);
}
}Referenced by:
KiEpfDrainCompletionQueue