我正在阅读有关Windows上SEH的这篇文章.这是myseh.cpp的源代码
我调试了myseh.cpp.我printf("Hello from an exception handler\n");在第24 DWORD handler = (DWORD)_except_handler;行和第36行分别设置了2个断点.
然后我跑了它,它突破了线:36.我看到堆栈跟踪如下.
随着时间的推移, 发生了AccessViolationException,因为mov [eax], 1
它在第24行中断了.我看到堆栈跟踪如下.

同一线程,但帧的main不见了!而不是_except_handle.ESP从跳跃0018f6c8到0018ef34;它0018f6c8与0018ef34
After Exception 之间的差距很大.
我知道_except_handle必须在用户模式而不是内核模式下运行.后_except_handle返回,线程转向RING0然后windows内核修改的上下文EAX来&scratch&然后回到环3.因此线程不断运行.
我很好奇窗口处理异常的机制:为什么帧调用main消失了?
为什么ESP从跳下0018f6c8来0018ef34?(我指的是大间距),做那些ESP地址属于同一线程的堆栈??? 内核是否在ring3中对ESP进行了一些技巧?如果是这样,为什么选择0018ef34处理程序回调框架的地址?非常感谢!