Я использую следующие типы для создания новой функции во время выполнения:
typedef int (*pfunc)(int);
union funcptr {
pfunc x;
byte* y;
};
Это позволяет мне писать инструкции в y
и затем вызовите функцию следующим образом:
byte* p = (byte*)VirtualAllocEx(GetCurrentProcess(), 0, 1<<16, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
// Write some instructions to p
funcptr func;
func.y = p;
int ret = func.x(arg1); // Call the generated function
Крайне важно знать, как C ++ подготавливает аргументы (соглашение о вызовах), поэтому я просмотрел свойства проекта (Visual C ++) и вижу, что он использует __ cdecl
. Он должен помещать аргументы в стек в соответствии с: http://msdn.microsoft.com/en-us/library/aa271989 (v = vs.60) .aspx и http: // en.wikipedia.org/wiki/X86_calling_conventions#cdecl, но когда я смотрю на сгенерированную сборку, аргумент перемещается в регистр EAX.
Я хочу быть абсолютно уверенным в том, как подготовлены аргументы. Так что я что-то упустил из виду cdecl
или Visual C ++ оптимизирует вызов, и если да, как мне убедиться, что этого не произойдет?
С уважением, Лассе Эспехольт