mirror of https://github.com/x64dbg/GleeBug
Registers::getPtr (anticipating x87 support)
This commit is contained in:
parent
5aaf8b99fd
commit
ba69fd1509
|
|
@ -1,5 +1,8 @@
|
||||||
#include "Debugger.Thread.Registers.h"
|
#include "Debugger.Thread.Registers.h"
|
||||||
|
|
||||||
|
#define REGPTR(x) (void*)(&x)
|
||||||
|
#define REGPTRN(x, n) (void*)((char*)&x + n)
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#define contextGax mContext.Rax
|
#define contextGax mContext.Rax
|
||||||
#define contextGbx mContext.Rbx
|
#define contextGbx mContext.Rbx
|
||||||
|
|
@ -27,10 +30,16 @@
|
||||||
#else //x32
|
#else //x32
|
||||||
#define uint32_lo(x) ptr(x)
|
#define uint32_lo(x) ptr(x)
|
||||||
#endif //_WIN64
|
#endif //_WIN64
|
||||||
#define uint16_lo(x) ptr(x & 0xFFFFFFFF)
|
#define uint16_lo(x) ptr(x & 0xFFFF)
|
||||||
#define uint8_hi(x) ptr((x >> 8) & 0xFF)
|
#define uint8_hi(x) ptr((x >> 8) & 0xFF)
|
||||||
#define uint8_lo(x) ptr(x & 0xFF)
|
#define uint8_lo(x) ptr(x & 0xFF)
|
||||||
|
|
||||||
|
#define PTR_uint32_lo(x) REGPTR(x)
|
||||||
|
#define PTR_uint16_lo(x) REGPTR(x)
|
||||||
|
#define PTR_uint8_lo(x) REGPTR(x)
|
||||||
|
#define PTR_uint16_hi(x) REGPTRN(x, 2)
|
||||||
|
#define PTR_uint8_hi(x) REGPTRN(x, 1)
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#define set_uint32_lo(x, y) x = (x & ~0xFFFFFFFF) | uint32_lo(y)
|
#define set_uint32_lo(x, y) x = (x & ~0xFFFFFFFF) | uint32_lo(y)
|
||||||
#else //x32
|
#else //x32
|
||||||
|
|
@ -516,4 +525,192 @@ namespace GleeBug
|
||||||
else
|
else
|
||||||
mContext.EFlags &= ~ptr(flag);
|
mContext.EFlags &= ~ptr(flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* Registers::getPtr(R reg) const
|
||||||
|
{
|
||||||
|
switch (reg)
|
||||||
|
{
|
||||||
|
case R::DR0:
|
||||||
|
return REGPTR(mContext.Dr0);
|
||||||
|
case R::DR1:
|
||||||
|
return REGPTR(mContext.Dr1);
|
||||||
|
case R::DR2:
|
||||||
|
return REGPTR(mContext.Dr2);
|
||||||
|
case R::DR3:
|
||||||
|
return REGPTR(mContext.Dr3);
|
||||||
|
case R::DR6:
|
||||||
|
return REGPTR(mContext.Dr6);
|
||||||
|
case R::DR7:
|
||||||
|
return REGPTR(mContext.Dr7);
|
||||||
|
|
||||||
|
case R::EFlags:
|
||||||
|
return REGPTR(mContext.EFlags);
|
||||||
|
|
||||||
|
case R::EAX:
|
||||||
|
return PTR_uint32_lo(contextGax);
|
||||||
|
case R::AX:
|
||||||
|
return PTR_uint16_lo(contextGax);
|
||||||
|
case R::AH:
|
||||||
|
return PTR_uint8_hi(contextGax);
|
||||||
|
case R::AL:
|
||||||
|
return PTR_uint8_lo(contextGax);
|
||||||
|
case R::EBX:
|
||||||
|
return PTR_uint32_lo(contextGbx);
|
||||||
|
case R::BX:
|
||||||
|
return PTR_uint16_lo(contextGbx);
|
||||||
|
case R::BH:
|
||||||
|
return PTR_uint8_hi(contextGbx);
|
||||||
|
case R::BL:
|
||||||
|
return PTR_uint8_lo(contextGbx);
|
||||||
|
case R::ECX:
|
||||||
|
return PTR_uint32_lo(contextGcx);
|
||||||
|
case R::CX:
|
||||||
|
return PTR_uint16_lo(contextGcx);
|
||||||
|
case R::CH:
|
||||||
|
return PTR_uint8_hi(contextGcx);
|
||||||
|
case R::CL:
|
||||||
|
return PTR_uint8_lo(contextGcx);
|
||||||
|
case R::EDX:
|
||||||
|
return PTR_uint32_lo(contextGdx);
|
||||||
|
case R::DX:
|
||||||
|
return PTR_uint16_lo(contextGdx);
|
||||||
|
case R::DH:
|
||||||
|
return PTR_uint8_hi(contextGdx);
|
||||||
|
case R::DL:
|
||||||
|
return PTR_uint8_lo(contextGdx);
|
||||||
|
case R::EDI:
|
||||||
|
return PTR_uint32_lo(contextGdi);
|
||||||
|
case R::DI:
|
||||||
|
return PTR_uint16_lo(contextGdi);
|
||||||
|
case R::ESI:
|
||||||
|
return PTR_uint32_lo(contextGsi);
|
||||||
|
case R::SI:
|
||||||
|
return PTR_uint16_lo(contextGsi);
|
||||||
|
case R::EBP:
|
||||||
|
return PTR_uint32_lo(contextGbp);
|
||||||
|
case R::BP:
|
||||||
|
return PTR_uint16_lo(contextGbp);
|
||||||
|
case R::ESP:
|
||||||
|
return PTR_uint32_lo(contextGsp);
|
||||||
|
case R::SP:
|
||||||
|
return PTR_uint16_lo(contextGsp);
|
||||||
|
case R::EIP:
|
||||||
|
return PTR_uint32_lo(contextGip);
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
case R::RAX:
|
||||||
|
return REGPTR(mContext.Rax);
|
||||||
|
case R::RBX:
|
||||||
|
return REGPTR(mContext.Rbx);
|
||||||
|
case R::RCX:
|
||||||
|
return REGPTR(mContext.Rcx);
|
||||||
|
case R::RDX:
|
||||||
|
return REGPTR(mContext.Rdx);
|
||||||
|
case R::RSI:
|
||||||
|
return REGPTR(mContext.Rsi);
|
||||||
|
case R::SIL:
|
||||||
|
return PTR_uint8_lo(mContext.Rsi);
|
||||||
|
case R::RDI:
|
||||||
|
return REGPTR(mContext.Rdi);
|
||||||
|
case R::DIL:
|
||||||
|
return PTR_uint8_lo(mContext.Rdi);
|
||||||
|
case R::RBP:
|
||||||
|
return REGPTR(mContext.Rbp);
|
||||||
|
case R::BPL:
|
||||||
|
return PTR_uint8_lo(mContext.Rbp);
|
||||||
|
case R::RSP:
|
||||||
|
return REGPTR(mContext.Rsp);
|
||||||
|
case R::SPL:
|
||||||
|
return PTR_uint8_lo(mContext.Rsp);
|
||||||
|
case R::RIP:
|
||||||
|
return REGPTR(mContext.Rip);
|
||||||
|
case R::R8:
|
||||||
|
return REGPTR(mContext.R8);
|
||||||
|
case R::R8D:
|
||||||
|
return PTR_uint32_lo(mContext.R8);
|
||||||
|
case R::R8W:
|
||||||
|
return PTR_uint16_lo(mContext.R8);
|
||||||
|
case R::R8B:
|
||||||
|
return PTR_uint8_lo(mContext.R8);
|
||||||
|
case R::R9:
|
||||||
|
return REGPTR(mContext.R9);
|
||||||
|
case R::R9D:
|
||||||
|
return PTR_uint32_lo(mContext.R9);
|
||||||
|
case R::R9W:
|
||||||
|
return PTR_uint16_lo(mContext.R9);
|
||||||
|
case R::R9B:
|
||||||
|
return PTR_uint8_lo(mContext.R9);
|
||||||
|
case R::R10:
|
||||||
|
return REGPTR(mContext.R10);
|
||||||
|
case R::R10D:
|
||||||
|
return PTR_uint32_lo(mContext.R10);
|
||||||
|
case R::R10W:
|
||||||
|
return PTR_uint16_lo(mContext.R10);
|
||||||
|
case R::R10B:
|
||||||
|
return PTR_uint8_lo(mContext.R10);
|
||||||
|
case R::R11:
|
||||||
|
return REGPTR(mContext.R11);
|
||||||
|
case R::R11D:
|
||||||
|
return PTR_uint32_lo(mContext.R11);
|
||||||
|
case R::R11W:
|
||||||
|
return PTR_uint16_lo(mContext.R11);
|
||||||
|
case R::R11B:
|
||||||
|
return PTR_uint8_lo(mContext.R11);
|
||||||
|
case R::R12:
|
||||||
|
return REGPTR(mContext.R12);
|
||||||
|
case R::R12D:
|
||||||
|
return PTR_uint32_lo(mContext.R12);
|
||||||
|
case R::R12W:
|
||||||
|
return PTR_uint16_lo(mContext.R12);
|
||||||
|
case R::R12B:
|
||||||
|
return PTR_uint8_lo(mContext.R12);
|
||||||
|
case R::R13:
|
||||||
|
return REGPTR(mContext.R13);
|
||||||
|
case R::R13D:
|
||||||
|
return PTR_uint32_lo(mContext.R13);
|
||||||
|
case R::R13W:
|
||||||
|
return PTR_uint16_lo(mContext.R13);
|
||||||
|
case R::R13B:
|
||||||
|
return PTR_uint8_lo(mContext.R13);
|
||||||
|
case R::R14:
|
||||||
|
return REGPTR(mContext.R14);
|
||||||
|
case R::R14D:
|
||||||
|
return PTR_uint32_lo(mContext.R14);
|
||||||
|
case R::R14W:
|
||||||
|
return PTR_uint16_lo(mContext.R14);
|
||||||
|
case R::R14B:
|
||||||
|
return PTR_uint8_lo(mContext.R14);
|
||||||
|
case R::R15:
|
||||||
|
return REGPTR(mContext.R15);
|
||||||
|
case R::R15D:
|
||||||
|
return PTR_uint32_lo(mContext.R15);
|
||||||
|
case R::R15W:
|
||||||
|
return PTR_uint16_lo(mContext.R15);
|
||||||
|
case R::R15B:
|
||||||
|
return PTR_uint8_lo(mContext.R15);
|
||||||
|
#endif //_WIN64
|
||||||
|
|
||||||
|
case R::GAX:
|
||||||
|
return REGPTR(contextGax);
|
||||||
|
case R::GBX:
|
||||||
|
return REGPTR(contextGbx);
|
||||||
|
case R::GCX:
|
||||||
|
return REGPTR(contextGcx);
|
||||||
|
case R::GDX:
|
||||||
|
return REGPTR(contextGdx);
|
||||||
|
case R::GDI:
|
||||||
|
return REGPTR(contextGdi);
|
||||||
|
case R::GSI:
|
||||||
|
return REGPTR(contextGsi);
|
||||||
|
case R::GBP:
|
||||||
|
return REGPTR(contextGbp);
|
||||||
|
case R::GSP:
|
||||||
|
return REGPTR(contextGsp);
|
||||||
|
case R::GIP:
|
||||||
|
return REGPTR(contextGip);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -127,7 +127,10 @@ public:
|
||||||
*/
|
*/
|
||||||
Type Get() const
|
Type Get() const
|
||||||
{
|
{
|
||||||
return Type(mRegisters->Get(RegisterIndex));
|
auto ptr = (Type*)mRegisters->getPtr(RegisterIndex);
|
||||||
|
if (ptr)
|
||||||
|
return *ptr;
|
||||||
|
return Type();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -136,7 +139,9 @@ public:
|
||||||
*/
|
*/
|
||||||
void Set(Type value)
|
void Set(Type value)
|
||||||
{
|
{
|
||||||
mRegisters->Set(RegisterIndex, ptr(value));
|
auto ptr = (Type*)mRegisters->getPtr(RegisterIndex);
|
||||||
|
if (ptr)
|
||||||
|
*ptr = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ namespace GleeBug
|
||||||
*/
|
*/
|
||||||
class Registers
|
class Registers
|
||||||
{
|
{
|
||||||
|
friend class Register;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
\brief Default constructor.
|
\brief Default constructor.
|
||||||
|
|
@ -157,6 +159,8 @@ namespace GleeBug
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CONTEXT mContext;
|
CONTEXT mContext;
|
||||||
|
|
||||||
|
void* getPtr(R reg) const;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue