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