Windows XP における access violation その2
2006年11月15日
現在のSFC mini (ver 0.4b)では、Windows XP sp2でマシン語が使えない(コールバック関数については、左記の記事にも書いたが解決済み)。Window Procedureにマシン語を用いているので、これが使えないとつらいところである。
いろいろとトライした結果、分かったのは次の通り。Windows XP sp2において、
1)データ領域に書かれたコードを実行しようとすると、Access Violationが起こる。
2)コード領域の内容を読み書きしようとすると、Access Violation が起こる。
このうち、2)については、少なくともデバッガはコード領域の内容を読み出すことに成功しているわけだから、何かしらのAPIを事前に呼び出せば、読み出すことは出来るはずである。ただし、デバッガは他のアプリケーションに与えられないアクセス権限を有している可能性があり、COM サーバの権限ではこれは出来ないかもしれない。書き込むなど、ご法度のような気もする。
これはsp2の設計上そういう設定になっているのか、私の技量が及ばないだけなのか分からないが、結論としては SFC Mini では別のアプローチを取ることにした。
1)あらかじめ、別のdllを用意しておき、まずそれをファイルとして開いてマシン語を挿入する。
2)書き換えたdllを取り込んで、コードを実行する。
これで、万事うまく行った。結果としては、この対処方法がベストのような気がする。次期配布のSFC miniは、βをとってver1.0にするかもしれない。
061116 追記
この現象は、「データ実行防止(DEP:Data Execute Prevention)」と呼ばれる機能らしい。最新のプロセッサではこの機能が使えるようになっており、それが原因であった。現に、WSH に対しては DEP をOFFにするように指定すると、ver 0.4 の SFC mini でも実行できることを確認した。
いろいろとトライした結果、分かったのは次の通り。Windows XP sp2において、
1)データ領域に書かれたコードを実行しようとすると、Access Violationが起こる。
2)コード領域の内容を読み書きしようとすると、Access Violation が起こる。
このうち、2)については、少なくともデバッガはコード領域の内容を読み出すことに成功しているわけだから、何かしらのAPIを事前に呼び出せば、読み出すことは出来るはずである。ただし、デバッガは他のアプリケーションに与えられないアクセス権限を有している可能性があり、COM サーバの権限ではこれは出来ないかもしれない。書き込むなど、ご法度のような気もする。
これはsp2の設計上そういう設定になっているのか、私の技量が及ばないだけなのか分からないが、結論としては SFC Mini では別のアプローチを取ることにした。
1)あらかじめ、別のdllを用意しておき、まずそれをファイルとして開いてマシン語を挿入する。
2)書き換えたdllを取り込んで、コードを実行する。
これで、万事うまく行った。結果としては、この対処方法がベストのような気がする。次期配布のSFC miniは、βをとってver1.0にするかもしれない。
061116 追記
この現象は、「データ実行防止(DEP:Data Execute Prevention)」と呼ばれる機能らしい。最新のプロセッサではこの機能が使えるようになっており、それが原因であった。現に、WSH に対しては DEP をOFFにするように指定すると、ver 0.4 の SFC mini でも実行できることを確認した。