用户APC执行过程
1.执行用户APC的堆栈操作
线程从用户层到内核层时,要保留原来的运行环境;
寄存器,栈的位置要切换回内核的堆栈,如果正常返回,恢复堆栈环境即可;但是要是有用户APC要执行的话,线程要提前返回到用户空间执行,而且返回的位置不是线程进入内核时的位置,而是返回到其他位置,每处理一个用户APC都会涉及到内核用户空间再回到内核空间(ZwContinue);
KiIntializeUesrApc函数分析:备份CONTEXT
线程进0环时,原来的运行环境要保存到_Trap_Frame结构体中,如果要提前返回3环中去处理用户APC,就要修改_Trap_Frame结构体;
当处理完用户APC后,又要返回内核APC,这时原来的值怎么确定呢?
这个函数要做的第一家是就是备份:将原来_Trap_Frame的值备份结构体CONTEXT,这个功能由子函数KeContextTromKframes决定;
备用APC队列:
https://editor.csdn.net/md/?articleId=113762206