diff --git a/extensions/tf2/criticals.cpp b/extensions/tf2/criticals.cpp index a013c170..92e75ff2 100644 --- a/extensions/tf2/criticals.cpp +++ b/extensions/tf2/criticals.cpp @@ -88,13 +88,11 @@ bool CriticalHitManager::CreateCriticalDetour() //If TempDetour returns non-zero we want to load something into eax and return this value - //IA32_Test_Rm_Reg(jit, eax, eax, something); - jit->write_ubyte(0x85); - jit->write_ubyte(0xC0); + //test eax, eax + IA32_Test_Rm_Reg(jit, REG_EAX, REG_EAX, MOD_REG); - //JNZ critical_callback+50 - jit->write_ubyte(0x75); - jit->write_ubyte(50-((jit->outptr+1)-jit->outbase)); + //jnz _skip + call = IA32_Jump_Cond_Imm8(jit, CC_NZ, 0); /* Patch old bytes in */ for (size_t i=0; iwrite_ubyte(0xA1); - jit->write_uint32((jit_uint32_t)&g_returnvalue); - + //_skip: + //mov eax, [g_returnvalue] + //ret + IA32_Send_Jump8_Here(jit, call); + IA32_Mov_Eax_Mem(jit, (jit_int32_t)&g_returnvalue); IA32_Return(jit); return true; diff --git a/public/jit/x86/x86_macros.h b/public/jit/x86/x86_macros.h index 1cea3502..30335224 100644 --- a/public/jit/x86/x86_macros.h +++ b/public/jit/x86/x86_macros.h @@ -112,6 +112,7 @@ #define IA32_MOV_REG8_RM8 0x8A // encoding is /r #define IA32_MOV_RM8_REG8 0x88 // encoding is /r #define IA32_MOV_RM_IMM32 0xC7 // encoding is /0 +#define IA32_MOV_EAX_MEM 0xA1 // encoding is #define IA32_CMP_RM_IMM32 0x81 // encoding is /7 #define IA32_CMP_RM_IMM8 0x83 // encoding is /7 #define IA32_CMP_AL_IMM32 0x3C // no extra encoding @@ -784,6 +785,12 @@ inline void IA32_Push_Rm_Disp8_ESP(JitWriter *jit, jit_int8_t disp8) * Moving from REGISTER/MEMORY to REGISTER */ +inline void IA32_Mov_Eax_Mem(JitWriter *jit, jit_uint32_t mem) +{ + jit->write_ubyte(IA32_MOV_EAX_MEM); + jit->write_uint32(mem); +} + inline void IA32_Mov_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) { jit->write_ubyte(IA32_MOV_REG_RM);