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