2009-09-28 4 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にスローされます。私はちょうどデバッグとリリースの設定でVistaでこれをテストしました。新しいWin32アプリケーションプロジェクトで同じ問題がありますか?

3

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

Visual Studioのバージョンによっては、debug-> exceptionsダイアログを開いて、「例外がスローされたときにブレーク」列に必要なすべてのWin32例外をチェックする必要があります。例外0xc0000005

+0

私は知っていますが、これはデバッガを使用している場合の唯一の解決策です。そして、Windowsのメッセージを処理している間にスローされるかもしれない他のすべての例外とは何ですか?この変更のための公式(または非公式)文書または推論がありますか? –

0

私が気づいたのは、Aeroを有効にすると(Vistaではデフォルト)、ウィンドウのサイズを変更すると多くのページ違反が発生する傾向があります。これらは、通常の仮想メモリの必要なページングインフォールトでもありません。私は、Aeroがグラフィックスの出力をメモリの保護されたチャンクにリダイレクトし、デスクトップに再現される必要がある可視のビットのビットを知るためにフォールトをキャッチすることは疑いありません(ただの理論です)。おそらくそれは他のアクセス違反も食っているでしょう。

+0

Vistaビデオメモリの初めは仮想化されています。これは、アプリケーションの例外と関連付けるべきではありません。少なくともAeroが有効かどうかは、Windowsメッセージの例外処理で何も変更しません。 –

+0

あなたはそうです。例外は、デスクトップ合成が有効かどうかに関係なく削除されます。 –

0

ベクターの例外処理機能を使用することができます。他のすべての種類の例外より優先されます。私の例では、正しく、WM_PAINTメッセージでアクセス違反を検出しました。残念なことに、他のすべての種類の例外もキャッチします。例外コードをチェックすることで解決する必要があります。

関連する問題