Не изменять oldtick
!
Вы должны сохранить его только один раз, а затем
// accelerating time by factor of "factor"
return oldtick + (realtick - oldtick) * factor;
EDIT:
Другая возможная проблема заключается в том, что GetTickCount
(по крайней мере, на моем компьютере, XP 32bit) не имеет стандартной преамбулы с возможностью подключения:
8B FF mov edi, edi
55 push ebp
8B EC mov ebp, esp
Без этого его можно подключить только из IAT, и это должно быть сделано для каждого вызывающего его модуля. Я подозреваю, что DetourFunction
работает на процесс, поэтому он перехватывает API, используя преамбулу.
Чтобы решить эту проблему, вы можете попробовать подключить IAT каждого модуля или исправить его вручную, но тогда вы не сможете вызвать исходную версию, пока она подключена.
EDIT2 : использование перехода является наиболее распространенным способом, но это означает, что мы должны перезаписать 5 байтов в начале функции. Это главная проблема не в размере функции, а в ее коде в начале. Конечно, все может быть перезаписано, но если вы хотите иметь возможность вызывать старую функцию при включенном хуке (как в этом вопросе), то вы должны знать, что вы перезаписываете.
Вы не хотите перезаписывать половину кода операции, и вам нужно выполнить перезаписанную часть. Это означает, что в общем случае вам понадобится полный дизассемблер для этого.
Чтобы упростить это, большинство функций начинается с дополнительной 2-байтовой NOP: mov edi, edi
, так что их преамбула имеет 5 байтов, которые являются стандартными и легко перемещаемыми.