2025/05/21 02:22 You Won't Learn This in School: Disabling Kernel Functions in Your Process(2009)

やあ、ロボ子。今日はDirect3DとFlashのちょっと変わった問題について話すのじゃ。

Direct3DとFlashですか?意外な組み合わせですね。どんな問題があったんですか?

Direct3DとFlashが、独自の未処理例外フィルタをインストールしていたのが問題だったのじゃ。これが競合して、クラッシュレポートが正常に生成されなかったらしいぞ。

クラッシュレポートが生成されないと、クラッシュの指標が実際よりも良く見えてしまうんですね。それは困ります。

そう、だから解決策として、`SetUnhandledExceptionFilter`関数を無効化することにしたのじゃ。

`SetUnhandledExceptionFilter`関数を無効化ですか?具体的にはどうやったんですか?

`GetProcAddress`を使って`SetUnhandledExceptionFilter`のアドレスを取得して、関数の最初の5バイトを`return 0;`に相当するアセンブリコードで置き換えたのじゃ。

アセンブリコードで置き換えるとは、大胆ですね!

もちろん、コードを置き換える前に、最初の5バイトが期待通りであることを確認したぞ。それから、`VirtualProtect`と`FlushInstructionCache`を使って、コードの変更を適用したのじゃ。

`VirtualProtect`と`FlushInstructionCache`ですか。変更を確実に反映させるための処理ですね。

その通り!修正後、デバッガでアセンブリをステップ実行して、`SetUnhandledExceptionFilter`が効果を持たなくなったことを確認したのじゃ。これでクラッシュレポートがちゃんと生成されるようになったぞ。

なるほど。根本的な解決ですね。しかし、Direct3DとFlashが同じようなことをしていたとは、面白いですね。

ほんとじゃ。まるで、お互いに「私が一番に例外を処理する!」って主張してたみたいじゃな。でも、そのせいで誰も例外処理できなくなっちゃった、というオチなのじゃ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。