KiAbFindWakeupLockEntry

_KLOCK_ENTRY *__stdcall KiAbFindWakeupLockEntry(VOID *Lock, _ETHREAD *WaiterThread){
  _KLOCK_ENTRY *v2; 
  unsigned __int64 v4; 
  NTSTATUS SessionId; 
  int v6; 
  __int64 v8; 
  _KLOCK_ENTRY *v9; 
  int v10; 
  __int128 v11; 
  unsigned __int8 v12; 
  __int64 v13; 
  __int128 v15; 
  unsigned __int8 v16; 

  v2 = 0i64;
  if( (WaiterThread->Tcb.AbEntrySummary | WaiterThread->Tcb.AbOrphanedEntrySummary) == 63 )
    return 0i64;
  v4 = (unsigned __int64)Lock & 0x7FFFFFFFFFFFFFFCi64;
  if( MmIsSessionAddress(Lock) )
    SessionId = MmGetSessionIdEx(KeGetCurrentThread()->ApcState.Process);
  else
    SessionId = -1;
  v6 = ((char)WaiterThread->Tcb.AbEntrySummary | (char)WaiterThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
  while( _BitScanReverse((unsigned int *)&v8, v6) )
  {
    v9 = &WaiterThread->Tcb.LockEntries[v8];
    v6 &= ~(1 << v8);
    if( (v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == v4 )
    {
      *(_QWORD *)&v11 = v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0;
      *((_QWORD *)&v11 + 1) = _mm_srli_si128((__m128i)v9->32, 8).m128i_u64[0];
      v12 = _InterlockedCompareExchange128(
              &v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0,
              *((signed __int64 *)&v11 + 1),
              v11,
              (signed __int64 *)&v11);
      v10 = DWORD2(v11);
      v13 = v11;
      if( v12
        || (*(_QWORD *)&v15 = v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0,
            *((_QWORD *)&v15 + 1) = _mm_srli_si128((__m128i)v9->32, 8).m128i_u64[0],
            v16 = _InterlockedCompareExchange128(
                    &v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0,
                    *((signed __int64 *)&v15 + 1),
                    v15,
                    (signed __int64 *)&v15),
            v10 = DWORD2(v15),
            v13 = v15,
            v16) )
      {
        if( (v9->ThreadLocalFlags & 1) != 0 && (v13 & 0x7FFFFFFFFFFFFFFCi64) == v4 && v10 == SessionId )
          return v9;
      }
    }
  }
  return v2;
}

Referenced by:

KeAbPreWakeupThread