APC(Asynchronous Procedure Call)异步过程调用。NtQueueApcThread()这个系统调用把一个”用户APC请求”挂入目标线程的APC队列。KTHREAD数据结构中APCState指向线程的APC队列(用户APC和内核APC。
一般来说,只有把APC请求挂入队列,就不再需要触发,而只是等待执行的时机。对于用户APC请求,该时机同样也是目标线程从内核返回用户空间的前夕。对于内核APC则有所不同,每当内核通过KeLowerIrql()降低其运行级别或者进行线程切换时,就会执行当前线程的内核APC。
APC执行的时机是在系统调用、中断、或异常处理之后从内核返回用户空间的途中,执行过程是在APC_LEVEL上。
DPC执行的时机是IRQ降到DISPATCH_LEVEL时