KiAbProcessThreadLocks

VOID __stdcall KiAbProcessThreadLocks(
        _ETHREAD *Thread,
        UINT64 AddToTree,
        UINT64 BoostOthers,
        UINT64 BoostSelf,
        _SINGLE_LIST_ENTRY *ReadyList,
        _SINGLE_LIST_ENTRY *PropagateBoostsList,
        _SINGLE_LIST_ENTRY *SelfBoostsList){
  int v7; 
  int v8; 
  unsigned int v9; 
  _KLOCK_ENTRY *LockEntries; 
  int v11; 
  int v12; 
  _KLOCK_ENTRY *v13; 
  __int64 bf_0; 
  bool v15; 
  int v16; 
  _KLOCK_ENTRY *LockedHeadEntry; 
  _KLOCK_ENTRY *v18; 
  _RTL_BALANCED_NODE *Min; 
  char v20; 
  unsigned int v21; 
  CHAR CpuPriorityKey; 
  unsigned int v23; 
  INT8 v24; 
  char v25; 
  int v26; 
  _ETHREAD *v27; 
  char v28; 
  void(__fastcall **ExtensionTable)(_ETHREAD *); 
  UINT64 BoostOutstandingIOsRequired; 
  _KLOCK_ENTRY *v31; 
  _KLOCK_QUEUE_HANDLE HeadEntryLockQueue; 
  _AB_PRIORITY MaxPriority; 
  int v34; 
  int v35; 

  v35 = BoostSelf;
  v34 = BoostOthers;
  v7 = BoostSelf;
  v8 = BoostOthers;
  v9 = AddToTree;
  if( (Thread->Tcb.AbEntrySummary | Thread->Tcb.AbOrphanedEntrySummary) != 63 )
  {
    LockEntries = Thread->Tcb.LockEntries;
    v11 = (char)Thread->Tcb.AbEntrySummary | (char)Thread->Tcb.AbOrphanedEntrySummary;
    v31 = LockEntries;
    v12 = v11 ^ 0x3F;
    v15 = !_BitScanForward((unsigned int *)&Thread, v12);
    if( !v15 )
    {
      while( 1 )
      {
        v12 &= v12 - 1;
        v13 = &LockEntries[(_QWORD)Thread];
        bf_0 = v13->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0;
        if( !bf_0 || (bf_0 & 2) != 0 )
          break;
        if( v9 && (bf_0 & 1) != 0 )
          goto LABEL_24;
        if( bf_0 >= 0 )
        {
          v23 = v9;
LABEL_28:
          if( !v23 )
            goto LABEL_24;
          goto LABEL_11;
        }
        if( v9 )
        {
          if( (v13->CrossThreadFlags & 1) != 0 )
            goto LABEL_24;
          if( (v13->ThreadLocalFlags & 1) == 0 )
          {
            if( KiAbOwnerComputeCpuPriorityKey(&LockEntries[(_QWORD)Thread]) == v13->CpuPriorityKey )
              goto LABEL_23;
LABEL_11:
            MaxPriority = 0;
            v16 = 0;
            LODWORD(BoostOutstandingIOsRequired) = 0;
            memset(&HeadEntryLockQueue, 0, sizeof(HeadEntryLockQueue));
            LockedHeadEntry = KiAbEntryGetLockedHeadEntry(v13, v9, &HeadEntryLockQueue);
            v18 = LockedHeadEntry;
            if( LockedHeadEntry )
            {
              if( (v13->ThreadLocalFlags & 1) != 0 )
              {
                if( v8 )
                {
                  if( v13 != LockedHeadEntry )
                    KiAbEntryUpdateWaiterTreePosition(v13, LockedHeadEntry);
                  Min = v18->OwnerTree.Min;
                  if( Min )
                    v20 = (char)Min[2].Children[0];
                  else
                    v20 = 15;
                  if( (v18->ThreadLocalFlags & 1) == 0 )
                  {
                    v24 = KiAbOwnerComputeCpuPriorityKey(v18);
                    v25 = v20;
                    if( v24 < v20 )
                      v25 = v24;
                    v20 = v25;
                  }
                  KiAbTryIncrementIoWaiterCounts(v13, v18);
                  CpuPriorityKey = KiAbEntryGetCpuPriorityKey(v13);
                  if( v20 < CpuPriorityKey )
                  {
                    if( v21 )
                      goto LABEL_49;
                  }
                  else
                  {
                    if( !v21 )
                    {
                      v7 = v35;
                      v8 = v34;
                      goto LABEL_22;
                    }
LABEL_49:
                    KiAbIoBoostOwners(v18, (_BYTE *)v21, ReadyList, PropagateBoostsList, SelfBoostsList);
                  }
                  KiAbCpuBoostOwners(v18, CpuPriorityKey, ReadyList, PropagateBoostsList, SelfBoostsList);
                  v7 = v35;
                  v8 = v34;
                }
LABEL_41:
                KeReleaseInStackQueuedSpinLockFromDpcLevel(&HeadEntryLockQueue);
                if( v16 )
                {
                  v27 = (_ETHREAD *)((char *)v13 - 16 * v13->EntryOffset);
                  if( ObReferenceObjectSafeWithTag((INT64)v27, 1953261124i64) )
                  {
                    if( (v16 & 1) != 0 )
                      IoBoostThreadIoPriority(v27, IoPriorityNormal, 0x80000000ui64);
                    if( (v16 & 2) != 0 && v27->IoQoSThrottleCount )
                    {
                      ExtensionTable = (void(__fastcall **)(_ETHREAD *))ExGetExtensionTable(*(&stru_140C452E0 + 122));
                      if( ExtensionTable )
                      {
                        ExtensionTable[2](v27);
                        ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(*(&stru_140C452E0 + 122) + 64i64));
                      }
                    }
                    ObDereferenceObjectDeferDeleteWithTag((UINT64)v27, 1953261124i64);
                  }
                }
                goto LABEL_23;
              }
              if( !v7 )
                goto LABEL_41;
              if( v13 != LockedHeadEntry )
                KiAbEntryUpdateOwnerTreePosition(v13, LockedHeadEntry);
              KiAbDetermineMaxWaiterPriority(v18, &MaxPriority);
              if( MaxPriority )
              {
                KiAbSetMinimumThreadPriority(
                  v13,
                  &MaxPriority,
                  ReadyList,
                  PropagateBoostsList,
                  SelfBoostsList,
                  &BoostOutstandingIOsRequired);
                if( v26 && v13 != v18 )
                  KiAbEntryUpdateOwnerTreePosition(v13, v18);
                v16 = BoostOutstandingIOsRequired;
                goto LABEL_41;
              }
LABEL_22:
              KeReleaseInStackQueuedSpinLockFromDpcLevel(&HeadEntryLockQueue);
            }
LABEL_23:
            LockEntries = v31;
            goto LABEL_24;
          }
          v28 = BYTE3((&v13[2].FreeListEntry.Next)[-2 * v13->EntryOffset]);
          if( v28 > 15 )
            v28 = 15;
          v15 = v28 == v13->CpuPriorityKey;
        }
        else if( (v13->ThreadLocalFlags & 1) != 0 )
        {
          v15 = v8 == 0;
        }
        else
        {
          v15 = v7 == 0;
        }
        if( !v15 )
          goto LABEL_11;
LABEL_24:
        v15 = !_BitScanForward((unsigned int *)&Thread, v12);
        if( v15 )
          return;
      }
      v23 = 0;
      goto LABEL_28;
    }
  }
}

Referenced by:

KiAbDeferredProcessingWorker
KiAbProcessContextSwitch
KiAbPropagateBoosts