KiSwitchPriQueue
INT64 __fastcall KiSwitchPriQueue(INT64 a1, PVOID Object, DISPATCHER_HEADER *a3){
INT64 *v3;
__int64 v6;
INT64 result;
PVOID *v8;
UINT64 SpinCount;
v3 = (INT64 *)(a1 + 520);
if( a3 )
KiActivateWaiterQueueWithNoLocks((_ETHREAD *)a1, a3, (_LIST_ENTRY *)(a1 + 520));
KiAcquireKobjectLockSafe(Object);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a1 + 64) );
}
*(_QWORD *)(a1 + 232) = Object;
v6 = *(char *)(a1 + 563);
*(_DWORD *)(a1 + 540) = v6;
_InterlockedIncrement((volatile signed __int32 *)Object + v6 + 134);
KiReleaseThreadLockSafe(a1);
result = (INT64)Object + 672;
v8 = (PVOID *)*((_QWORD *)Object + 85);
if( *v8 != (char *)Object + 672 )
__fastfail(3u);
*v3 = result;
v3[1] = (INT64)v8;
*v8 = v3;
*((_QWORD *)Object + 85) = v3;
_InterlockedAnd((volatile signed __int32 *)Object, 0xFFFFFF7F);
return result;
}Referenced by:
KeRemovePriQueue