首页
社区
课程
招聘
seh中exceptionfilter如何得到发生异常的是哪个模块?[求助]
发表于: 2007-5-6 14:12 6564

seh中exceptionfilter如何得到发生异常的是哪个模块?[求助]

2007-5-6 14:12
6564
SetUnhandledExceptionFilter(ExceptionFilter);

exceptionfilter中想得到发生异常的是哪个模块, 并得到它的基址,程序有可能有好多个自己的dll:

下面的exceptionfilter函数写得对吗?主要在dll中发生的错误,不知道
GetModuleFileName得到的模块名字是不是对的
LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
  TCHAR modulename[MAX_PATH],szError[1000],filename[MAX_PATH],temp[MAX_PATH],*p;
  MODULEINFO moduleinfo;
  DWORD processID = GetCurrentProcessId();
  HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, processID );
  GetModuleFileName(NULL,filename,MAX_PATH);
  p=strrchr(filename,'\\');
  p++;
  lstrcpy(temp,p);
  HMODULE hmodule=GetModuleHandle(temp);
  if(GetModuleInformation(hProcess,hmodule,&moduleinfo,sizeof(MODULEINFO)))
    wsprintf(szError,"本程序遇到错误需要关闭,对此给你带来的不便表示抱歉.\n模块:%s,模块基址:0x%x,异常代码:0x%x,指令地址:0x%x",
      temp,moduleinfo.lpBaseOfDll,pExceptionInfo->ExceptionRecord->ExceptionCode,pExceptionInfo->ExceptionRecord->ExceptionAddress);
  else
    lstrcpy(szError,"本程序遇到错误需要关闭,对此给你带来的不便表示抱歉.");
  MessageBox(NULL,szError,"seh",MB_OK);
  return EXCEPTION_EXECUTE_HANDLER;
}
各位高手请看下.

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很好的问题 希望有高人答一下
2007-5-8 08:19
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
你试试这个方法,通过pExceptionInfo结构得到异常发生的地址,然后调用VirtualQuery,通过MEMORY_BASIC_INFORMATION结构中的BaseAddress得到模块的基址,以该模块基址作为模块句柄,调用GetModuleName得到模块名,这样你便可得到异常发生的模块是哪个了
2007-5-8 11:16
0
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢, 我用llydd的方法搞定了, 不过用的不是BaseAddress, 是AllocationBase  .
2007-5-8 21:15
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
我使用了两位的方法,问题得到了解决,特注册来感谢二位
2020-8-3 16:51
0
游客
登录 | 注册 方可回帖
返回
//