KiAbFindWakeupLockEntry
_KLOCK_ENTRY *__stdcall KiAbFindWakeupLockEntry(VOID *Lock, _ETHREAD *WaiterThread){
_KLOCK_ENTRY *v2;
unsigned __int64 v4;
NTSTATUS SessionId;
int v6;
__int64 v8;
_KLOCK_ENTRY *v9;
int v10;
__int128 v11;
unsigned __int8 v12;
__int64 v13;
__int128 v15;
unsigned __int8 v16;
v2 = 0i64;
if( (WaiterThread->Tcb.AbEntrySummary | WaiterThread->Tcb.AbOrphanedEntrySummary) == 63 )
return 0i64;
v4 = (unsigned __int64)Lock & 0x7FFFFFFFFFFFFFFCi64;
if( MmIsSessionAddress(Lock) )
SessionId = MmGetSessionIdEx(KeGetCurrentThread()->ApcState.Process);
else
SessionId = -1;
v6 = ((char)WaiterThread->Tcb.AbEntrySummary | (char)WaiterThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( _BitScanReverse((unsigned int *)&v8, v6) )
{
v9 = &WaiterThread->Tcb.LockEntries[v8];
v6 &= ~(1 << v8);
if( (v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == v4 )
{
*(_QWORD *)&v11 = v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0;
*((_QWORD *)&v11 + 1) = _mm_srli_si128((__m128i)v9->32, 8).m128i_u64[0];
v12 = _InterlockedCompareExchange128(
&v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0,
*((signed __int64 *)&v11 + 1),
v11,
(signed __int64 *)&v11);
v10 = DWORD2(v11);
v13 = v11;
if( v12
|| (*(_QWORD *)&v15 = v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0,
*((_QWORD *)&v15 + 1) = _mm_srli_si128((__m128i)v9->32, 8).m128i_u64[0],
v16 = _InterlockedCompareExchange128(
&v9->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0,
*((signed __int64 *)&v15 + 1),
v15,
(signed __int64 *)&v15),
v10 = DWORD2(v15),
v13 = v15,
v16) )
{
if( (v9->ThreadLocalFlags & 1) != 0 && (v13 & 0x7FFFFFFFFFFFFFFCi64) == v4 && v10 == SessionId )
return v9;
}
}
}
return v2;
}Referenced by:
KeAbPreWakeupThread