WM_PAINT中的访问冲突未被捕获

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)

Seb*_*usk 5

作为一种解决方法,我在窗口过程中删除所有已注册的异常处理程序.相当丑陋.

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;
}


小智 5

这是一个已知的缺陷.检查此修补程序. http://support.microsoft.com/kb/976038