KeRundownApcQueues

VOID __stdcall KeRundownApcQueues(_ETHREAD *Thread){
  _LIST_ENTRY *v2; 
  _LIST_ENTRY *v3; 
  _LIST_ENTRY *v4; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *v6; 
  void(*Blink)(void); 
  unsigned __int8 CurrentIrql; 

  --Thread->Tcb.KernelApcDisable;
  Thread->Tcb._bf_0 &= ~0x4000u;
  KiAcquireReleaseThreadLock(&Thread->Tcb);
  KeForceResumeThread(Thread);
  KeLeaveCriticalRegionThread(&Thread->Tcb);
  v2 = KiFlushQueueApc(&Thread->Tcb, 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 );
  }
  v4 = KiFlushQueueApc(&Thread->Tcb, 0);
  if( v4 || Thread->Tcb.WaitBlock[3].SpareLong )
  {
    CurrentIrql = KeGetCurrentIrql();
    KeBugCheckEx(0x20u, v4, (PVOID)Thread->Tcb.CombinedApcDisable, (PVOID)CurrentIrql, 0i64);
  }
}

Referenced by:

PspExitThread
sub_1405BC6E0