2009-09-28 5 views
7

이 문제를 테스트하려면 최소한의 Windows 응용 프로그램을 작성해야합니다. WM_PAINT 처리기에서 강제로 액세스 위반이 발생하면이 예외가 디버거로 전달되지 않습니다. 디버거없이 시작되면 액세스 위반도 표시되지 않습니다. 일반적으로 Windows 오류보고 대화 상자가 나타납니다.WM_PAINT에서 액세스 위반이 발견되지 않았습니다.

좀 더 자세히 살펴보면 user32.dll의 내용이 들어오는 예외를 모두 잡는 것처럼 보입니다. 이것은 정상적인 행동입니까? 어떻게 든 이것을 제어 할 수 있습니까? 모든 예외를 보안 위험에 포착하지 않습니까? 적어도 그것은 지옥 같은 성가심입니다.

이것은 Vista 64에서 32 비트 및 64 비트 응용 프로그램과 함께 사용됩니다. XP에서는 예외가 예상대로 처리 된 것 같습니다. 다른 윈도우 메시지도 똑같은 문제가 있습니다. 아마 그들 모두?

WM_PAINT 핸들러 :

case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 
    *(int*)0 = 0; 
    EndPaint(hWnd, &ps); 
    break; 

답변

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

예외는 WINXP와 비스타에서 발생합니다. 디버그 및 릴리스 구성에서 Vista에서이 기능을 테스트했습니다. 새로운 Win32 응용 프로그램 프로젝트에서 동일한 문제가 있습니까?

3

DispatchMessage에는 이제 window procs에서 생성 된 예외를 금지하는 SEH try catch 블록이 포함 된 것 같습니다.

여전히 디버거에서 이러한 예외를 catch 할 수 있습니다 - Visual Studio 버전에 따라 디버그 -> 예외 대화 상자를 열고 모든 Win32 예외에 대해 "예외가 발생하면 중단"열을 선택하십시오. 예외 0xc0000005

+0

하지만이 방법은 디버거를 사용하는 경우에만 해결할 수 있습니다. 그리고 Windows 메시지를 처리하는 동안 발생할 수있는 다른 모든 예외는 무엇입니까? 이 변경에 대한 공식적인 (또는 비공식적 인) 문서 또는 추론을 가지고 있습니까? –

0

나는 Aero (기본적으로 Vista에서는 있음)를 사용할 때 창 크기를 조정하면 많은 페이지 폴트가 발생하는 경향이 있음을 발견했습니다. 이것은 정상적인 가상 메모리가 아니라 페이징 인 오류입니다. 필자는 Aero가 그래픽 출력을 보호 된 메모리 덩어리로 리다이렉트 (redirect)하고 오류를 잡아서 보이는 표면의 어느 비트가 바탕 화면에 재조합되어야 하는지를 알 수 있다고 생각한다. 아마도 그것은 다른 액세스 위반을 먹고 있습니다.

+0

Vista 비디오 메모리가 가상 화됩니다. 이는 응용 프로그램의 예외와 상관 관계가 없어야합니다. 적어도 Aero는 Windows 메시지의 예외 처리를 사용하여 아무 것도 변경하지 않습니다. –

+0

네 말이 맞아. 데스크톱 합성이 활성화되었는지 여부에 관계없이 예외가 삭제됩니다. –

0

XP에서 시작하여 벡터 예외 처리 기능을 사용할 수 있습니다. 그것은 다른 모든 종류의 예외보다 우선합니다. 필자의 예에서는 WM_PAINT 메시지에서 액세스 위반을 올바르게 발견했습니다. 불행히도, 다른 예외도 잡았습니다. 예외 코드를 확인하여 해결해야합니다.

관련 문제