В общем, не помню, как оно правильно называется, ... как в printf.
Есть допустим функция int some_cool_printf(const char* format, ...).
Сорцов нет, версии с va_args нет, я хочу сделать прокладку типа:
int some_cool_printf(const char* format, ...) // my version of some_cool_printf
{
// do something with argsauto orgSomeCoolPrint = getOrgSomeCoolPrint();
return orgSomeCoolPrint(...);
}
// ...
Просто так это не сделать, насколько помню. Тут, по идее, выручил бы не вызов, а переход по адресу some_cool_printf. Ну, и with_log_some_cool_printf должна быть declspec(naked) или как-то так.
Интересует Win32/64, и MSVC, но и про более общие решения было бы интересно узнать.
Вроде бы declspec(naked) нет в x64, не?
Асма вроде точно в x64 нет, да?
А что если тупо goto вкорячить, прокатит?
goto some_cool_printf;
Или через какие-то setjump'ы извращаться?
Или вручную нагенерить инструкции перехода? Как это правильно сделать? Может, есть что-то подобное готовое?
Здравствуйте, пффф, Вы писали:
П>В общем, не помню, как оно правильно называется, ... как в printf.
П>Есть допустим функция int some_cool_printf(const char* format, ...). П>Сорцов нет, версии с va_args нет, я хочу сделать прокладку типа:
Не очень понятно чего там у тебя нет, ты бы все-таки почитал про va_args.
Здравствуйте, pva, Вы писали:
П>>Есть допустим функция int some_cool_printf(const char* format, ...). П>>Сорцов нет, версии с va_args нет, я хочу сделать прокладку типа: pva>Не очень понятно чего там у тебя нет, ты бы все-таки почитал про va_args.
Я читал про va_args.
Как оно мне поможет, если я хочу перехватить функцию с элипсисом, и при этом у оригинальной функции нет версии с va_args
Re[2]: Как правильно перехватить аргумент элипсис?
Здравствуйте, CreatorCray, Вы писали:
П>>Интересует Win32/64, и MSVC, но и про более общие решения было бы интересно узнать.
CC>Тебе ж уже в С++ ответили и с вариадиками и с __VA_ARGS__
Это сработает, только если я имею сорцы. Мне же ещё хочется сделать свою прокладку между чужим собраным кодом и чужой собранной либой
Re[3]: Как правильно перехватить аргумент элипсис?
Здравствуйте, пффф, Вы писали:
П>Мне же ещё хочется сделать свою прокладку между чужим собраным кодом и чужой собранной либой
либа тут .lib или же .dll?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Как правильно перехватить аргумент элипсис?
Здравствуйте, пффф, Вы писали:
П>Я читал про va_args. П>Как оно мне поможет, если я хочу перехватить функцию с элипсисом, и при этом у оригинальной функции нет версии с va_args
Тогда прийдется похачить, наподобие
Здравствуйте, CreatorCray, Вы писали:
П>>Мне же ещё хочется сделать свою прокладку между чужим собраным кодом и чужой собранной либой CC>либа тут .lib или же .dll?
dll. Но и про вариант с lib тоже интересно
Re[4]: Как правильно перехватить аргумент элипсис?
Здравствуйте, pva, Вы писали:
pva>Тогда прийдется похачить, наподобие
Да, спс, как-то так наверно и буду делать
pva>Сделать свой ручной jmp, порешать вопросы со стеком и будет тебе счастье.
А какие вопросы могут быть со стеком? Локальные переменные?
А если, допустим, в перехватчике some_func я просто вызываю log_some_func и потом сразу jump? В примере там вроде без локальных переменных, шаманить со стеком ничего не нужно вроде?
void some_func(a,b,c)
{
log_some_func(a,b,c);
// jump here
}
Re[5]: Как правильно перехватить аргумент элипсис?
Здравствуйте, пффф, Вы писали:
pva>>Тогда прийдется похачить, наподобие П>Да, спс, как-то так наверно и буду делать
pva>>Сделать свой ручной jmp, порешать вопросы со стеком и будет тебе счастье. П>А какие вопросы могут быть со стеком? Локальные переменные? П>А если, допустим, в перехватчике some_func я просто вызываю log_some_func и потом сразу jump? В примере там вроде без локальных переменных, шаманить со стеком ничего не нужно вроде?
Если правильно помню то для элипсисов за стек отвечает вызывающая функия. Но твоя прокси-функция не naked и в прологе может изменять состояние стека (например, сохранение регистров). Перед jmp [originalFn] тебе нужно привести стековый указатель в корректный вид. Как скомпилишь свой код — посмотри дизазсм и дальше уже корректируй как нужно.
newbie
Re[5]: Как правильно перехватить аргумент элипсис?
Здравствуйте, пффф, Вы писали:
П>Здравствуйте, CreatorCray, Вы писали:
П>>>Мне же ещё хочется сделать свою прокладку между чужим собраным кодом и чужой собранной либой CC>>либа тут .lib или же .dll?
П>dll. Но и про вариант с lib тоже интересно