KiAbEntryGetLockedHeadEntry
_KLOCK_ENTRY *__stdcall KiAbEntryGetLockedHeadEntry(
_KLOCK_ENTRY *Entry,
UINT64 AddToTree,
_KLOCK_QUEUE_HANDLE *HeadEntryLockQueue){
UINT64 v3;
bool v4;
int v6;
_KLOCK_ENTRY *v7;
int v8;
unsigned __int64 v9;
INT64 *v10;
UINT64 *v11;
UINT64 v12;
UINT64 v13;
int v14;
unsigned __int64 v15;
unsigned int v16;
UINT64 v17;
signed __int32 v18;
UINT64 v19;
BOOL v20;
unsigned __int64 v21;
unsigned int v22;
UINT64 v23;
_KLOCK_ENTRY *v24;
char *v25;
char v27;
UINT64 *v28;
UINT64 v29;
BOOL v30;
int v31;
UINT64 v32;
INT8 v33;
INT8 v34;
UINT64 v35;
int v36;
UINT64 v37;
signed __int32 v38;
unsigned __int64 v39;
unsigned int SessionId;
int v41;
$E8276A2CF8B819ED32D1B6FEB35D730A v42;
_KLOCK_QUEUE_HANDLE v43;
UINT64 SpinCount;
v3 = 0i64;
v4 = (Entry->CrossThreadFlags & 1) == 0;
v41 = 0;
v6 = AddToTree;
v7 = Entry;
memset(&v43, 0, sizeof(v43));
if( !v4 )
{
HeadEntryLockQueue->LockQueue.Next = 0i64;
HeadEntryLockQueue->LockQueue.Lock = &Entry->EntryLock;
KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, &Entry->EntryLock);
if( (v7->CrossThreadFlags & 1) != 0 )
return v7;
KeReleaseInStackQueuedSpinLockFromDpcLevel(HeadEntryLockQueue);
}
v42 = v7->32;
if( v42.LockState._bf_0 >= 0 && !v6 )
return 0i64;
v8 = 0;
v39 = v42.LockState._bf_0 & 0x7FFFFFFFFFFFFFFCi64;
v9 = (((v42.LockState._bf_0 & 0x7FFFFFFFFFFFFFFCui64) >> 4) & 0x3FF) << 6;
SessionId = v42.LockState.SessionId;
v10 = (INT64 *)((char *)&WheapErrorSourceTable + v9 + 3128);
v11 = (UINT64 *)((char *)&WheapErrorSourceTable + v9 + 3112);
while( 1 )
{
if( v8 )
ExAcquireSpinLockExclusiveAtDpcLevel(v10);
else
ExAcquireSpinLockSharedAtDpcLevel((PEX_SPIN_LOCK)v10);
v12 = v11[1];
v13 = *v11;
if( (v12 & 1) != 0 )
{
if( v13 )
v13 ^= (unsigned __int64)v11;
else
v13 = 0i64;
}
v14 = v12 & 1;
if( v13 )
{
while( 1 )
{
v15 = *(_QWORD *)(v13 + 32) & 0x7FFFFFFFFFFFFFFCi64;
if( v15 < v39 )
goto LABEL_36;
if( v15 > v39 )
goto LABEL_16;
v16 = *(_DWORD *)(v13 + 40);
if( v16 == v42.LockState.SessionId )
goto LABEL_19;
if( v16 < v42.LockState.SessionId )
{
LABEL_36:
v17 = *(_QWORD *)(v13 + 8);
if( v14 && v17 )
{
LABEL_40:
v13 ^= v17;
goto LABEL_18;
}
}
else
{
LABEL_16:
v17 = *(_QWORD *)v13;
if( v14 && v17 )
goto LABEL_40;
}
v13 = v17;
LABEL_18:
if( !v13 )
{
LABEL_19:
v7 = Entry;
break;
}
}
}
if( !v6 )
{
if( v13 )
{
v24 = (_KLOCK_ENTRY *)v13;
HeadEntryLockQueue->LockQueue.Lock = (unsigned __int64 *volatile)(v13 + 80);
HeadEntryLockQueue->LockQueue.Next = 0i64;
KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, (UINT64 *)(v13 + 80));
if( v8 )
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
else
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
if( v7 == (_KLOCK_ENTRY *)v13 )
return v24;
v43.LockQueue.Next = 0i64;
v43.LockQueue.Lock = &v7->EntryLock;
KxAcquireQueuedSpinLock(&v43.LockQueue, &v7->EntryLock);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v43);
if( KiAbCompareSnappedEntryState((__m128i *)v7, (__int64)&v39) )
return v24;
KeReleaseInStackQueuedSpinLockFromDpcLevel(HeadEntryLockQueue);
}
else if( v8 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
}
else
{
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
}
return 0i64;
}
if( v13 )
break;
if( v8 )
goto LABEL_25;
v8 = 1;
LODWORD(SpinCount) = 0;
if( !_interlockedbittestandset((volatile signed __int32 *)v10, 0x1Fu) )
{
v18 = *(_DWORD *)v10;
while( (v18 & 0xBFFFFFFF) != -2147483647 )
{
if( (v18 & 0x40000000) == 0 )
{
v38 = _InterlockedCompareExchange((volatile signed __int32 *)v10, v18 | 0x40000000, v18);
v4 = v18 == v38;
v18 = v38;
if( !v4 )
continue;
}
KeYieldProcessorEx(&SpinCount);
v18 = *(_DWORD *)v10;
}
LABEL_25:
v19 = *v11;
if( (v11[1] & 1) != 0 )
{
if( v19 )
v19 ^= (unsigned __int64)v11;
else
v19 = 0i64;
}
v20 = 0;
if( v19 )
{
while( 1 )
{
v21 = *(_QWORD *)(v19 + 32) & 0x7FFFFFFFFFFFFFFCi64;
if( v21 < v39
|| v21 <= v39
&& ((v22 = *(_DWORD *)(v19 + 40), v22 == v42.LockState.SessionId) || v22 < v42.LockState.SessionId) )
{
v23 = *(_QWORD *)(v19 + 8);
if( (v11[1] & 1) != 0 )
{
if( !v23 )
goto LABEL_45;
v23 ^= v19;
}
if( !v23 )
{
LABEL_45:
v20 = 1;
break;
}
}
else
{
v23 = *(_QWORD *)v19;
if( (v11[1] & 1) != 0 )
{
if( !v23 )
goto LABEL_46;
v23 ^= v19;
}
if( !v23 )
{
LABEL_46:
v20 = 0;
break;
}
}
v19 = v23;
}
}
RtlRbInsertNodeEx(v11, v19, v20, (UINT64)v7);
v24 = v7;
HeadEntryLockQueue->LockQueue.Lock = &v7->EntryLock;
HeadEntryLockQueue->LockQueue.Next = 0i64;
KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, &v7->EntryLock);
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
v7->InTreeByte |= 0x80u;
v7->CrossThreadFlags |= 1u;
v7->OwnerTree.Root = 0i64;
v7->OwnerTree.Min = 0i64;
v7->WaiterTree.Root = 0i64;
v7->WaiterTree.Min = 0i64;
v7->BoostBitmap._bf_2 &= 1u;
LABEL_48:
v25 = (char *)v7 - 16 * v7->EntryOffset;
if( (v7->ThreadLocalFlags & 1) != 0 )
++v25[793];
else
_InterlockedExchangeAdd8(v25 + 871, 1u);
return v24;
}
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
}
v24 = (_KLOCK_ENTRY *)v13;
HeadEntryLockQueue->LockQueue.Lock = (unsigned __int64 *volatile)(v13 + 80);
HeadEntryLockQueue->LockQueue.Next = 0i64;
KxAcquireQueuedSpinLock(&HeadEntryLockQueue->LockQueue, (UINT64 *)(v13 + 80));
if( v8 )
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
else
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v10);
if( v7->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 >= 0 )
{
if( (v7->ThreadLocalFlags & 1) != 0 )
{
v27 = BYTE3((&v7[2].FreeListEntry.Next)[-2 * v7->EntryOffset]);
if( v27 > 15 )
v27 = 15;
v28 = (UINT64 *)(v13 + 64);
v7->CpuPriorityKey = v27;
v29 = v28[1];
if( (v29 & 1) != 0 )
{
if( *v28 )
v3 = *v28 ^ (unsigned __int64)v28;
}
else
{
v3 = *v28;
}
v30 = 0;
v31 = v29 & 1;
if( v3 )
{
while( 1 )
{
if( *(char *)(v3 + 48) < v27 )
{
v32 = *(_QWORD *)v3;
if( v31 )
{
if( !v32 )
break;
v32 ^= v3;
}
if( !v32 )
break;
}
else
{
v32 = *(_QWORD *)(v3 + 8);
if( v31 )
{
if( !v32 )
goto LABEL_69;
v32 ^= v3;
}
if( !v32 )
goto LABEL_69;
}
v3 = v32;
}
}
}
else
{
v33 = KiAbOwnerComputeCpuPriorityKey(v7);
v28 = (UINT64 *)(v13 + 48);
v7->CpuPriorityKey = v33;
v34 = v33;
v35 = v28[1];
if( (v35 & 1) != 0 )
{
if( *v28 )
v3 = *v28 ^ (unsigned __int64)v28;
}
else
{
v3 = *v28;
}
v30 = 0;
v36 = v35 & 1;
if( v3 )
{
while( 1 )
{
if( *(char *)(v3 + 48) > v34 )
{
v37 = *(_QWORD *)v3;
if( v36 )
{
if( !v37 )
break;
v37 ^= v3;
}
if( !v37 )
break;
}
else
{
v37 = *(_QWORD *)(v3 + 8);
if( v36 )
{
if( !v37 )
goto LABEL_69;
v37 ^= v3;
}
if( !v37 )
{
LABEL_69:
v30 = 1;
break;
}
}
v3 = v37;
}
}
}
RtlRbInsertNodeEx(v28, v3, v30, (UINT64)v7);
v7->InTreeByte |= 0x80u;
goto LABEL_48;
}
return v24;
}Referenced by:
KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks