added a new ia32 macro for the mov eax opcode
cleaned up a bit of the crit hook code --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402152
This commit is contained in:
parent
b2fbd9691d
commit
8ad5d61878
@ -88,13 +88,11 @@ bool CriticalHitManager::CreateCriticalDetour()
|
|||||||
|
|
||||||
//If TempDetour returns non-zero we want to load something into eax and return this value
|
//If TempDetour returns non-zero we want to load something into eax and return this value
|
||||||
|
|
||||||
//IA32_Test_Rm_Reg(jit, eax, eax, something);
|
//test eax, eax
|
||||||
jit->write_ubyte(0x85);
|
IA32_Test_Rm_Reg(jit, REG_EAX, REG_EAX, MOD_REG);
|
||||||
jit->write_ubyte(0xC0);
|
|
||||||
|
|
||||||
//JNZ critical_callback+50
|
//jnz _skip
|
||||||
jit->write_ubyte(0x75);
|
call = IA32_Jump_Cond_Imm8(jit, CC_NZ, 0);
|
||||||
jit->write_ubyte(50-((jit->outptr+1)-jit->outbase));
|
|
||||||
|
|
||||||
/* Patch old bytes in */
|
/* Patch old bytes in */
|
||||||
for (size_t i=0; i<critical_restore.bytes; i++)
|
for (size_t i=0; i<critical_restore.bytes; i++)
|
||||||
@ -106,13 +104,11 @@ bool CriticalHitManager::CreateCriticalDetour()
|
|||||||
call = IA32_Jump_Imm32(jit, 0);
|
call = IA32_Jump_Imm32(jit, 0);
|
||||||
IA32_Write_Jump32_Abs(jit, call, (unsigned char *)critical_address + critical_restore.bytes);
|
IA32_Write_Jump32_Abs(jit, call, (unsigned char *)critical_address + critical_restore.bytes);
|
||||||
|
|
||||||
wr.outbase = (jitcode_t)critical_callback+50;
|
//_skip:
|
||||||
wr.outptr = wr.outbase;
|
//mov eax, [g_returnvalue]
|
||||||
|
//ret
|
||||||
//copy g_returnvalue into eax
|
IA32_Send_Jump8_Here(jit, call);
|
||||||
jit->write_ubyte(0xA1);
|
IA32_Mov_Eax_Mem(jit, (jit_int32_t)&g_returnvalue);
|
||||||
jit->write_uint32((jit_uint32_t)&g_returnvalue);
|
|
||||||
|
|
||||||
IA32_Return(jit);
|
IA32_Return(jit);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
#define IA32_MOV_REG8_RM8 0x8A // encoding is /r
|
#define IA32_MOV_REG8_RM8 0x8A // encoding is /r
|
||||||
#define IA32_MOV_RM8_REG8 0x88 // encoding is /r
|
#define IA32_MOV_RM8_REG8 0x88 // encoding is /r
|
||||||
#define IA32_MOV_RM_IMM32 0xC7 // encoding is /0
|
#define IA32_MOV_RM_IMM32 0xC7 // encoding is /0
|
||||||
|
#define IA32_MOV_EAX_MEM 0xA1 // encoding is <imm32>
|
||||||
#define IA32_CMP_RM_IMM32 0x81 // encoding is /7 <imm32>
|
#define IA32_CMP_RM_IMM32 0x81 // encoding is /7 <imm32>
|
||||||
#define IA32_CMP_RM_IMM8 0x83 // encoding is /7 <imm8>
|
#define IA32_CMP_RM_IMM8 0x83 // encoding is /7 <imm8>
|
||||||
#define IA32_CMP_AL_IMM32 0x3C // no extra encoding
|
#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
|
* 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)
|
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);
|
jit->write_ubyte(IA32_MOV_REG_RM);
|
||||||
|
Loading…
Reference in New Issue
Block a user