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; 
  int v9; 
  __int64 v10; 
  int v11; 
  int v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  bool v15; 
  int v16; 
  _KLOCK_ENTRY *LockedHeadEntry; 
  _KLOCK_ENTRY *v18; 
  _RTL_BALANCED_NODE *Min; 
  char v20; 
  unsigned int v21; 
  CHAR CpuPriorityKey; 
  int v23; 
  CHAR v24; 
  char v25; 
  unsigned __int64 v26; 
  char v27; 
  UINT64 ExtensionTable; 
  int v29; 
  __int64 v30; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  INT64 v32; 
  int v33; 
  int v34; 
  v34 = BoostSelf;
  v33 = BoostOthers;
  v7 = BoostSelf;
  v8 = BoostOthers;
  v9 = AddToTree;
  if( (*((_BYTE *)Thread + 792) | *((_BYTE *)Thread + 870)) != 63 )
  {
    v10 = *((_QWORD *)Thread + 100);
    v11 = *((char *)Thread + 792) | *((char *)Thread + 870);
    v30 = v10;
    v12 = v11 ^ 0x3F;
    v15 = !_BitScanForward((unsigned int *)&Thread, v12);
    if( !v15 )
    {
      while( 1 )
      {
        v12 &= v12 - 1;
        v13 = v10 + 96i64 * (_QWORD)Thread;
        v14 = *(_QWORD *)(v13 + 32);
        if( !v14 || (v14 & 2) != 0 )
          break;
        if( v9 && (v14 & 1) != 0 )
          goto LABEL_24;
        if( v14 >= 0 )
        {
          v23 = v9;
LABEL_28:
          if( !v23 )
            goto LABEL_24;
          goto LABEL_11;
        }
        if( v9 )
        {
          if( (*(_BYTE *)(v13 + 27) & 1) != 0 )
            goto LABEL_24;
          if( (*(_BYTE *)(v13 + 25) & 1) == 0 )
          {
            if( KiAbOwnerComputeCpuPriorityKey((_KLOCK_ENTRY *)(v10 + 96i64 * (_QWORD)Thread)) == *(_BYTE *)(v13 + 48) )
              goto LABEL_23;
LABEL_11:
            LODWORD(v32) = 0;
            v16 = 0;
            v29 = 0;
            memset(&LockHandle, 0, sizeof(LockHandle));
            LockedHeadEntry = (_KLOCK_ENTRY *)KiAbEntryGetLockedHeadEntry(v13, v9, &LockHandle, (void *)BoostSelf);
            v18 = LockedHeadEntry;
            if( LockedHeadEntry )
            {
              if( (*(_BYTE *)(v13 + 25) & 1) != 0 )
              {
                if( v8 )
                {
                  if( (_KLOCK_ENTRY *)v13 != LockedHeadEntry )
                    KiAbEntryUpdateWaiterTreePosition((SLIST_ENTRY *)v13);
                  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((_KLOCK_ENTRY *)v13, v18);
                  CpuPriorityKey = KiAbEntryGetCpuPriorityKey((unsigned __int8 *)v13);
                  if( v20 < CpuPriorityKey )
                  {
                    if( v21 )
                      goto LABEL_49;
                  }
                  else
                  {
                    if( !v21 )
                    {
                      v7 = v34;
                      v8 = v33;
                      goto LABEL_22;
                    }
LABEL_49:
                    KiAbIoBoostOwners(v18, v21, ReadyList, PropagateBoostsList, SelfBoostsList);
                  }
                  KiAbCpuBoostOwners(v18, CpuPriorityKey, ReadyList, PropagateBoostsList, SelfBoostsList);
                  v7 = v34;
                  v8 = v33;
                }
LABEL_41:
                KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
                if( v16 )
                {
                  v26 = v13 - 16i64 * *(unsigned __int8 *)(v13 + 24);
                  if( ObReferenceObjectSafeWithTag((PVOID)v26, 0x746C6644ui64) )
                  {
                    if( (v16 & 1) != 0 )
                      IoBoostThreadIoPriority((KSPIN_LOCK *)v26, 2, 0x80000000);
                    if( (v16 & 2) != 0 && *(_DWORD *)(v26 + 1368) )
                    {
                      ExtensionTable = ExGetExtensionTable(IopIoRateExtensionHost);
                      if( ExtensionTable )
                      {
                        (*(void(__fastcall **)(unsigned __int64))(ExtensionTable + 16))(v26);
                        ExReleaseRundownProtection(IopIoRateExtensionHost + 8);
                      }
                    }
                    ObDereferenceObjectDeferDeleteWithTag((PVOID)v26, 0x746C6644ui64);
                  }
                }
                goto LABEL_23;
              }
              if( !v7 )
                goto LABEL_41;
              if( (_KLOCK_ENTRY *)v13 != LockedHeadEntry )
                KiAbEntryUpdateOwnerTreePosition((_KLOCK_ENTRY *)v13, LockedHeadEntry);
              KiAbDetermineMaxWaiterPriority((INT64)v18, (INT64)&v32);
              if( (_DWORD)v32 )
              {
                if( (unsigned int)KiAbSetMinimumThreadPriority(
                                     v13,
                                     (__int64)&v32,
                                     (__int64)ReadyList,
                                     PropagateBoostsList,
                                     SelfBoostsList,
                                     &v29)
                  && (_KLOCK_ENTRY *)v13 != v18 )
                {
                  KiAbEntryUpdateOwnerTreePosition((_KLOCK_ENTRY *)v13, v18);
                }
                v16 = v29;
                goto LABEL_41;
              }
LABEL_22:
              KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
            }
LABEL_23:
            v10 = v30;
            goto LABEL_24;
          }
          v27 = *(_BYTE *)(v13 - 16i64 * *(unsigned __int8 *)(v13 + 24) + 195);
          if( v27 > 15 )
            v27 = 15;
          v15 = v27 == *(_BYTE *)(v13 + 48);
        }
        else if( (*(_BYTE *)(v13 + 25) & 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