为了测试此问题,我编写了一个最小的Windows应用程序。如果我在WM_PAINT
处理程序中强行访问冲突,则此异常永远不会到达调试器。如果在没有调试器的情况下启动,则不会显示访问冲突。通常,您应该获得Windows错误报告对话框。
深入研究似乎user32.dll中的某些内容捕获了所有传入的异常。这是正常行为吗?我可以控制它吗?捕获所有异常不是安全风险吗?至少令人讨厌。
这是在Vista 64上使用32位和64位应用程序的情况。在XP上,异常似乎已按预期处理。其他Windows消息也有相同的问题。也许所有人?WM_PAINT
处理程序:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
*(int*)0 = 0;
EndPaint(hWnd, &ps);
break;
最佳答案
解决方法是,我删除窗口过程中所有已注册的异常处理程序。很丑。
LALLULT CALLBACK window_proc(
HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
//获取线程信息块
NT_TIB * tib;
__asm {
mov EAX,FS:[18h]
mov [tib],EAX
}
//旧的异常处理程序列表
_EXCEPTION_REGISTRATION_RECORD * old_exception_handler = tib-> ExceptionList;
//删除默认处理程序之外的所有异常处理程序
while(tib-> ExceptionList-> Next!=(_EXCEPTION_REGISTRATION_RECORD *)-1){
tib-> ExceptionList = tib-> ExceptionList->下一步;
}
LRESULT结果= DefWindowProc(hwnd,uMsg,wParam,lParam);
//恢复旧的异常处理程序
tib-> ExceptionList = old_exception_handler;
返回结果;
}