AMD64のNo Execute機能
さて、AMD Athlon64を導入すると困ることがひとつあります。それはWindows XP SP2でNo Execute機能がOnにされた時に発生します。
No Execute機能とは簡単に言うと、これまで区別されていなかった、データページと実行可能ページをl区別することにより、データページやスタックページに格納されているx86のバイナリ実行コードを実行できなくしてしまうという機能です。これでバッファーオーバーフロー攻撃によりスタック上に作成されたx86コードが実行されなくなります。
この機能はほかにも「データ実行防止 (DEP)」機能とか「拡張ウィルス防止(EVP)機能」など、いろいろな呼び方をされています。
MS TechNet Windows XP SP2の情報
http://www.microsoft.com/japan/technet/prodtechnol/winxppro/maintain/sp2mempr.mspx
Windows XP SP2で採用されたDEPの仕組み
http://www.atmarkit.co.jp/fsys/kaisetsu/045dep/dep.html
拡張ウィルス防止機能(Enhanced Virus Protection)
http://www.amd.com/jp-ja/Weblets/0,,7832_11104_11105,00.html
エグゼキュート・ディスエーブル・ビット機能
http://www.intel.com/jp/business/bss/infrastructure/security/xdbit.htm
ただ、ご想像のとおり、この機能は"普通のデータセグメント上でx86コードを実行していると思われる"エミュレータや、Just In Time Compileを行っているJava VM、.NET Frameworkなどに影響を与えるものと思います。
そして、eMbedded Visual C++ 4.0やPlatform Builder 4.xでは、CE.NETのエミュレータが実行できなくなってしまうのです。
エミュレータドライバ vpcappsv.sys が動かないときの通知
さて、この通知をクリックすると以下のページに誘導されます。
Windows CE 4.x Emulator does not work correctly if you have PAE mode enabled
http://support.microsoft.com/default.aspx?scid=kb;en-us;883989
実際には/PAEスイッチではなく/NOEXECUTEスイッチなのですが、いずれにしてもエミュレータは動かなくなります。
さて、その回避方法ですが、以下の
Windows XP SP2 のデータ実行防止機能の詳細
http://support.microsoft.com/default.aspx?scid=kb;ja;875352
に書いてあるように、Windows XPの起動オプションに/EXECUTEフラグを付けると、(No Execute機能は無効になりますが)CE.NETエミュレータは実行できるようになります。フラグをつけないと中間モードともいえる、"次のプログラムを除くすべてのプログラムでハードウェアおよびソフトウェアによる DEP を有効にする"モードになるのですが、問題なのが.SYSドライバであるからか、このモードでエミュレータを動かすことはできませんでした。
一方、プログラム的に問題ないようにする方法ももちろん紹介されていて、簡単に言えばVirtualAllocやVirtualProtectで新設されたフラグPAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、または PAGE_EXECUTE_WRITECOPYを使用するという話です。
ちなみに、Windows CE 5.0のエミュレータ(マイクロソフト製とクレジットされている)はちゃんと対策されているようで、/EXECUTEなどのOS起動オプションをつけなくても問題なく使用できました。
Windows CE 5.0のエミュレータ