KiAbCpuBoostOwners

VOID __stdcall KiAbCpuBoostOwners(
        _KLOCK_ENTRY *HeadEntry,
        CHAR CpuPriority,
        _SINGLE_LIST_ENTRY *ReadyList,
        _SINGLE_LIST_ENTRY *PropagateBoostsList,
        _SINGLE_LIST_ENTRY *SelfBoostsList){
  _KLOCK_ENTRY *Min; 
  _SINGLE_LIST_ENTRY *v9; 
  _KLOCK_ENTRY *v11; 
  _KLOCK_ENTRY *v12; 
  _KLOCK_ENTRY *v13; 
  UINT64 BoostOutstandingIOsRequired; 
  _AB_PRIORITY Priority; 

  LODWORD(BoostOutstandingIOsRequired) = 0;
  Priority = 0;
  Min = (_KLOCK_ENTRY *)HeadEntry->OwnerTree.Min;
  v9 = SelfBoostsList;
  Priority.CpuPriority = CpuPriority;
  while( Min && Min->CpuPriorityKey < CpuPriority )
  {
    KiAbSetMinimumThreadPriority(Min, &Priority, ReadyList, PropagateBoostsList, v9, &BoostOutstandingIOsRequired);
    v11 = (_KLOCK_ENTRY *)Min->TreeNode.Children[1];
    v12 = Min;
    Min->CpuPriorityKey = CpuPriority;
    if( v11 )
    {
      v13 = (_KLOCK_ENTRY *)v11->TreeNode.Children[0];
      Min = v11;
      if( v11->TreeNode.Children[0] )
      {
        do
        {
          Min = v13;
          v13 = (_KLOCK_ENTRY *)v13->TreeNode.Children[0];
        }
        while( v13 );
      }
    }
    else
    {
      while( 1 )
      {
        Min = (_KLOCK_ENTRY *)(Min->TreeNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
        if( !Min || (_KLOCK_ENTRY *)Min->TreeNode.Children[0] == v12 )
          break;
        v12 = Min;
      }
    }
  }
  if( (HeadEntry->ThreadLocalFlags & 1) == 0 )
    KiAbSetMinimumThreadPriority(HeadEntry, &Priority, ReadyList, PropagateBoostsList, v9, &BoostOutstandingIOsRequired);
}

Referenced by:

KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks