windows内核情景分析之进入与退出系统空间过程
以下为看书和结合自己的理解所写,如有错误,请指正!
在windows操作系统中,要想进入系统空间,有三种方式——自陷,中断,异常,通过这三种方式进入系统空间后(通过中断向量表找到中断例程),都会经过一个预处理函数,这个预处理函数用来保留上下文,拷贝参数等,同时也都会调用HalBeginSystemInterrupt函数:
BOOLEAN
HalBeginSystemInterrupt(
IN KIRQL Irql
IN CCHAR Vector,
OUT PKIRQL OldIrql)
这个函数的作用是判断中断处理函数的Irql是否大于当前的Irql,如果小于或者等于,则返回false;如果大于,则提升当前Irql到中断处理函数的Irql,然后调用中断处理函数,处理完后会调用HalEndSystemInterrupt(),调用这个函数时必须是关中断的。这个函数和所有 KfLowerIrql功能差不多,就是降低当前IRQL,但是也有不同的地方,当Irql要被降到APC_lever以下时,如果APC链表不为空,KfLowerIrql会调用 KiDeliverApc(KernelMode, NULL, NULL)触发apc执行,而处理完后会调用HalEndSystemInterrupt只会判断所要降到的目标irql是否小于DISPATCH_LEVER,如果是就会触发dpc的执行,而不会去判断所要降到的目标irql是否小于APC_lever。
随后,当要退出系统空间到用户空间时,要必须执行一段代码,要来触发apc的执行。