KeRundownApcQueues

_LIST_ENTRY *__fastcall KeRundownApcQueues(__int64 a1){
  _LIST_ENTRY *v2; 
  _LIST_ENTRY *v3; 
  _LIST_ENTRY *result; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *v6; 
  void(*Blink)(void); 
  unsigned __int8 CurrentIrql; 
  --*(_WORD *)(a1 + 484);
  *(_DWORD *)(a1 + 116) &= ~0x4000u;
  KiAcquireReleaseThreadLock((_KTHREAD *)a1);
  KeForceResumeThread((_KTHREAD *)a1);
  KeLeaveCriticalRegionThread(a1);
  v2 = KiFlushQueueApc((_KTHREAD *)a1, 1);
  v3 = v2;
  if( v2 )
  {
    v5 = v2;
    do
    {
      v6 = v5 - 1;
      v5 = v5->Flink;
      Blink = (void(*)(void))v6[2].Blink;
      if( Blink )
        Blink();
      else
        ExFreePoolWithTag(v6, 0);
    }
    while( v5 != v3 );
  }
  result = KiFlushQueueApc((_KTHREAD *)a1, 0);
  if( result || *(_DWORD *)(a1 + 484) )
  {
    CurrentIrql = KeGetCurrentIrql();
    KeBugCheckEx(0x20u, (ULONG_PTR)result, *(unsigned int *)(a1 + 484), CurrentIrql, 0i64);
  }
  return result;
}

Referenced by:

PspExitThread
sub_1405BC6E0