KiAbEntryUpdateWaiterTreePosition
VOID __stdcall KiAbEntryUpdateWaiterTreePosition(_KLOCK_ENTRY *Entry, _KLOCK_ENTRY *HeadEntry){
char v3;
_RTL_RB_TREE *p_WaiterTree;
BOOL v5;
UINT64 Root;
UINT64 v7;
v3 = BYTE3((&Entry[2].FreeListEntry.Next)[-2 * Entry->EntryOffset]);
if( v3 > 15 )
v3 = 15;
if( Entry->CpuPriorityKey != v3 )
{
p_WaiterTree = &HeadEntry->WaiterTree;
Entry->CpuPriorityKey = v3;
RtlRbRemoveNode((UINT64 *)&HeadEntry->WaiterTree, (UINT64)Entry);
v5 = 0;
Root = (UINT64)p_WaiterTree->Root;
if( (p_WaiterTree->_bf_0 & 1) != 0 )
{
if( Root )
Root ^= (unsigned __int64)p_WaiterTree;
else
Root = 0i64;
}
if( Root )
{
while( 1 )
{
if( *(_BYTE *)(Root + 48) < Entry->CpuPriorityKey )
{
v7 = *(_QWORD *)Root;
if( (p_WaiterTree->_bf_0 & 1) != 0 )
{
if( !v7 )
break;
v7 ^= Root;
}
if( !v7 )
break;
}
else
{
v7 = *(_QWORD *)(Root + 8);
if( (p_WaiterTree->_bf_0 & 1) != 0 )
{
if( !v7 )
goto LABEL_11;
v7 ^= Root;
}
if( !v7 )
{
LABEL_11:
v5 = 1;
break;
}
}
Root = v7;
}
}
RtlRbInsertNodeEx((UINT64 *)p_WaiterTree, Root, v5, (UINT64)Entry);
}
}Referenced by:
KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks