DynCall on Windows 8.1

DynCall 0.8をWindows 8.1で使う場合の注意。というか覚書。

x86 Buildした限り、Compileはうまくいくけど、testのthunkがheapで失敗する。

00939EA8  nop  
00939EA9  nop  
00939EAA  nop  
00939EAB  mov         eax,939EA8h  
00939EB0  jmp         dword ptr [eax+0Ch]  

とか、こんな感じでgenerateした code呼び出しのところで落ちてる。

DCThunk構造体をmallocで確保したメモリーに対して構築して動的関数呼び出しを行っているのだが、
mallocで確保したメモリーではコードの実行が許可されていないためにSegmentation Faultで落ちて
どうやってもこのテストは成功しません。DEPを切れば行ける気もしますが、DEPが無効にできなかったっす。

Windows環境では ページに読み書き+実行属性付のメモリーを確保してやらなければならない。
これは VirtualAllocを使って実現できる。
DynCallで dcAllocWX/dcFreeWXが用意されており、これが内部的にVirtualAllocを使ってくれるので これを使う。
dcAllocWX/dcFreeWXのテストは問題無く実行できているのでこのテストはFailしていても特に気にしないで良い。

Leave a Reply

Your email address will not be published. Required fields are marked *