7

この問題をテストするために、最小限の 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;
4

6 に答える 6

5

これは既知の欠陥です。ホットフィックスを確認してください。 http://support.microsoft.com/kb/976038

于 2010-08-05T18:59:44.273 に答える
5

回避策として、ウィンドウ プロシージャに登録されているすべての例外ハンドラを削除します。かなり醜い。

LRESULT CALLBACK window_proc(
    HWND hwnd、UINT uMsg、WPARAM wParam、LPARAM lParam )
{
    // スレッド情報ブロックを取得
    NT_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->Next;
    }

    LRESULT 結果 = DefWindowProc( hwnd, uMsg, wParam, lParam );

    // 古い例外ハンドラを復元します
    tib->ExceptionList = old_exception_handler;

    結果を返します。
}
于 2009-10-01T09:32:14.227 に答える
3

DispatchMessage には、ウィンドウ プロシージャによって生成される例外を禁止する SEH try catch ブロックが含まれているようです。

これらの例外は引き続きデバッガーでキャッチできます。Visual Studio のバージョンによっては、[デバッグ] -> [例外] ダイアログを開き、すべての Win32 例外、または少なくとも例外 0xc0000005 の [例外がスローされたときにブレーク] 列にチェックを入れる必要があります。

于 2009-09-29T07:48:43.123 に答える
0

WinXP および Vista では例外がスローされます。Vista のデバッグおよびリリース構成でこれをテストしました。新しい Win32 アプリケーション プロジェクトでも同じ問題がありますか?

于 2009-09-28T18:47:39.067 に答える
0

XP 以降では、Vector Exception Handling 機能を使用できます。他のすべての種類の例外よりも優先されます。私の例では、WM_PAINT メッセージで Access Violation を正しくキャッチしました。残念ながら、これは他のすべての種類の例外もキャッチするので、おそらく例外コードをチェックして解決する必要があります。

于 2010-05-25T14:45:32.960 に答える
0

Aero を有効にしている場合 (Vista ではデフォルト)、ウィンドウのサイズを変更すると非常に多くのページ フォールトが発生する傾向があることに気付きました。これらは、通常の仮想メモリのページインが必要な障害でもありません。Aero は、グラフィックス出力を保護されたメモリ チャンクにリダイレクトし、表示されているサーフェスのどの部分をデスクトップに再合成する必要があるかを知るために障害をキャッチするのではないかと思います (これは単なる理論にすぎません)。おそらく、それは他のアクセス違反も食べています。

于 2009-09-30T19:26:01.457 に答える