Commit e6d3e3ac authored by SR_team's avatar SR_team 💬

Remove storing EDX, because I already store all registers

parent 85f31689
......@@ -153,20 +153,16 @@ namespace SRHook {
// Копирование флагов в класс
pusha<uint8_t, uint8_t, uint8_t>( 0x9C, 0x58, 0xA3, &cpu_offset->EFLAGS );
if constexpr ( sizeof...( Args ) ) {
// Копирование аргументов со стека
// Копирование аргументов со стека
for ( int i = sizeof...( Args ) - 1; i >= 0; --i ) {
pusha<uint8_t, uint8_t>( 0x89, 0xE2 ); // mov edx, esp
pusha<uint8_t, uint8_t>( 0x81, 0xC2, stackOffsetBefore + (sizeof...( Args ) - 1) * 4 ); // add edx, offset
push<uint8_t>( 0x52 ); // push edx
for ( int i = sizeof...( Args ) - 1; i >= 0; --i ) {
pusha<uint8_t, uint8_t>( 0x89, 0xE2 ); // mov edx, esp
pusha<uint8_t, uint8_t>( 0x81, 0xC2, stackOffsetBefore + (sizeof...( Args ) - 1) * 4 ); // add edx, offset
push<uint8_t>( 0x52 ); // push edx
}
}
// Вызов обработчика перед оригинальным кодом
pusha<uint8_t>( 0xB9, (uint32_t)this ); // mov ecx, this
auto relAddr = getRelAddr( (size_t)code + codeLength, (size_t)fn2void( &Hook<Args...>::before ) );
pusha<uint8_t>( 0xE8, relAddr ); // call before
if constexpr ( sizeof...( Args ) ) push<uint8_t>( 0x5A ); // pop edx
// Пропуск оригинального кода
pusha<uint8_t, uint8_t>( 0x85, 0xC0 ); // test eax, eax
......@@ -204,20 +200,16 @@ namespace SRHook {
pusha<uint8_t, uint8_t, uint8_t>( 0x9C, 0x58, 0xA3, &cpu_offset->EFLAGS );
// j_after
if constexpr ( sizeof...( Args ) ) {
// Копирование аргументов со стека
// Копирование аргументов со стека
for ( int i = sizeof...( Args ) - 1; i >= 0; --i ) {
pusha<uint8_t, uint8_t>( 0x89, 0xE2 ); // mov edx, esp
pusha<uint8_t, uint8_t>( 0x81, 0xC2, stackOffsetAfter + (sizeof...( Args ) - 1) * 4 ); // add edx, offset
push<uint8_t>( 0x52 ); // push edx
for ( int i = sizeof...( Args ) - 1; i >= 0; --i ) {
pusha<uint8_t, uint8_t>( 0x89, 0xE2 ); // mov edx, esp
pusha<uint8_t, uint8_t>( 0x81, 0xC2, stackOffsetAfter + (sizeof...( Args ) - 1) * 4 ); // add edx, offset
push<uint8_t>( 0x52 ); // push edx
}
}
// Вызов обработчика после оригинального кода
pusha<uint8_t>( 0xB9, (uint32_t)this ); // mov ecx, this
relAddr = getRelAddr( (size_t)code + codeLength, (size_t)fn2void( &Hook<Args...>::after ) );
pusha<uint8_t>( 0xE8, relAddr ); // call after
if constexpr ( sizeof...( Args ) ) push<uint8_t>( 0x5A ); // pop edx
// j_restore
// Восстановление флагов из класса
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment