KiAbEntryUpdateWaiterTreePosition

VOID __stdcall KiAbEntryUpdateWaiterTreePosition(_KLOCK_ENTRY *Entry, _KLOCK_ENTRY *HeadEntry){
  char v3; 
  _RTL_RB_TREE *p_WaiterTree; 
  BOOL v5; 
  UINT64 Root; 
  UINT64 v7; 

  v3 = BYTE3((&Entry[2].FreeListEntry.Next)[-2 * Entry->EntryOffset]);
  if( v3 > 15 )
    v3 = 15;
  if( Entry->CpuPriorityKey != v3 )
  {
    p_WaiterTree = &HeadEntry->WaiterTree;
    Entry->CpuPriorityKey = v3;
    RtlRbRemoveNode((UINT64 *)&HeadEntry->WaiterTree, (UINT64)Entry);
    v5 = 0;
    Root = (UINT64)p_WaiterTree->Root;
    if( (p_WaiterTree->_bf_0 & 1) != 0 )
    {
      if( Root )
        Root ^= (unsigned __int64)p_WaiterTree;
      else
        Root = 0i64;
    }
    if( Root )
    {
      while( 1 )
      {
        if( *(_BYTE *)(Root + 48) < Entry->CpuPriorityKey )
        {
          v7 = *(_QWORD *)Root;
          if( (p_WaiterTree->_bf_0 & 1) != 0 )
          {
            if( !v7 )
              break;
            v7 ^= Root;
          }
          if( !v7 )
            break;
        }
        else
        {
          v7 = *(_QWORD *)(Root + 8);
          if( (p_WaiterTree->_bf_0 & 1) != 0 )
          {
            if( !v7 )
              goto LABEL_11;
            v7 ^= Root;
          }
          if( !v7 )
          {
LABEL_11:
            v5 = 1;
            break;
          }
        }
        Root = v7;
      }
    }
    RtlRbInsertNodeEx((UINT64 *)p_WaiterTree, Root, v5, (UINT64)Entry);
  }
}

Referenced by:

KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks