Submit Search
Upload
SEH on mingw32
•
0 likes
•
2,186 views
K
kikairoya
Follow
Boost #8 SEH on mingw32
Read less
Read more
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 37
Download now
Download to read offline
Recommended
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
egtra
Boost.勉強会 #21 札幌の発表時のスライドです。Visual C++のコード分析機能で使われるSALの導入的な説明です。
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
Boost.Asio を読みやすくする。
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
歌舞伎座.tech#8「C++初心者会」 http://kbkz.connpass.com/event/13905/ での @Ryosuke839 の発表スライドです。
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
Boost.勉強会 #8 中3女子が狂える本当に気持ちのいい constexpr
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
Boost.勉強会 #7 中3女子でもわかる constexpr
effective modern c++ chapeter36
effective modern c++ chapeter36
Tatsuki SHIMIZU
effective modern c++ chapeter36
Effective modern-c++#9
Effective modern-c++#9
Tatsuki SHIMIZU
effective modern c++ 勉強会(tmpral update)
Recommended
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
egtra
Boost.勉強会 #21 札幌の発表時のスライドです。Visual C++のコード分析機能で使われるSALの導入的な説明です。
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
Boost.Asio を読みやすくする。
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
歌舞伎座.tech#8「C++初心者会」 http://kbkz.connpass.com/event/13905/ での @Ryosuke839 の発表スライドです。
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
Boost.勉強会 #8 中3女子が狂える本当に気持ちのいい constexpr
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
Boost.勉強会 #7 中3女子でもわかる constexpr
effective modern c++ chapeter36
effective modern c++ chapeter36
Tatsuki SHIMIZU
effective modern c++ chapeter36
Effective modern-c++#9
Effective modern-c++#9
Tatsuki SHIMIZU
effective modern c++ 勉強会(tmpral update)
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
Item 16: Make const member functions thread safe. SlideShare でもちゃんと読めるようにちょっとだけ編集しました。
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
発表資料です
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
Item 15: Use constexpr whenever possible. SlideShare でもちゃんと読めるようにちょっとだけ編集しました。
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
Altanative macro
Altanative macro
Motohiro KOSAKI
To explain how to work alternative() macro in Linux kernel.
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
Effective Modern C++ 勉強会 #7 chapter32 発表用スライド
constexpr idioms
constexpr idioms
fimbul
ドワンゴC++勉強会 #1 constexpr idioms
Map
Map
kikairoya
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
intorduction of SSE4.2 string instructions
Async design with Unity3D
Async design with Unity3D
Kouji Hosoda
UnityでHTTP通信をするときに割りと困りがちな非同期処理の設計についてロードオブナイツで使っているデザインを公開します。スライド作成は++c++;の中の人。
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Ohotech 特盛 #10 ( http://ohotech.connpass.com/event/7517/ )で発表した資料です。
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
わんくま同盟 東京勉強会 #110 にて登壇 http://www.wankuma.com/seminar/20180324tokyo110/
llvm入門
llvm入門
MITSUNARI Shigeo
Javascript with Generative Art
Javascript with Generative Art
Shinsuke Matsuda
Javascript with Generative Art
emcjp Item 42
emcjp Item 42
MITSUNARI Shigeo
insertionの代わりにemplacementを検討しよう
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
MITSUNARI Shigeo
2021/11/20 Kernel/VM探検隊online part4 https://kernelvm.connpass.com/event/225573/
ゆるバグ
ゆるバグ
MITSUNARI Shigeo
バグについてゆるく語り合う会
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
MITSUNARI Shigeo
x86/x64のいろんなnop
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
Windows をより安全にする SafeSEH on MinGW
Windows をより安全にする SafeSEH on MinGW
Tsukasa Oi
More Related Content
What's hot
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
Item 16: Make const member functions thread safe. SlideShare でもちゃんと読めるようにちょっとだけ編集しました。
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
発表資料です
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
Item 15: Use constexpr whenever possible. SlideShare でもちゃんと読めるようにちょっとだけ編集しました。
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
Altanative macro
Altanative macro
Motohiro KOSAKI
To explain how to work alternative() macro in Linux kernel.
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
Effective Modern C++ 勉強会 #7 chapter32 発表用スライド
constexpr idioms
constexpr idioms
fimbul
ドワンゴC++勉強会 #1 constexpr idioms
Map
Map
kikairoya
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
intorduction of SSE4.2 string instructions
Async design with Unity3D
Async design with Unity3D
Kouji Hosoda
UnityでHTTP通信をするときに割りと困りがちな非同期処理の設計についてロードオブナイツで使っているデザインを公開します。スライド作成は++c++;の中の人。
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
Ohotech 特盛 #10 ( http://ohotech.connpass.com/event/7517/ )で発表した資料です。
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
信之 岩永
わんくま同盟 東京勉強会 #110 にて登壇 http://www.wankuma.com/seminar/20180324tokyo110/
llvm入門
llvm入門
MITSUNARI Shigeo
Javascript with Generative Art
Javascript with Generative Art
Shinsuke Matsuda
Javascript with Generative Art
emcjp Item 42
emcjp Item 42
MITSUNARI Shigeo
insertionの代わりにemplacementを検討しよう
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
MITSUNARI Shigeo
2021/11/20 Kernel/VM探検隊online part4 https://kernelvm.connpass.com/event/225573/
ゆるバグ
ゆるバグ
MITSUNARI Shigeo
バグについてゆるく語り合う会
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
MITSUNARI Shigeo
x86/x64のいろんなnop
What's hot
(20)
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Altanative macro
Altanative macro
emc++ chapter32
emc++ chapter32
constexpr idioms
constexpr idioms
Map
Map
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
Async design with Unity3D
Async design with Unity3D
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
llvm入門
llvm入門
Javascript with Generative Art
Javascript with Generative Art
emcjp Item 42
emcjp Item 42
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
ゆるバグ
ゆるバグ
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
Viewers also liked
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
Windows をより安全にする SafeSEH on MinGW
Windows をより安全にする SafeSEH on MinGW
Tsukasa Oi
C++ in Embedded Systems
C++ in Embedded Systems
kikairoya
Boost #3 C++ in Embedded Systems
Tr18015
Tr18015
kikairoya
マジシャンズデッド ポストモーテム ~マテリアル編~ (株式会社Byking: 鈴木孝司様、成相真治様) #UE4DD
マジシャンズデッド ポストモーテム ~マテリアル編~ (株式会社Byking: 鈴木孝司様、成相真治様) #UE4DD
エピック・ゲームズ・ジャパン Epic Games Japan
2017年1月21日に行われたライセンシー様向けマテリアル管理勉強会の資料です。(登壇者: 株式会社Byking 鈴木孝司様、成相真治様) 昨年末リリースされたアーケードゲーム「マジシャンズデッド」のマテリアル作成に関して、アーティスト、エンジニアの両サイドから説明をしていただきました。非常に貴重な情報を提供していただき、ありがとうございます。 マジシャンズデッド公式サイト http://magiciansdead.jp/players/
Unreal Engine 4のビジュアルスクリプトシステム”Blueprint”を使ったMod制作Tipsのご紹介
Unreal Engine 4のビジュアルスクリプトシステム”Blueprint”を使ったMod制作Tipsのご紹介
エピック・ゲームズ・ジャパン Epic Games Japan
2016/12/20に行われたVR Funhouse MODthon 勉強会で使用した資料です。 https://vrtokyo.connpass.com/event/46509/
大規模CSゲームにおけるライトマス運用
大規模CSゲームにおけるライトマス運用
エピック・ゲームズ・ジャパン Epic Games Japan
2016年7月30日に行われたライセンシー様向けライトマス勉強会の資料です。(登壇者: Square Enix: 斎藤修さま) 現在開発中のタイトルで、ライトマスをどのように運用しているか、また注意すべき問題について解説していただきました。
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
エピック・ゲームズ・ジャパン Epic Games Japan
2017年1月21日に行われたライセンシー様向けマテリアル管理勉強会の資料です。(登壇者: Epic Games Japan 篠山範明) マテリアルとマテリアルインスタンスの内部の仕組み(シェーダ保有の有無)と、それによって生じる落とし穴について説明しております。
Viewers also liked
(8)
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
Windows をより安全にする SafeSEH on MinGW
Windows をより安全にする SafeSEH on MinGW
C++ in Embedded Systems
C++ in Embedded Systems
Tr18015
Tr18015
マジシャンズデッド ポストモーテム ~マテリアル編~ (株式会社Byking: 鈴木孝司様、成相真治様) #UE4DD
マジシャンズデッド ポストモーテム ~マテリアル編~ (株式会社Byking: 鈴木孝司様、成相真治様) #UE4DD
Unreal Engine 4のビジュアルスクリプトシステム”Blueprint”を使ったMod制作Tipsのご紹介
Unreal Engine 4のビジュアルスクリプトシステム”Blueprint”を使ったMod制作Tipsのご紹介
大規模CSゲームにおけるライトマス運用
大規模CSゲームにおけるライトマス運用
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
Similar to SEH on mingw32
0x300
0x300
geek_alice
Objc lambda
Objc lambda
matuura_core
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
x86とコンテキストスイッチ
x86とコンテキストスイッチ
Masami Ichikawa
第1回 x86勉強会の発表資料
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
洋史 東平
Rubyの先祖でありながら、いまいちマイナーな存在であるプログラミング言語CLUの紹介です。合わせて日本で唯一CLUを使い続けた、東京工業大学理学部情報科学科木村泉研究室の取り組みについて簡単に触れます。
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
xv6から始めるSPIN入門
xv6から始めるSPIN入門
Ryousei Takano
カーネル/VM勉強会 第2回OS基礎(xv6)
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
JJUG CCC 2017 Spring の発表スライドです。Haskell 互換なふたつの JVM 言語 Frege と Eta について、モナドを利用した Java ライブラリ呼び出しの技法を解説します。 関連ブログ記事 : http://ccvanishing.hateblo.jp/entry/2017/05/21/150903
Buffer overflow
Buffer overflow
ionis111
とっとるびー第9回の資料 基本的な事ばかり並べてみました。 詳細は、「HACKING:美しき策謀」や解説サイトを見た方が良いですよ!
Lxc cf201207-presen
Lxc cf201207-presen
Kouhei Maeda
再lxcの話
初めてのCPUを作ってみた
初めてのCPUを作ってみた
Eric Sartre
2/16にカーネル/VM探検隊@関西で発表した内容です。初めてのCPUを作ってみた。でもそのCPUはちょっと変わってて…?
Ilerpg Study 004
Ilerpg Study 004
Yoshiki Ushida
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)
Kota Mizushima
Scalaの限定継続の応用と基本について、高橋メソッド風味で説明したスライドの改訂版です。元のスライドの修正が反映されないため、新しいスライドとした上げ直しました。
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本
Kota Mizushima
Scalaの限定継続の応用と基本を高橋メソッド風味で説明したプレゼンです。
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
Hirotaka Kawata
Open Design Computer Project の説明を、FPGA ボードでプレゼンした。
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
KamezawaHiroyuki
9/6(土)に行われた第4回コンテナ型仮想化の情報交換会で使用した資料です
入門 シェル実装
入門 シェル実装
Yusuke Sangenya
開発者にとってシェルが必要不可欠なものであることは論を俟ちませんが、当たり前の存在すぎてこれがどのように実現されているのかを知る機会はあまりないと思います。本トークでは、シェルがどのように実現されているのかを、実際にシェルを実装する過程を通じてお話しします。 ※ もともとのトークのタイトルは「入門 シェル」でしたが,わかりやすさのため「入門 シェル実装」にタイトルを変更しています.
Similar to SEH on mingw32
(20)
0x300
0x300
Objc lambda
Objc lambda
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
x86とコンテキストスイッチ
x86とコンテキストスイッチ
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
xv6から始めるSPIN入門
xv6から始めるSPIN入門
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
Buffer overflow
Buffer overflow
Lxc cf201207-presen
Lxc cf201207-presen
初めてのCPUを作ってみた
初めてのCPUを作ってみた
Ilerpg Study 004
Ilerpg Study 004
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
入門 シェル実装
入門 シェル実装
SEH on mingw32
1.
SEH on Mingw32
Boost.勉強会 #8 大阪 @kikairoya (Tomohiro Kashiwada)
2.
発表者について ● 名前:
@kikairoya ● 南九州から来ました ● もうすぐ大阪人になります ● 触手の下僕として働くことになりました ● C++ とか出来ます
3.
喋ること ● SEH(構造化例外)
とは ● SEH ライブラリ実装の解説
4.
喋ること ● SEH(構造化例外)
とは ● SEH ライブラリ実装の解説 ● Boostはいつも通り出てきません
5.
…その前に ● https://gist.github.com/1710310
を開いて おいてください。 ● スライドにコードを表示するのはちょっと無理があ りました
6.
SEH(構造化例外)とは ● Windowsシステムが使用する例外処理の方法
● 主にCPUのハードウェア例外を扱う ● ぬるぽとか ● divide by zero とか ● 一部システムAPIがソフトウェア例外を投げる ● HeapAllocとか ● UNIX クローンの非同期シグナルに相当
7.
SEHのシンタックス ● __except
を使う場合 __try { /* try block */ } __except (filter-expr) { /* except block */ } ● __finally を使う場合 __try { /* try block */ } __finally { /* finally block */ }
8.
SEHの処理手順 ● 関数呼び出しごとに例外ハンドラを登録
● 例外処理(ハンドラの呼び出し)は二段階 ● まずはスタックをどこまで巻き戻すか探索 __exceptのフィルタ式を呼び出して判定 ● 巻き戻し先が決まってから実際に巻き戻す finally blockをスタックの先端から順に実行
9.
例外ハンドラの登録 ● 関数呼び出しごとに例外ハンドラを登録
● 例外処理(ハンドラの呼び出し)は二段階 ● まずはスタックをどこまで巻き戻すか探索 __excpetのフィルタ式を呼び出して判定 ● 巻き戻し先が決まってから実際に巻き戻す finally blockをスタックの先端から順に実行
10.
例外ハンドラの登録 ● EXCEPTION_REGISTRATION構造体をスタッ
ク上に構築 ● prev メンバに[fs:0]の値をコピー ● [fs:0]に構造体のアドレスをコピー struct EXCEPTION_REGISTRATION { EXCEPTION_REGISTRATION *prev; PEXCEPTION_HANDLER handler; unsigned char user_data[VAR_LENGTH]; };
11.
スタックの構造 fn2のローカル変数 fn2のer.prev
fn2のer.handler fn1のフレームポインタ fn2からの戻りアドレス fn2の引数 fn1のローカル変数 fn1のer.prev fn1のer.handler fn0のフレームポインタ fn1からの戻りアドレス fn1の引数 esp [fs:0] ebp
12.
巻き戻し先の探索 ● 関数呼び出しごとに例外ハンドラを登録
● 例外処理(ハンドラの呼び出し)は二段階 ● まずはスタックをどこまで巻き戻すか探索 __exceptのフィルタ式を呼び出して判定 ● 巻き戻し先が決まってから実際に巻き戻す finally blockをスタックの先端から順に実行
13.
巻き戻し先の探索 例外発生 コンテキストを保存してjmp
kernel呼出し ハンドラ探索 } __except (filter-expr) { ハンドラA ハンドラB ハンドラC call call return 1 call return 1 call filterA filterB filterC call return 0 call return 0 call return 1 探索終了 これ
14.
SEHの実現方法 ● 関数呼び出しごとに例外ハンドラを登録
● 例外処理(ハンドラの呼び出し)は二段階 ● まずはスタックをどこまで巻き戻すか探索 __exceptのフィルタ式を呼び出して判定 ● 巻き戻し先が決まってから実際に巻き戻す finally blockをスタックの先端から順に実行
15.
巻き戻し実行 ハンドラA ハンドラB
ハンドラC RtlUnwind call return 1 call return 1 call finally blockの実行 call return call return jmp finaly blockの実行 ハンドラCの続きexcept blockの実行 正常処理に復帰 jmp
16.
構造化例外のライブラリ実装 ● GCCでもSEH使いたい
● VC++と互換性のある構文を目指して → __try, __except, __finallyのキーワードを 魔クロで乗っ取る ● もちろんデストラクタも呼びたい → 黒魔術の山
17.
黒魔術っぽいところだけ解説 ● setjmp/longjmp
● filterの呼出し ● RtlUnwindの呼出し ● スタックの巻き戻し
18.
黒魔術っぽいところだけ解説 ● setjmp/longjmp
● filterの呼出し ● RtlUnwindの呼出し ● スタックの巻き戻し
19.
setjmp/longjmp ● setjmp/longjmpを使ってスタックを縦横無尽に駆
け回る ● msvcrtのsetjmp/longjmpは内部でSEHを使う ● __builtin_longjmpは1しか返せない → 自前実装
20.
黒魔術っぽいところだけ解説 ● setjmp/longjmp
● filterの呼出し ● RtlUnwindの呼出し ● スタックの巻き戻し
21.
filterの呼出し ● EXCEPTION_REGISTRATIONにfilterをwrapした
lambda-expressionを保存 ● lambda-exprがローカル変数をキャプチャしている ため、例外ハンドラから直接呼び出せる ● C++98で実現するにはsetjmp/longjmpでスタック を行き来する必要がある → コールスタックをどこまで壊すか予測不可能な ため非現実的
22.
黒魔術っぽいところだけ解説 ● setjmp/longjmp
● filterの呼出し ● RtlUnwindの呼出し ● スタックの巻き戻し
23.
RtlUnwindの呼出し void WINAPI
RtlUnwind( PVOID TargetFrame, PVOID TargetIp, PEXCEPTION_RECORD ExceptionRecord, PVOID ReturnValue ); ● TargetFrameに巻き戻し先の EXCEPTION_REGISTRATION を指定 ● TargetIpに巻き戻し完了後の復帰点を指定 ● 残りはnullptr
24.
RtlUnwindの呼出し ● ライブラリ関数のクセにcallee-saveレジスタを破
壊する曲者 ● 呼んだ後にesi/ediがクリアされている ● callで呼ばれる前提のクセに戻りアドレスを引数 で指定する必要がある ● GCCの拡張インラインアセンブラで破壊レジスタ を指定して対処
25.
RtlUnwindの呼出し asm volatile
( "pushl $0nt" // ReturnValue "pushl $0nt" // ExceptionRecord "pushl $1fnt" // TargetIp "pushl %0nt" // TargetFrame "call _RtlUnwind@16nt" "1: nopnt" : : "a"(reg) : "ecx", "edx", "ebx", "esi", "edi", "esp", "cc", "memory" );
26.
黒魔術っぽいところだけ解説 ● setjmp/longjmp
● filterの呼出し ● RtlUnwindの呼出し ● スタックの巻き戻し
27.
スタックの巻き戻し ● 実装のキモ
● finally blockの実行とデストラクタの呼出しを行 う必要がある ● __finallyだけなら__tryでsetjmp した地点に longjmp するだけ ● デストラクタを呼ぶにはC++例外を投げる必要 がある
28.
巻き戻し実行(/EHsc相当) ハンドラA ハンドラB
ハンドラC RtlUnwind call return 1 call return 1 call finally blockの実行 call return call return jmp finaly blockの実行 ハンドラCの続きexcept blockの実行 正常処理に復帰 jmp
29.
スタックの巻き戻し(C++例外) ● ebpを操作して例外発生地点からthrowしたかの
ように振舞う ● 2段目以降のフレームでは、下位フレームの try block終了地点で例外が発生したかのように 振る舞う ● Leaf-functionのデストラクタを正しく呼び出すた めに-fnon-call-exceptionsが必須
30.
スタックの巻き戻し(throw) void throw_seh_unwinder(const
seh_jmp_buf &b) { asm volatile ( "movl %0, %%ebpnt" // フレームポインタを切り替え "pushl %1nt" // 戻りアドレスの偽装 "jmp _throw_seh_unwinder" // call : : "r"(b.ebp), "a"(b.eip), "b"(b.ebx), "S"(b.esi), "D"(b.edi) : "memory"); __builtin_unreachable(); } extern "C" void throw_seh_unwinder() { // 例外発生地点から呼ばれているように見える throw seh_unwinder(); }
31.
巻き戻し実行(/EHa相当) ハンドラA ハンドラB
ハンドラC RtlUnwind call return 1 call return 1 call 例外発生地点から例外を投 げてtry blockでcatch jmp jmp jmp jmp jmp 直前のtry blockから例外を 投げてtry blockでcatch 直前のtry blockから例外を 投げてtry blockでcatch 正常処理に復帰 jmp ハンドラCの続き
32.
巻き戻し実行 (/EHa相当) 3段目のハンドラ:
*1からthrow して*2でcatch そのままfinally block を実行 *3からハンドラにlongjmp 2段目のハンドラ: *3からthrow して*4でcatch そのままfinally block を実行 *5からハンドラにlongjmp 1段目のハンドラ: *5からthrow して*6でcatch そのままexcept block を実行 *7から正常ルートに復帰 __try { __try { __try { // *1 Access Violation *(int *)0 = 0; } __finally { // *2 } // *3 } __finally { // *4 } // *5 } __except(1) { // *6 } // *7 throw throw throw longjmp longjmp
33.
スタックの巻き戻し(スタック破壊) ● C++例外で巻き戻している間も普通にスタックは
使われる ● 巻き戻すごとにスタックは短くなる(スタックの末 端にある領域は潰される) ● 例外ハンドラのコールスタックは例外発生場所よ り先端側にある ● つまり、スタック破壊が避けられない ● 巻き戻し中はコールスタックをヒープに一時退避
34.
制限事項 ● -fnon-call-exceptionsをつけないとleaf-function
上にあるオブジェクトのデストラクタが呼ばれない ● VC++の/EHaとは互換性が無い ● try blockに出入りするたびにsetjmp/longjmpをす るのでパフォーマンスペナルティがある ● 某ランドの特許に引っかかるかどうか不明
35.
まとめ ● Mingwで動くSEH構文をライブラリで実装した
● longjmp とかインラインアセンブリとか使ってるけ どC++です
36.
まとめ ● Mingwで動くSEH構文をライブラリで実装した
● longjmp とかインラインアセンブリとか使ってるけ どC++です ● C++は黒魔術のない素敵な言語です
37.
おしまい
Download now