KiSatisfyThreadWait
__int64 __fastcall KiSatisfyThreadWait(__int64 a1, __int64 a2, char a3, __int64 *a4, int a5){
__int64 v9;
void *v10;
__int64 v11;
__int64 *v12;
void *v13;
__int64 v14;
__int64 **v15;
*(_BYTE *)(a2 + 388) = 2;
KiReleaseThreadLockSafe(a2);
v9 = *(_QWORD *)(a2 + 200);
v10 = *(void **)(a2 + 976);
if( v10 )
{
*(_QWORD *)(a2 + 976) = 0i64;
LODWORD(v11) = KeAbPreAcquire(v10, 0i64, 1ui64);
if( v11 )
*(_BYTE *)(v11 + 26) |= 1u;
}
if( a5 )
{
v12 = &a4[6 * (unsigned __int8)a5];
do
{
if( *((_BYTE *)a4 + 17) < 5u )
{
v13 = (void *)a4[4];
KiAcquireKobjectLockSafe(v13);
if( *((_BYTE *)a4 + 17) == 4 )
{
v14 = *a4;
if( *(__int64 **)(*a4 + 8) != a4 || (v15 = (__int64 **)a4[1], *v15 != a4) )
__fastfail(3u);
*v15 = (__int64 *)v14;
*(_QWORD *)(v14 + 8) = v15;
}
_InterlockedAnd((volatile signed __int32 *)v13, 0xFFFFFF7F);
}
a4 += 6;
}
while( a4 != v12 );
}
KiExitThreadWait((_KPRCB *)a1, (_ETHREAD *)a2, a3);
return v9;
}Referenced by:
KeWaitForMultipleObjects