cdecl

またもや時間が空いてしまった日記&久方ぶりのなでしこの話題。
 
なでしこではDLLを呼び出す時に呼び出し規約の指定が出来ません。
stdcallしかないのです。
つまりSHIORIとか呼び出せません。無理矢理呼び出すと変なところでエラーが出ます。
そこでこれ、cdeclで呼び出すサンプル。
でも、これと大差ないので、プログラム掲示板に投稿するのは気が引ける。
だから、ここで公開。

●VirtualAlloc({参照渡し}lpAddress,dwSize,flAllocationType,flProtect)=DLL("kernel32.dll",
"LPVOID VirtualAlloc(
LPVOID lpAddress,
int dwSize,
DWORD flAllocationType,
DWORD flProtect
)")
●VirtualFree({参照渡し}lpAddress,dwSize,dwFreeType)=DLL("kernel32.dll",
"BOOL VirtualFree(
LPVOID lpAddress,
int dwSize,
DWORD dwFreeType
)")
●MoveMemory({参照渡し}d,{参照渡し}s,l)=DLL("kernel32.dll",
"VOID RtlMoveMemory(
LPVOID Destination,
LPVOID Source,
int Length
)")
●GetProcAddress(hModule,{参照渡し}lpProcName)=DLL("kernel32.dll",
"DWORD GetProcAddress(
HMODULE hModule, // DLL モジュールのハンドル
LPCSTR lpProcName // 関数名
)")
●LoadLibrary(lpFileName)=DLL("kernel32.dll",
"HMODULE LoadLibraryA(
LPCTSTR lpFileName
)")

!MEM_COMMIT=$1000
!MEM_RELEASE=$8000
!PAGE_EXECUTE_READWRITE=$40
!NULL = 0
!変数宣言が必要

●AddBinary({参照渡し}target,value,size)
 MoveMemory(target,POINTER(value),size)
 target=target+size

●CallFuncPtr(pfunc,params,count)
 pbinarycodeとは整数
 pcとは整数
 もし、countが(-1)ならば、count=paramsの要素数
 
 pbinarycode=VirtualAlloc(NULL,256,MEM_COMMIT,PAGE_EXECUTE_READWRITE)
 pc=pbinarycode
 AddBinary(pc,$55,1)        //push edp
 count 回
  AddBinary(pc,$68,1)
  AddBinary(pc,TOINT(params[count-回数]),4) //push TOINT(params[count-回数])
 
 AddBinary(pc,$B8,1)
 AddBinary(pc,pfunc,4)       //mov eax,pfunc
 AddBinary(pc,$D0FF,2)       //call eax
 AddBinary(pc,$C483,2)
 AddBinary(pc,count*4,1)        //add esp,count*4
 AddBinary(pc,$5D,1)        //pop edp
 AddBinary(pc,$C3,1)       //ret
 EXEC_PTR(pbinarycode,0,「」,「DWORD」)

#サンプル
!変数宣言が不要
ハンドルはLoadLibrary("crtdll.dll")
関数ポインタはGetProcAddress(ハンドル,"strcat")
メッセージ0=「1番目{\0}        」
メッセージ1=「2番目」
引数はPOINTER(メッセージ0)&改行&POINTER(メッセージ1)
CallFuncPtr(関数ポインタ,引数,2)
表示
メッセージ0を表示
POINTER(メッセージ0)を表示