sm-ext-dhooks2/DynamicHooks/registers.h
Peace-Maker 6e96e0fb84 Don't use std::list at all in DynamicHooks
Switch to amtl Vector.
2016-12-13 17:37:12 -07:00

434 lines
9.2 KiB
C++

/**
* =============================================================================
* DynamicHooks
* Copyright (C) 2015 Robin Gohmert. All rights reserved.
* =============================================================================
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* asm.h/cpp from devmaster.net (thanks cybermind) edited by pRED* to handle gcc
* -fPIC thunks correctly
*
* Idea and trampoline code taken from DynDetours (thanks your-name-here).
*/
#ifndef _REGISTERS_H
#define _REGISTERS_H
// ============================================================================
// >> INCLUDES
// ============================================================================
#include <am-vector.h>
// ============================================================================
// >> Register_t
// ============================================================================
enum Register_t
{
// ========================================================================
// >> 8-bit General purpose registers
// ========================================================================
AL,
CL,
DL,
BL,
// 64-bit mode only
/*
SPL,
BPL,
SIL,
DIL,
R8B,
R9B,
R10B,
R11B,
R12B,
R13B,
R14B,
R15B,
*/
AH,
CH,
DH,
BH,
// ========================================================================
// >> 16-bit General purpose registers
// ========================================================================
AX,
CX,
DX,
BX,
SP,
BP,
SI,
DI,
// 64-bit mode only
/*
R8W,
R9W,
R10W,
R11W,
R12W,
R13W,
R14W,
R15W,
*/
// ========================================================================
// >> 32-bit General purpose registers
// ========================================================================
EAX,
ECX,
EDX,
EBX,
ESP,
EBP,
ESI,
EDI,
// 64-bit mode only
/*
R8D,
R9D,
R10D,
R11D,
R12D,
R13D,
R14D,
R15D,
*/
// ========================================================================
// >> 64-bit General purpose registers
// ========================================================================
// 64-bit mode only
/*
RAX,
RCX,
RDX,
RBX,
RSP,
RBP,
RSI,
RDI,
*/
// 64-bit mode only
/*
R8,
R9,
R10,
R11,
R12,
R13,
R14,
R15,
*/
// ========================================================================
// >> 64-bit MM (MMX) registers
// ========================================================================
MM0,
MM1,
MM2,
MM3,
MM4,
MM5,
MM6,
MM7,
// ========================================================================
// >> 128-bit XMM registers
// ========================================================================
XMM0,
XMM1,
XMM2,
XMM3,
XMM4,
XMM5,
XMM6,
XMM7,
// 64-bit mode only
/*
XMM8,
XMM9,
XMM10,
XMM11,
XMM12,
XMM13,
XMM14,
XMM15,
*/
// ========================================================================
// >> 16-bit Segment registers
// ========================================================================
CS,
SS,
DS,
ES,
FS,
GS,
// ========================================================================
// >> 80-bit FPU registers
// ========================================================================
ST0,
ST1,
ST2,
ST3,
ST4,
ST5,
ST6,
ST7,
};
// ============================================================================
// >> CRegister
// ============================================================================
class CRegister
{
public:
CRegister(int iSize)
{
m_iSize = iSize;
m_pAddress = malloc(iSize);
}
~CRegister()
{
free(m_pAddress);
}
template<class T>
T GetValue()
{
return *(T *) m_pAddress;
}
template<class T>
T GetPointerValue(int iOffset=0)
{
return *(T *) (GetValue<unsigned long>() + iOffset);
}
template<class T>
void SetValue(T value)
{
*(T *) m_pAddress = value;
}
template<class T>
void SetPointerValue(T value, int iOffset=0)
{
*(T *) (GetValue<unsigned long>() + iOffset) = value;
}
public:
int m_iSize;
void* m_pAddress;
};
// ============================================================================
// >> CRegisters
// ============================================================================
class CRegisters
{
public:
CRegisters(ke::Vector<Register_t> registers);
~CRegisters();
private:
CRegister* CreateRegister(ke::Vector<Register_t>& registers, Register_t reg, int iSize);
void DeleteRegister(CRegister* pRegister);
public:
// ========================================================================
// >> 8-bit General purpose registers
// ========================================================================
CRegister* m_al;
CRegister* m_cl;
CRegister* m_dl;
CRegister* m_bl;
// 64-bit mode only
/*
CRegister* m_spl;
CRegister* m_bpl;
CRegister* m_sil;
CRegister* m_dil;
CRegister* m_r8b;
CRegister* m_r9b;
CRegister* m_r10b;
CRegister* m_r11b;
CRegister* m_r12b;
CRegister* m_r13b;
CRegister* m_r14b;
CRegister* m_r15b;
*/
CRegister* m_ah;
CRegister* m_ch;
CRegister* m_dh;
CRegister* m_bh;
// ========================================================================
// >> 16-bit General purpose registers
// ========================================================================
CRegister* m_ax;
CRegister* m_cx;
CRegister* m_dx;
CRegister* m_bx;
CRegister* m_sp;
CRegister* m_bp;
CRegister* m_si;
CRegister* m_di;
// 64-bit mode only
/*
CRegister* m_r8w;
CRegister* m_r9w;
CRegister* m_r10w;
CRegister* m_r11w;
CRegister* m_r12w;
CRegister* m_r13w;
CRegister* m_r14w;
CRegister* m_r15w;
*/
// ========================================================================
// >> 32-bit General purpose registers
// ========================================================================
CRegister* m_eax;
CRegister* m_ecx;
CRegister* m_edx;
CRegister* m_ebx;
CRegister* m_esp;
CRegister* m_ebp;
CRegister* m_esi;
CRegister* m_edi;
// 64-bit mode only
/*
CRegister* m_r8d;
CRegister* m_r9d;
CRegister* m_r10d;
CRegister* m_r11d;
CRegister* m_r12d;
CRegister* m_r13d;
CRegister* m_r14d;
CRegister* m_r15d;
*/
// ========================================================================
// >> 64-bit General purpose registers
// ========================================================================
// 64-bit mode only
/*
CRegister* m_rax;
CRegister* m_rcx;
CRegister* m_rdx;
CRegister* m_rbx;
CRegister* m_rsp;
CRegister* m_rbp;
CRegister* m_rsi;
CRegister* m_rdi;
*/
// 64-bit mode only
/*
CRegister* m_r8;
CRegister* m_r9;
CRegister* m_r10;
CRegister* m_r11;
CRegister* m_r12;
CRegister* m_r13;
CRegister* m_r14;
CRegister* m_r15;
*/
// ========================================================================
// >> 64-bit MM (MMX) registers
// ========================================================================
CRegister* m_mm0;
CRegister* m_mm1;
CRegister* m_mm2;
CRegister* m_mm3;
CRegister* m_mm4;
CRegister* m_mm5;
CRegister* m_mm6;
CRegister* m_mm7;
// ========================================================================
// >> 128-bit XMM registers
// ========================================================================
CRegister* m_xmm0;
CRegister* m_xmm1;
CRegister* m_xmm2;
CRegister* m_xmm3;
CRegister* m_xmm4;
CRegister* m_xmm5;
CRegister* m_xmm6;
CRegister* m_xmm7;
// 64-bit mode only
/*
CRegister* m_xmm8;
CRegister* m_xmm9;
CRegister* m_xmm10;
CRegister* m_xmm11;
CRegister* m_xmm12;
CRegister* m_xmm13;
CRegister* m_xmm14;
CRegister* m_xmm15;
*/
// ========================================================================
// >> 16-bit Segment registers
// ========================================================================
CRegister* m_cs;
CRegister* m_ss;
CRegister* m_ds;
CRegister* m_es;
CRegister* m_fs;
CRegister* m_gs;
// ========================================================================
// >> 80-bit FPU registers
// ========================================================================
CRegister* m_st0;
CRegister* m_st1;
CRegister* m_st2;
CRegister* m_st3;
CRegister* m_st4;
CRegister* m_st5;
CRegister* m_st6;
CRegister* m_st7;
};
#endif // _REGISTERS_H