Seb*_*usk 7 c++ windows winapi exception access-violation
为了测试这个问题,我编写了一个最小的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;
Run Code Online (Sandbox Code Playgroud)
作为一种解决方法,我在窗口过程中删除所有已注册的异常处理程序.相当丑陋.
LRESULT CALLBACK window_proc(
HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
// get thread information block
NT_TIB* tib;
__asm {
mov EAX, FS:[18h]
mov [tib], EAX
}
// old exception handler list
_EXCEPTION_REGISTRATION_RECORD* old_exception_handler = tib->ExceptionList;
// remove all exception handler with exception of the default handler
while( tib->ExceptionList->Next != (_EXCEPTION_REGISTRATION_RECORD*)-1 ) {
tib->ExceptionList = tib->ExceptionList->Next;
}
LRESULT result = DefWindowProc( hwnd, uMsg, wParam, lParam );
// restore old exception handler
tib->ExceptionList = old_exception_handler;
return result;
}
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |