Портирую старый проект из 6-й студии в 2005(x64).
Проблема такая: есть указатель на ф-цию и буффер, который содержит упакованные параметры этой ф-ции.
Надо ее как-то вызвать в x64.
В шестерке юзается следующий код:
int* pArgsBegin = ...;
int* pArgsEnd = ...;
int* pArg = pArgsEnd; // use __stdcallwhile (pArg > pArgsBegin )
{
int val = *(--pArg );
__asm push val
}
void* functionAddress = ...;
__asm
{
call functionAddress
}
Вот такой хак. Работает на ура.
В 2005-й студии компилится для x86, но не проверял работает ли.
Под x64 не компилится — говорит, что асмовские вставки не супортятся.
Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?
Здравствуйте, kankan, Вы писали:
K>Вот такой хак. Работает на ура. K>В 2005-й студии компилится для x86, но не проверял работает ли. K>Под x64 не компилится — говорит, что асмовские вставки не супортятся.
не супортятся(и похоже будет не скоро) и тип вызова функции всегда __fastcall
K>Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?
Здравствуйте, DTB, Вы писали:
DTB>Здравствуйте, kankan, Вы писали:
K>>Вот такой хак. Работает на ура. K>>В 2005-й студии компилится для x86, но не проверял работает ли. K>>Под x64 не компилится — говорит, что асмовские вставки не супортятся.
DTB>не супортятся(и похоже будет не скоро) и тип вызова функции всегда __fastcall
K>>Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?
DTB>что нибудь вроде
DTB>
упс, с изменяемым количеством параметров могут быть проблемы, в x64 первые 4 параметра идут не через стек, а через регистры, тупо кидать их в стек не выйдет. можно попытаться реализовать через ассемблер, как ниже подсказали, но геморрой еще тот
Здравствуйте, kankan, Вы писали:
K>Дело в том, что неизвесно, что это за функция и какие у нее параметы
даже адреса функции нет? должен быть, тогда взять дизассемблер, раскрутить и посмотреть, что функция из себя представляет. некоторые продвинутые дизассемблеры (например IDA) показывают примерные параметры (тип и кол-во)
Здравствуйте, DTB, Вы писали:
DTB>Здравствуйте, kankan, Вы писали:
K>>Дело в том, что неизвесно, что это за функция и какие у нее параметы
DTB>даже адреса функции нет? должен быть, тогда взять дизассемблер, раскрутить и посмотреть, что функция из себя представляет. некоторые продвинутые дизассемблеры (например IDA) показывают примерные параметры (тип и кол-во)
Вы меня неправильно поняли.
Код, который я привел, работает с кучей функций, и мне не надо их знать — это типа "универсальный" враппер на ф-цию. С его помощью могут вызываются например ф-ции, загруженные GetProcAddress().
Что конкретно вызывает пользователь этого враппера — я хз, у меня есть только указатель на вызываемую ф-цию и ее параметры.
Проблема в том как вызвать эту функцию и передать ей все эти параметры в x64.
Здравствуйте, kankan, Вы писали:
K>Вы меня неправильно поняли. K>Код, который я привел, работает с кучей функций, и мне не надо их знать — это типа "универсальный" враппер на ф-цию. С его помощью могут вызываются например ф-ции, загруженные GetProcAddress(). K>Что конкретно вызывает пользователь этого враппера — я хз, у меня есть только указатель на вызываемую ф-цию и ее параметры. K>Проблема в том как вызвать эту функцию и передать ей все эти параметры в x64.
теперь понял, прошу прощения. тогда похоже только через хард кодинг, брать в руки ассемблер, разбираться как передаются параметры (это хорошо если они однотипные, если нет, то будет сложнее — целочисленные и числа с плавающей запятой передаются в разных регистрах). и ваять код, либо в асме, линковать obj, либо представлять в байткоде в С
еще можно сделать такой тупняк (если количество параметров не огромно):
то бишь для каждого конкретного кол-ва параметров делать соответствующий вызов (по крайней мере работает), хотя может как то и разом туда все передать, в массиве например, у меня не получилось