KiAbTryIncrementIoWaiterCounts
UINT64 __stdcall KiAbTryIncrementIoWaiterCounts(_KLOCK_ENTRY *Entry, _KLOCK_ENTRY *HeadEntry){
unsigned __int8 *p_CrossThreadFlags;
unsigned __int8 CrossThreadFlags;
unsigned int v7;
_ETHREAD *v8;
_IO_PRIORITY_HINT IoPriorityThread;
if( (Entry->ThreadLocalFlags & 1) == 0 )
return 0i64;
p_CrossThreadFlags = &Entry->CrossThreadFlags;
CrossThreadFlags = Entry->CrossThreadFlags;
if( (CrossThreadFlags & 6) == 6 )
return 0i64;
v7 = 0;
v8 = (_ETHREAD *)((char *)Entry - 16 * Entry->EntryOffset);
if( (CrossThreadFlags & 2) == 0 )
{
IoPriorityThread = PsGetIoPriorityThread(v8);
if( IoPriorityThread >= IoPriorityNormal )
goto LABEL_6;
if( v8->IoBoostCount != v7 )
IoPriorityThread = IoPriorityNormal;
if( IoPriorityThread >= IoPriorityNormal )
{
LABEL_6:
HeadEntry->BoostBitmap._bf_2 ^= (HeadEntry->BoostBitmap._bf_2 ^ (HeadEntry->BoostBitmap._bf_2 + 2)) & 0x1FE;
*p_CrossThreadFlags |= 2u;
if( (HeadEntry->BoostBitmap._bf_2 & 0x1FE) == 2 )
v7 = 1;
}
}
if( (*p_CrossThreadFlags & 4) == 0 && (!v8->IoQoSThrottleCount || v8->IoQoSBoostCount) )
{
HeadEntry->BoostBitmap._bf_2 += 512;
*p_CrossThreadFlags |= 4u;
if( (HeadEntry->BoostBitmap._bf_2 & 0xFE00) == 512 )
v7 |= 2u;
}
return v7;
}Referenced by:
KiAbForceProcessLockEntry
KiAbProcessContextSwitch
KiAbProcessThreadLocks