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