首先,这个函数的代码是不可以被交换到磁盘上的。你自己的dispatch函数是放在驱动模块里的吧?如果那样,可能是当发生异常时,你的函数不在物理内存中......
对于调用DbgPrint,不知道你是在哪里做的调用,如果是在异常分发函数中,那么注定有问题的,会导致死循环。因为DbgPrint会调用调试服务,触发异常(《软件调试》18.6.6).......
楼主对hook这个函数很执着:-),想达到什么目的呢?
看了下你的代码,当发生用户态异常时,能成功工作的DbgPrint不是在函数的关键路径上,而是在一个分支中,对应的是用户态异常的分支,即下面的else分支中:
if(异常来自内核态){ //分发源于内核态的异常 // DbgPrint("lan \n"); //如果是内核下发生的异常,调用这句也错}else{ DbgPrint("lan \n"); //如果是在用户模式下发生的异常,这句会输出没有问题 //分发源于用户态的异常}
对于else分支中的DbgPrint,它调用调试服务而触发的异常是内核态异常,因此第二次进入这个函数时,会走分发内核态异常的分支,所以这个DbgPrint调用不会导致递归,可以工作。
对于其它失败的DbgPrint调用,因为它们位于分发内核异常的路径上,因此当分发DbgPrint触发的异常时,第二次进入Dispatch函数时会再次经过这个DbgPrint函数,导致递归......
总的来说,这个函数内部最好不要用DbgPrint,也不建议修改这个函数...