KiAbIoBoostOwners

VOID __stdcall KiAbIoBoostOwners(
        _KLOCK_ENTRY *HeadEntry,
        _BYTE *BoostFlags,
        _SINGLE_LIST_ENTRY *ReadyList,
        _SINGLE_LIST_ENTRY *PropagateBoostsList,
        _SINGLE_LIST_ENTRY *SelfBoostsList){
  char v6; 
  _SINGLE_LIST_ENTRY *v7; 
  _KLOCK_ENTRY *Min; 
  char IoQoSPriority; 
  _KLOCK_ENTRY **v12; 
  _KLOCK_ENTRY *v13; 
  _KLOCK_ENTRY *v14; 
  UINT64 BoostOutstandingIOsRequired; 
  _AB_PRIORITY Priority; 

  Priority = 0;
  LODWORD(BoostOutstandingIOsRequired) = 0;
  v6 = 0;
  v7 = SelfBoostsList;
  Min = (_KLOCK_ENTRY *)HeadEntry->OwnerTree.Min;
  if( ((unsigned __int8)BoostFlags & 1) != 0 )
    v6 = 2;
  Priority.IoPriority = v6;
  IoQoSPriority = Priority.IoQoSPriority;
  if( ((unsigned __int8)BoostFlags & 2) != 0 )
    IoQoSPriority = 1;
  Priority.IoQoSPriority = IoQoSPriority;
  while( Min )
  {
    KiAbSetMinimumThreadPriority(Min, &Priority, ReadyList, PropagateBoostsList, v7, &BoostOutstandingIOsRequired);
    v12 = (_KLOCK_ENTRY **)Min->TreeNode.Children[1];
    v13 = Min;
    if( v12 )
    {
      v14 = *v12;
      for( Min = (_KLOCK_ENTRY *)Min->TreeNode.Children[1]; v14; v14 = (_KLOCK_ENTRY *)v14->TreeNode.Children[0] )
        Min = v14;
    }
    else
    {
      while( 1 )
      {
        Min = (_KLOCK_ENTRY *)(Min->TreeNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
        if( !Min || (_KLOCK_ENTRY *)Min->TreeNode.Children[0] == v13 )
          break;
        v13 = Min;
      }
    }
  }
  if( (HeadEntry->ThreadLocalFlags & 1) == 0 )
    KiAbSetMinimumThreadPriority(HeadEntry, &Priority, ReadyList, PropagateBoostsList, v7, &BoostOutstandingIOsRequired);
}

Referenced by:

KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks