Windows ABIの32ビットからx86-64のasmにラッパー関数を移植しようとしています。この関数は、引数として配列としてインデックスを付けることに依存します。Windows x86-64の配列としてargsをインデックスするABI
私はMSVCがX64プロジェクトでインラインアセンブリを実行できないことを知っていますが、同等の機能をX64の.asmファイルに組み込むことに興味があります。
この関数は、呼び出されるAPIのスタックフレームを設定します。
__declspec(naked) PVOID WINAPIV CGX86(FARPROC lpPtr, UINT lpSize, ...)
{
__asm {
push ebp;
mov ebp, esp;
lea eax, [ ebp + 0x04 ];
mov [ ebp - 0x04 ], eax;
mov eax, [ ebp - 0x04 ];
mov ecx, [ ebp + 0x0C ];
add ecx, 2;
ParseArgs:
cmp ecx, 2;
jz short MoveFinal;
push dword ptr [ eax + ecx * 0x04 ];
sub ecx, 1;
jmp short ParseArgs;
MoveFinal:
call [ ebp + 0x08 ];
mov esp, ebp;
pop ebp;
retn;
}
}
使用例:Cでそれを書くために
CGX86((FARPROC)MessageBoxA, 4, GetForegroundWindow(), "BODY", "TITLE", MB_OK);
「ヘルプ」とは、あなたが私たちにあなたのためにそれを書いてほしいということですか? – Jester
残念ながら、これはX64で使用されている呼び出し規約が大きく異なるため、考えているより大きな作業です。最初から完全に書き直さなければならないだろう。 –
@MichaelPetchもしあなたが言ったようにeaxが戻りアドレスを指していて、引数に1つのインデックスを使用するので、最後の引数は 'eax + 3 * 4'を与える' ecx = 3'でしょう。 'ebp + 16'。私は 'プッシュecx'の目的を理解していない。 – Jester