3

The Crash Course といくつかの投稿を読んだ後、非常に基本的なバージョンを実装しました。私の唯一の要件は、例外を「キャッチ」し(スロー/発生させないため、「Win32」のみ)、それを発生させたスレッドを終了できることです。「ExitThread」を呼び出すだけの適切にプロトタイプ化された関数と、それをハンドラー プロパティに含む「EXCEPTION_REGISTRATION」構造体と、前のプロパティに実際の前のハンドルがあります。このハンドラーを設定するために私が行うことは、次の呼び出しです。

BOOL set_my_handler(){
EXCEPTION_REGISTRATION* p_excep = &excep // excep is a global static EXCEPTION_REGISTRATION
__asm{
      mov EAX, p_excep
      mov FS:[0],EAX
 }
 ...
 }

問題: 例外を引き起こしたとき(次のように言う:

* (dword*) 0 = 0;) 

set_my_handler を呼び出したのと同じスコープで、ハンドラーが期待どおりに呼び出されます。しかし、内部ブロックで同じ例外を発生させた場合、それを実行する関数を呼び出すと、機能しません。Unhandled Exception メッセージ ボックスが表示されます。デバッグ中に、内部関数で FS:[0] が同じ (ハンドラーを指している) ままであることに気付きました。ところで、私は何も使用していません(私のコードではtry/catchまたはtry/_except)

私はあなたの助けに感謝します、ありがとう。

私の問題に対する答え( Raymond Chenに感謝): スタック セグメント レジスタに対してその場所を検証するセキュリティ メカニズムがあるため、例外登録エンティティをスタックに割り当てる必要があることがわかりました。

4

0 に答える 0