KiAbEntryGetLockedHeadEntry

_KLOCK_ENTRY *__stdcall KiAbEntryGetLockedHeadEntry(
        _KLOCK_ENTRY *Entry,
        UINT64 AddToTree,
        _KLOCK_QUEUE_HANDLE *HeadEntryLockQueue){
  UINT64 v3; 
  bool v4; 
  int v6; 
  _KLOCK_ENTRY *v7; 
  int v8; 
  unsigned __int64 v9; 
  INT64 *v10; 
  UINT64 *v11; 
  UINT64 v12; 
  UINT64 v13; 
  int v14; 
  unsigned __int64 v15; 
  unsigned int v16; 
  UINT64 v17; 
  signed __int32 v18; 
  UINT64 v19; 
  BOOL v20; 
  unsigned __int64 v21; 
  unsigned int v22; 
  UINT64 v23; 
  _KLOCK_ENTRY *v24; 
  char *v25; 
  char v27; 
  UINT64 *v28; 
  UINT64 v29; 
  BOOL v30; 
  int v31; 
  UINT64 v32; 
  INT8 v33; 
  INT8 v34; 
  UINT64 v35; 
  int v36; 
  UINT64 v37; 
  signed __int32 v38; 
  unsigned __int64 v39; 
  unsigned int SessionId; 
  int v41; 
  $E8276A2CF8B819ED32D1B6FEB35D730A v42; 
  _KLOCK_QUEUE_HANDLE v43; 
  UINT64 SpinCount; 

  v3 = 0i64;
  v4 = (Entry->CrossThreadFlags & 1) == 0;
  v41 = 0;
  v6 = AddToTree;
  v7 = Entry;
  memset(&v43, 0, sizeof(v43));
  if( !v4 )
  {
    HeadEntryLockQueue->LockQueue.Next = 0i64;
    HeadEntryLockQueue->LockQueue.Lock = &Entry->EntryLock;
    KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, &Entry->EntryLock);
    if( (v7->CrossThreadFlags & 1) != 0 )
      return v7;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(HeadEntryLockQueue);
  }
  v42 = v7->32;
  if( v42.LockState._bf_0 >= 0 && !v6 )
    return 0i64;
  v8 = 0;
  v39 = v42.LockState._bf_0 & 0x7FFFFFFFFFFFFFFCi64;
  v9 = (((v42.LockState._bf_0 & 0x7FFFFFFFFFFFFFFCui64) >> 4) & 0x3FF) << 6;
  SessionId = v42.LockState.SessionId;
  v10 = (INT64 *)((char *)&WheapErrorSourceTable + v9 + 3128);
  v11 = (UINT64 *)((char *)&WheapErrorSourceTable + v9 + 3112);
  while( 1 )
  {
    if( v8 )
      ExAcquireSpinLockExclusiveAtDpcLevel(v10);
    else
      ExAcquireSpinLockSharedAtDpcLevel((PEX_SPIN_LOCK)v10);
    v12 = v11[1];
    v13 = *v11;
    if( (v12 & 1) != 0 )
    {
      if( v13 )
        v13 ^= (unsigned __int64)v11;
      else
        v13 = 0i64;
    }
    v14 = v12 & 1;
    if( v13 )
    {
      while( 1 )
      {
        v15 = *(_QWORD *)(v13 + 32) & 0x7FFFFFFFFFFFFFFCi64;
        if( v15 < v39 )
          goto LABEL_36;
        if( v15 > v39 )
          goto LABEL_16;
        v16 = *(_DWORD *)(v13 + 40);
        if( v16 == v42.LockState.SessionId )
          goto LABEL_19;
        if( v16 < v42.LockState.SessionId )
        {
LABEL_36:
          v17 = *(_QWORD *)(v13 + 8);
          if( v14 && v17 )
          {
LABEL_40:
            v13 ^= v17;
            goto LABEL_18;
          }
        }
        else
        {
LABEL_16:
          v17 = *(_QWORD *)v13;
          if( v14 && v17 )
            goto LABEL_40;
        }
        v13 = v17;
LABEL_18:
        if( !v13 )
        {
LABEL_19:
          v7 = Entry;
          break;
        }
      }
    }
    if( !v6 )
    {
      if( v13 )
      {
        v24 = (_KLOCK_ENTRY *)v13;
        HeadEntryLockQueue->LockQueue.Lock = (unsigned __int64 *volatile)(v13 + 80);
        HeadEntryLockQueue->LockQueue.Next = 0i64;
        KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, (UINT64 *)(v13 + 80));
        if( v8 )
          ExReleaseSpinLockExclusiveFromDpcLevel(v10);
        else
          ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
        if( v7 == (_KLOCK_ENTRY *)v13 )
          return v24;
        v43.LockQueue.Next = 0i64;
        v43.LockQueue.Lock = &v7->EntryLock;
        KxAcquireQueuedSpinLock(&v43.LockQueue, &v7->EntryLock);
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&v43);
        if( KiAbCompareSnappedEntryState((__m128i *)v7, (__int64)&v39) )
          return v24;
        KeReleaseInStackQueuedSpinLockFromDpcLevel(HeadEntryLockQueue);
      }
      else if( v8 )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel(v10);
      }
      else
      {
        ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
      }
      return 0i64;
    }
    if( v13 )
      break;
    if( v8 )
      goto LABEL_25;
    v8 = 1;
    LODWORD(SpinCount) = 0;
    if( !_interlockedbittestandset((volatile signed __int32 *)v10, 0x1Fu) )
    {
      v18 = *(_DWORD *)v10;
      while( (v18 & 0xBFFFFFFF) != -2147483647 )
      {
        if( (v18 & 0x40000000) == 0 )
        {
          v38 = _InterlockedCompareExchange((volatile signed __int32 *)v10, v18 | 0x40000000, v18);
          v4 = v18 == v38;
          v18 = v38;
          if( !v4 )
            continue;
        }
        KeYieldProcessorEx(&SpinCount);
        v18 = *(_DWORD *)v10;
      }
LABEL_25:
      v19 = *v11;
      if( (v11[1] & 1) != 0 )
      {
        if( v19 )
          v19 ^= (unsigned __int64)v11;
        else
          v19 = 0i64;
      }
      v20 = 0;
      if( v19 )
      {
        while( 1 )
        {
          v21 = *(_QWORD *)(v19 + 32) & 0x7FFFFFFFFFFFFFFCi64;
          if( v21 < v39
            || v21 <= v39
            && ((v22 = *(_DWORD *)(v19 + 40), v22 == v42.LockState.SessionId) || v22 < v42.LockState.SessionId) )
          {
            v23 = *(_QWORD *)(v19 + 8);
            if( (v11[1] & 1) != 0 )
            {
              if( !v23 )
                goto LABEL_45;
              v23 ^= v19;
            }
            if( !v23 )
            {
LABEL_45:
              v20 = 1;
              break;
            }
          }
          else
          {
            v23 = *(_QWORD *)v19;
            if( (v11[1] & 1) != 0 )
            {
              if( !v23 )
                goto LABEL_46;
              v23 ^= v19;
            }
            if( !v23 )
            {
LABEL_46:
              v20 = 0;
              break;
            }
          }
          v19 = v23;
        }
      }
      RtlRbInsertNodeEx(v11, v19, v20, (UINT64)v7);
      v24 = v7;
      HeadEntryLockQueue->LockQueue.Lock = &v7->EntryLock;
      HeadEntryLockQueue->LockQueue.Next = 0i64;
      KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, &v7->EntryLock);
      ExReleaseSpinLockExclusiveFromDpcLevel(v10);
      v7->InTreeByte |= 0x80u;
      v7->CrossThreadFlags |= 1u;
      v7->OwnerTree.Root = 0i64;
      v7->OwnerTree.Min = 0i64;
      v7->WaiterTree.Root = 0i64;
      v7->WaiterTree.Min = 0i64;
      v7->BoostBitmap._bf_2 &= 1u;
LABEL_48:
      v25 = (char *)v7 - 16 * v7->EntryOffset;
      if( (v7->ThreadLocalFlags & 1) != 0 )
        ++v25[793];
      else
        _InterlockedExchangeAdd8(v25 + 871, 1u);
      return v24;
    }
    ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
  }
  v24 = (_KLOCK_ENTRY *)v13;
  HeadEntryLockQueue->LockQueue.Lock = (unsigned __int64 *volatile)(v13 + 80);
  HeadEntryLockQueue->LockQueue.Next = 0i64;
  KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, (UINT64 *)(v13 + 80));
  if( v8 )
    ExReleaseSpinLockExclusiveFromDpcLevel(v10);
  else
    ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
  if( v7->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 >= 0 )
  {
    if( (v7->ThreadLocalFlags & 1) != 0 )
    {
      v27 = BYTE3((&v7[2].FreeListEntry.Next)[-2 * v7->EntryOffset]);
      if( v27 > 15 )
        v27 = 15;
      v28 = (UINT64 *)(v13 + 64);
      v7->CpuPriorityKey = v27;
      v29 = v28[1];
      if( (v29 & 1) != 0 )
      {
        if( *v28 )
          v3 = *v28 ^ (unsigned __int64)v28;
      }
      else
      {
        v3 = *v28;
      }
      v30 = 0;
      v31 = v29 & 1;
      if( v3 )
      {
        while( 1 )
        {
          if( *(char *)(v3 + 48) < v27 )
          {
            v32 = *(_QWORD *)v3;
            if( v31 )
            {
              if( !v32 )
                break;
              v32 ^= v3;
            }
            if( !v32 )
              break;
          }
          else
          {
            v32 = *(_QWORD *)(v3 + 8);
            if( v31 )
            {
              if( !v32 )
                goto LABEL_69;
              v32 ^= v3;
            }
            if( !v32 )
              goto LABEL_69;
          }
          v3 = v32;
        }
      }
    }
    else
    {
      v33 = KiAbOwnerComputeCpuPriorityKey(v7);
      v28 = (UINT64 *)(v13 + 48);
      v7->CpuPriorityKey = v33;
      v34 = v33;
      v35 = v28[1];
      if( (v35 & 1) != 0 )
      {
        if( *v28 )
          v3 = *v28 ^ (unsigned __int64)v28;
      }
      else
      {
        v3 = *v28;
      }
      v30 = 0;
      v36 = v35 & 1;
      if( v3 )
      {
        while( 1 )
        {
          if( *(char *)(v3 + 48) > v34 )
          {
            v37 = *(_QWORD *)v3;
            if( v36 )
            {
              if( !v37 )
                break;
              v37 ^= v3;
            }
            if( !v37 )
              break;
          }
          else
          {
            v37 = *(_QWORD *)(v3 + 8);
            if( v36 )
            {
              if( !v37 )
                goto LABEL_69;
              v37 ^= v3;
            }
            if( !v37 )
            {
LABEL_69:
              v30 = 1;
              break;
            }
          }
          v3 = v37;
        }
      }
    }
    RtlRbInsertNodeEx(v28, v3, v30, (UINT64)v7);
    v7->InTreeByte |= 0x80u;
    goto LABEL_48;
  }
  return v24;
}

Referenced by:

KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks