KiAbTryIncrementIoWaiterCounts
UINT64 __stdcall KiAbTryIncrementIoWaiterCounts(_KLOCK_ENTRY *Entry, _KLOCK_ENTRY *HeadEntry){
unsigned __int8 *p_CrossThreadFlags;
unsigned __int8 CrossThreadFlags;
unsigned int v7;
_DWORD *v8;
int IoPriorityThread;
if( (Entry->ThreadLocalFlags & 1) == 0 )
return 0i64;
p_CrossThreadFlags = &Entry->CrossThreadFlags;
CrossThreadFlags = Entry->CrossThreadFlags;
if( (CrossThreadFlags & 6) == 6 )
return 0i64;
v7 = 0;
v8 = (_DWORD *)((char *)Entry - 16 * Entry->EntryOffset);
if( (CrossThreadFlags & 2) == 0 )
{
IoPriorityThread = PsGetIoPriorityThread((__int64)v8);
if( IoPriorityThread >= 2 )
goto LABEL_6;
if( v8[340] != v7 )
IoPriorityThread = 2;
if( IoPriorityThread >= 2 )
{
LABEL_6:
*((_WORD *)&HeadEntry->BoostBitmap.2 + 1) ^= (*((_WORD *)&HeadEntry->BoostBitmap.2 + 1) ^ (*((_WORD *)&HeadEntry->BoostBitmap.2
+ 1)
+ 2)) & 0x1FE;
*p_CrossThreadFlags |= 2u;
if( (*((_WORD *)&HeadEntry->BoostBitmap.2 + 1) & 0x1FE) == 2 )
v7 = 1;
}
}
if( (*p_CrossThreadFlags & 4) == 0 && (!v8[342] || v8[341]) )
{
*((_WORD *)&HeadEntry->BoostBitmap.2 + 1) += 512;
*p_CrossThreadFlags |= 4u;
if( (*((_WORD *)&HeadEntry->BoostBitmap.2 + 1) & 0xFE00) == 512 )
v7 |= 2u;
}
return v7;
}Referenced by:
KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks