首页
社区
课程
招聘
[求助]关于SEH的一点疑问
发表于: 2007-5-12 16:48 6298

[求助]关于SEH的一点疑问

2007-5-12 16:48
6298
近日,看Jeffry Richter著的那本《Windows核心编程》看到异常过滤程序和异常处理程序时,感觉书上的代码好像不太对劲,就巧入VC中,发现一个问题,但是我解决不了,希望大侠能够来看看,帮我解决一下。
    根据原书代码(588页589页)大致如下,我编写的代码如下:
#include<windows.h>
#include<STDIO.H>
char g_szBuffer[20]="cba";
#if 0    //这个函数与下个同名函数由自己选择
void FuncSinatra2(char *sz)
{
  __try
  {
    *sz=0;
    
  }
  __except(EXCEPTION_CONTINUE_SEARCH)
  {
               this never execute
  }
}
#endif
#if 1
void FuncSinatra2(char *sz)
{
  
    *sz=0;
    
}
#endif
DWORD OilFilter2(char **lplpBuffer)
{
  if(*lplpBuffer==NULL)
  {
    *lplpBuffer=g_szBuffer;
    return (EXCEPTION_CONTINUE_EXECUTION);
  }
  return (EXCEPTION_EXECUTE_HANDLER);
}
void FunclinRoosevelt2(void)
{
  char *lpBuffer=NULL;

  __try
  {
    FuncSinatra2(lpBuffer);
  }
  __except(OilFilter2(&lpBuffer))//标号一:这个标号下面有相关问题
  {
    MessageBox(NULL,"ok","ok",MB_OK);
  }
}

int main(int argc, char* argv[])
{

  FunclinRoosevelt2();

  return 0;
}
 
原书上的意思是两个FuncSinatra2函数,一个能够优雅的结束(第二个),另一个则在处理完异常后,由于局部变量sz的值没有改变,从失败的指令恢复执行会产生另一个异常,陷入了死循环(第一个)。
但是我感觉第二个也只是把NULL压栈了,也应该是死循环。
于是,我运行,奇怪的事情发生了: 
     两个程序都没有死循环! 
     由于发生异常的情况我们清楚的知道(访问NULL了),于是我把标号一处改为:
     __except(OilFilter2(&lpBuffer),EXCEPTION_CONTINUE_EXECUTION)
     这样,两个函数运行情况就如我所想的,都死循环了!
     难道是OilFilter2运行有问题?可是我调试,看到返回的值就是EXCEPTION_CONTINUE_EXECUTION(即OXFFFFFFFF)。但是明显的except()中用了EXCEPTION_EXECUTE_HANDLER这一值来处理!!!!!  
     为什么会出现这种问题呢?
     希望大家帮帮忙,顺便告诉我怎么样来解决这种问题,我没有思路啊。。。
谢谢各位大侠!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 5008
活跃值: (1147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
还是没有解决阿。。。
希望大家帮帮忙吧
自己顶一下
2007-5-14 08:51
0
雪    币: 5008
活跃值: (1147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
自己发现了,是自己理解的问题,忘了会执行第二次异常处理时lplpBuffer已经不空,返回肯定是EXCEPTION_EXECUTE_HANDLER
这两个程序不会死循环,是理解书上的话理解错误
占用大家的时间不好意思
2007-5-15 15:44
0
游客
登录 | 注册 方可回帖
返回
//