XPで動いているシステムがあって、どうしても、その中で動いているDLLの新版を入れたいとする。そのDLLを呼び出すプログラムは、VC++6で遥か昔に作られたものだ。2010と2012しか無い。ここでランタイムをDLLとしてリンクするとすごく嫌なことが起きそうな気がする。かたやMSVCRT.dllをロードし、こちらはMSVCR10.DLLをロードする。競合はしないとは思うが(関数名の前のモジュール名が異なる)、ランタイムのバージョンが合わないというのはいかにも危なそうな匂いがする。2010でランタイムを静的にリンクすれば、mallocしたポインタをモジュールをまたがったところでfreeしたり、FILE*の交換などしなければ、気持ち的には安全なように思う。C++2010で静的ランタイムライブラリとリンクしてDLLを作ってインストールしたとする。127(ERROR_PROC_NOT_FOUND)でエラーとなる。APIを呼んでいるからだ。XPのKernel32.dllには、そういう関数は無い。そのため解決できずにロードエラーとなる。調べると、EncodePointerというように、exploit対策のためのポインタ曖昧化APIなのだった。crtのソースを読むと、なるほど、onexitポインタのように、いかにも固定化しているとやばそうなポインタを曖昧化している。やることをやっているんだなぁと、ちょっと感動した。XPとか使ってはいかんよなぁという後ろめたい気持ちも生じるのであった。面倒なのでやらないが、やってみるとどうなるか知りたいこと。EncodePointerで曖昧化したポインタをDecodePointerせずに踏むと、どういうエラーが表示(あるいはログ出力)されるのだろうか。violation)した。world(ptr.exeは動作を停止しましたダイアログを表示)追記:エンコードしたポインタへジャンプすることを想定しているのではなく、ダンプから取得した値へジャンプするライブパッチを作らせないことが目的なんだから、これで良いのだった。