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