(18.03.2012 19:04)Sav Wrote: Похоже, высокоуровневый хук CALL_, EXTENDED_, FASTCALL_ для функции с одним аргументом работает неправильно. При каждом вызове он уменьшает ESP на 4. Если заменить на THISCALL_, то всё нормально.
да, так и есть. Для меня это - само собой, поэтому даже не подумал обратить на это внимание в комментариях. Хотя
Code:
если int __fastcall orig(int a1, int a2, ?) то int __stdcall new_func(HiHook* h, int a1, int a2, ?)
из комментов мною читается однозначно: fastcall c 1 аргументом не поддерживается в EXTENDED_ FASTCALL_.
Действительно, этот недостаток можно обойти используя EXTENDED_ THISTCALL_
Ну а для читабельности и логичности можно использовать пару констант типа:
FASTCALL_1_ = THISCALL_ и FASTCAL_2_ = FASTCALL_
Просто мне не представляется возможным, чтобы хук сам мог определять сколько аргументов передается замещаемой функции, поэтому EXTENDED_ FASTCALL_ всегда пушит и ECX и EDX в стек.
Quote:SPLICE_ хук очень плохо себя ведёт, когда в затираемом им коде содержится локальный переход. Вызов оригинальной функции в этом случае невозможен.
Дело в функциональности MemCopyCode, сейчас она копирует корректно только CALL и далекий JMP опкоды. После твоего поста добавлю поддержку далеких JE, JNE, JL, JG, JLE, JGE, JA, JB, JBE, JNA, ....
Впринципе короткие прыжки можно в замещаемом коде при копировании заменять на длинные, однако тогда скопироавнный код будет длиннее оригинального, что еще добавит работы...
Короче, сделаю в следующем релизе.