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