参考链接:http://www.dewen.net.cn/q/302/
INT 0x2E在系统调用的时候,需要进行栈切换的工作。由于Interrupt/Exception Handler的调用都是通过 call/trap/task这一类的gate来实现的,这种方式会进行栈切换,并且系统栈的地址等信息由TSS提供。这种方式可能会引起多次内存访问 (来获取这些切换信息),因此,从PentiumII开始,IA-32引入了新指令:SYSENTER/SYSEXIT。 有了这两条指令,
从用户级到特权级的堆栈以及指令指针的转换,可以通过这一条指令来实现,并且,需要切换到的新堆栈的地址,以及相应过程的第一条指令的位置
2K上,所有的调用都是通过int 2e来实现的,Int2e的服务处理例程指向的是KiSystemSerivce,因此挂钩KiSystemSystem就可以获得所有的调用
而XP上,int2e指向的还是KiSystemSerivce,但SysEntry指向的则是KiFastCallEntry函数
由于shadow ssdt的调用都是通过int 2e实现的,因此拦截shadow ssdt调用的话拦KiSystemService即可,但正常的SSDT调用都是用sysentry实现的,因此要HOOK KiFastCallEntry才可以~