本来以为理解了这个问题,想多后却胡涂了。我的系统是Win7 SP1
KiTrap03中的dec ebx,并没有直接修改TrapFrame,修改的是传递给CommonDispatchException的参数,这样,在KiDispatchException中看到的2个参数(ExceptionRecord和TrapFrame对于int 3来说,EIP的值是不一样的,差了一个1),
而到了KiDispatchException中,有了dec [edi+_CONTEXT._Eip]语句,修改的是Context,对trapframe也没有影响,
在发送给调试器的时候,只传递了ExceptionRecord,没有TrapFrame或是Context,如果调试器有回复,就直接退出了,并没有调用KeContextToFrame(看了代码,好象用户态下的都没有调用,kernel下的调用了),那么使用iret中断返回后是怎么到正确的指令地址上的?难道是用户态的调试器做的手脚?