las fpu changes

This commit is contained in:
dreg_fr33project 2014-10-27 08:03:11 +01:00
parent 1ef361ba10
commit 650bb5a46b
3 changed files with 269 additions and 62 deletions

View File

@ -253,6 +253,51 @@
#define UE_SEG_DS 40 #define UE_SEG_DS 40
#define UE_SEG_CS 41 #define UE_SEG_CS 41
#define UE_SEG_SS 42 #define UE_SEG_SS 42
#define UE_x87_r0 43
#define UE_x87_r1 44
#define UE_x87_r2 45
#define UE_x87_r3 46
#define UE_x87_r4 47
#define UE_x87_r5 48
#define UE_x87_r6 49
#define UE_x87_r7 50
#define UE_X87_STATUSWORD 51
#define UE_X87_CONTROLWORD 52
#define UE_X87_TAGWORD 53
#define UE_MXCSR 54
#define UE_MMX0 55
#define UE_MMX1 56
#define UE_MMX2 57
#define UE_MMX3 58
#define UE_MMX4 59
#define UE_MMX5 60
#define UE_MMX6 61
#define UE_MMX7 62
#define UE_XMM0 63
#define UE_XMM1 64
#define UE_XMM2 65
#define UE_XMM3 66
#define UE_XMM4 67
#define UE_XMM5 68
#define UE_XMM6 69
#define UE_XMM7 70
#define UE_XMM8 71
#define UE_XMM9 72
#define UE_XMM10 73
#define UE_XMM11 74
#define UE_XMM12 75
#define UE_XMM13 76
#define UE_XMM14 77
#define UE_XMM15 78
#define UE_x87_ST0 79
#define UE_x87_ST1 80
#define UE_x87_ST2 81
#define UE_x87_ST3 82
#define UE_x87_ST4 83
#define UE_x87_ST5 84
#define UE_x87_ST6 85
#define UE_x87_ST7 86
#ifndef CONTEXT_EXTENDED_REGISTERS #ifndef CONTEXT_EXTENDED_REGISTERS
#define CONTEXT_EXTENDED_REGISTERS 0 #define CONTEXT_EXTENDED_REGISTERS 0

View File

@ -293,239 +293,254 @@ __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TI
__declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister) __declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister)
{ {
ULONG_PTR retValue = 0; ULONG_PTR retValue = 0;
CONTEXT DBGContext; TITAN_ENGINE_CONTEXT_t titcontext;
memset(&DBGContext, 0, sizeof(CONTEXT));
DBGContext.ContextFlags = CONTEXT_ALL;
if(SuspendThread(hActiveThread) == (DWORD) - 1) if(SuspendThread(hActiveThread) == (DWORD) - 1)
return retValue; return false;
if(!GetThreadContext(hActiveThread, &DBGContext)) memset(&titcontext, 0, sizeof(titcontext));
if(! _GetFullContextDataEx(hActiveThread, & titcontext))
{ {
ResumeThread(hActiveThread); ResumeThread(hActiveThread);
return retValue; return false;
} }
ResumeThread(hActiveThread); ResumeThread(hActiveThread);
#ifdef _WIN64 //x64 #ifdef _WIN64 //x64
if(IndexOfRegister == UE_EAX) if(IndexOfRegister == UE_EAX)
{ {
retValue = DBGContext.Rax & 0xFFFFFFFF; retValue = titcontext.cax & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_EBX) else if(IndexOfRegister == UE_EBX)
{ {
retValue = DBGContext.Rbx & 0xFFFFFFFF; retValue = titcontext.cbx & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_ECX) else if(IndexOfRegister == UE_ECX)
{ {
retValue = DBGContext.Rcx & 0xFFFFFFFF; retValue = titcontext.ccx & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_EDX) else if(IndexOfRegister == UE_EDX)
{ {
retValue = DBGContext.Rdx & 0xFFFFFFFF; retValue = titcontext.cdx & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_EDI) else if(IndexOfRegister == UE_EDI)
{ {
retValue = DBGContext.Rdi & 0xFFFFFFFF; retValue = titcontext.cdi & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_ESI) else if(IndexOfRegister == UE_ESI)
{ {
retValue = DBGContext.Rsi & 0xFFFFFFFF; retValue = titcontext.csi & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_EBP) else if(IndexOfRegister == UE_EBP)
{ {
retValue = DBGContext.Rbp & 0xFFFFFFFF; retValue = titcontext.cbp & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_ESP) else if(IndexOfRegister == UE_ESP)
{ {
retValue = DBGContext.Rsp & 0xFFFFFFFF; retValue = titcontext.csp & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_EIP) else if(IndexOfRegister == UE_EIP)
{ {
retValue = DBGContext.Rip & 0xFFFFFFFF; retValue = titcontext.cip & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_EFLAGS) else if(IndexOfRegister == UE_EFLAGS)
{ {
retValue = DBGContext.EFlags & 0xFFFFFFFF; retValue = titcontext.eflags & 0xFFFFFFFF;
} }
else if(IndexOfRegister == UE_RAX) else if(IndexOfRegister == UE_RAX)
{ {
retValue = DBGContext.Rax; retValue = titcontext.cax;
} }
else if(IndexOfRegister == UE_RBX) else if(IndexOfRegister == UE_RBX)
{ {
retValue = DBGContext.Rbx; retValue = titcontext.cbx;
} }
else if(IndexOfRegister == UE_RCX) else if(IndexOfRegister == UE_RCX)
{ {
retValue = DBGContext.Rcx; retValue = titcontext.ccx;
} }
else if(IndexOfRegister == UE_RDX) else if(IndexOfRegister == UE_RDX)
{ {
retValue = DBGContext.Rdx; retValue = titcontext.cdx;
} }
else if(IndexOfRegister == UE_RDI) else if(IndexOfRegister == UE_RDI)
{ {
retValue = DBGContext.Rdi; retValue = titcontext.cdi;
} }
else if(IndexOfRegister == UE_RSI) else if(IndexOfRegister == UE_RSI)
{ {
retValue = DBGContext.Rsi; retValue = titcontext.csi;
} }
else if(IndexOfRegister == UE_RBP) else if(IndexOfRegister == UE_RBP)
{ {
retValue = DBGContext.Rbp; retValue = titcontext.cbp;
} }
else if(IndexOfRegister == UE_RSP) else if(IndexOfRegister == UE_RSP)
{ {
retValue = DBGContext.Rsp; retValue = titcontext.csp;
} }
else if(IndexOfRegister == UE_RIP) else if(IndexOfRegister == UE_RIP)
{ {
retValue = DBGContext.Rip; retValue = titcontext.cip;
} }
else if(IndexOfRegister == UE_RFLAGS) else if(IndexOfRegister == UE_RFLAGS)
{ {
retValue = DBGContext.EFlags; retValue = titcontext.eflags;
} }
else if(IndexOfRegister == UE_R8) else if(IndexOfRegister == UE_R8)
{ {
retValue = DBGContext.R8; retValue = titcontext.r8;
} }
else if(IndexOfRegister == UE_R9) else if(IndexOfRegister == UE_R9)
{ {
retValue = DBGContext.R9; retValue = titcontext.r9;
} }
else if(IndexOfRegister == UE_R10) else if(IndexOfRegister == UE_R10)
{ {
retValue = DBGContext.R10; retValue = titcontext.r10;
} }
else if(IndexOfRegister == UE_R11) else if(IndexOfRegister == UE_R11)
{ {
retValue = DBGContext.R11; retValue = titcontext.r11;
} }
else if(IndexOfRegister == UE_R12) else if(IndexOfRegister == UE_R12)
{ {
retValue = DBGContext.R12; retValue = titcontext.r12;
} }
else if(IndexOfRegister == UE_R13) else if(IndexOfRegister == UE_R13)
{ {
retValue = DBGContext.R13; retValue = titcontext.r13;
} }
else if(IndexOfRegister == UE_R14) else if(IndexOfRegister == UE_R14)
{ {
retValue = DBGContext.R14; retValue = titcontext.r14;
} }
else if(IndexOfRegister == UE_R15) else if(IndexOfRegister == UE_R15)
{ {
retValue = DBGContext.R15; retValue = titcontext.r15;
} }
else if(IndexOfRegister == UE_CIP) else if(IndexOfRegister == UE_CIP)
{ {
retValue = DBGContext.Rip; retValue = titcontext.cip;
} }
else if(IndexOfRegister == UE_CSP) else if(IndexOfRegister == UE_CSP)
{ {
retValue = DBGContext.Rsp; retValue = titcontext.csp;
} }
#else //x86 #else //x86
if(IndexOfRegister == UE_EAX) if(IndexOfRegister == UE_EAX)
{ {
retValue = DBGContext.Eax; retValue = titcontext.cax;
} }
else if(IndexOfRegister == UE_EBX) else if(IndexOfRegister == UE_EBX)
{ {
retValue = DBGContext.Ebx; retValue = titcontext.cbx;
} }
else if(IndexOfRegister == UE_ECX) else if(IndexOfRegister == UE_ECX)
{ {
retValue = DBGContext.Ecx; retValue = titcontext.ccx;
} }
else if(IndexOfRegister == UE_EDX) else if(IndexOfRegister == UE_EDX)
{ {
retValue = DBGContext.Edx; retValue = titcontext.cdx;
} }
else if(IndexOfRegister == UE_EDI) else if(IndexOfRegister == UE_EDI)
{ {
retValue = DBGContext.Edi; retValue = titcontext.cdi;
} }
else if(IndexOfRegister == UE_ESI) else if(IndexOfRegister == UE_ESI)
{ {
retValue = DBGContext.Esi; retValue = titcontext.csi;
} }
else if(IndexOfRegister == UE_EBP) else if(IndexOfRegister == UE_EBP)
{ {
retValue = DBGContext.Ebp; retValue = titcontext.cbp;
} }
else if(IndexOfRegister == UE_ESP) else if(IndexOfRegister == UE_ESP)
{ {
retValue = DBGContext.Esp; retValue = titcontext.csp;
} }
else if(IndexOfRegister == UE_EIP) else if(IndexOfRegister == UE_EIP)
{ {
retValue = DBGContext.Eip; retValue = titcontext.cip;
} }
else if(IndexOfRegister == UE_CIP) else if(IndexOfRegister == UE_CIP)
{ {
retValue = DBGContext.Eip; retValue = titcontext.cip;
} }
else if(IndexOfRegister == UE_CSP) else if(IndexOfRegister == UE_CSP)
{ {
retValue = DBGContext.Esp; retValue = titcontext.csp;
} }
#endif #endif
else if(IndexOfRegister == UE_X87_STATUSWORD)
{
retValue = titcontext.x87fpu.StatusWord;
}
else if(IndexOfRegister == UE_X87_CONTROLWORD)
{
retValue = titcontext.x87fpu.ControlWord;
}
else if(IndexOfRegister == UE_X87_TAGWORD)
{
retValue = titcontext.x87fpu.TagWord;
}
else if(IndexOfRegister == UE_MXCSR)
{
retValue = titcontext.MxCsr;
}
else if(IndexOfRegister == UE_EFLAGS) else if(IndexOfRegister == UE_EFLAGS)
{ {
retValue = DBGContext.EFlags; retValue = titcontext.eflags;
} }
else if(IndexOfRegister == UE_DR0) else if(IndexOfRegister == UE_DR0)
{ {
retValue = DBGContext.Dr0; retValue = titcontext.dr0;
} }
else if(IndexOfRegister == UE_DR1) else if(IndexOfRegister == UE_DR1)
{ {
retValue = DBGContext.Dr1; retValue = titcontext.dr1;
} }
else if(IndexOfRegister == UE_DR2) else if(IndexOfRegister == UE_DR2)
{ {
retValue = DBGContext.Dr2; retValue = titcontext.dr2;
} }
else if(IndexOfRegister == UE_DR3) else if(IndexOfRegister == UE_DR3)
{ {
retValue = DBGContext.Dr3; retValue = titcontext.dr3;
} }
else if(IndexOfRegister == UE_DR6) else if(IndexOfRegister == UE_DR6)
{ {
retValue = DBGContext.Dr6; retValue = titcontext.dr6;
} }
else if(IndexOfRegister == UE_DR7) else if(IndexOfRegister == UE_DR7)
{ {
retValue = DBGContext.Dr7; retValue = titcontext.dr7;
} }
else if(IndexOfRegister == UE_SEG_GS) else if(IndexOfRegister == UE_SEG_GS)
{ {
retValue = DBGContext.SegGs; retValue = titcontext.gs;
} }
else if(IndexOfRegister == UE_SEG_FS) else if(IndexOfRegister == UE_SEG_FS)
{ {
retValue = DBGContext.SegFs; retValue = titcontext.fs;
} }
else if(IndexOfRegister == UE_SEG_ES) else if(IndexOfRegister == UE_SEG_ES)
{ {
retValue = DBGContext.SegEs; retValue = titcontext.es;
} }
else if(IndexOfRegister == UE_SEG_DS) else if(IndexOfRegister == UE_SEG_DS)
{ {
retValue = DBGContext.SegDs; retValue = titcontext.ds;
} }
else if(IndexOfRegister == UE_SEG_CS) else if(IndexOfRegister == UE_SEG_CS)
{ {
retValue = DBGContext.SegCs; retValue = titcontext.cs;
} }
else if(IndexOfRegister == UE_SEG_SS) else if(IndexOfRegister == UE_SEG_SS)
{ {
retValue = DBGContext.SegSs; retValue = titcontext.ss;
} }
return retValue; return retValue;
} }
@ -715,6 +730,38 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD
{ {
titcontext.csp = NewRegisterValue; titcontext.csp = NewRegisterValue;
} }
else if(IndexOfRegister == UE_XMM8)
{
memcpy(& (titcontext.XmmRegisters[8]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM9)
{
memcpy(& (titcontext.XmmRegisters[9]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM10)
{
memcpy(& (titcontext.XmmRegisters[10]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM11)
{
memcpy(& (titcontext.XmmRegisters[11]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM12)
{
memcpy(& (titcontext.XmmRegisters[12]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM13)
{
memcpy(& (titcontext.XmmRegisters[13]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM14)
{
memcpy(& (titcontext.XmmRegisters[14]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM15)
{
memcpy(& (titcontext.XmmRegisters[15]), (void*) NewRegisterValue, 16);
}
#else //x86 #else //x86
if(IndexOfRegister == UE_EAX) if(IndexOfRegister == UE_EAX)
{ {
@ -813,6 +860,86 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD
{ {
titcontext.ss = (unsigned short)NewRegisterValue; titcontext.ss = (unsigned short)NewRegisterValue;
} }
else if(IndexOfRegister == UE_X87_STATUSWORD)
{
titcontext.x87fpu.StatusWord = (unsigned short)NewRegisterValue;
}
else if(IndexOfRegister == UE_X87_CONTROLWORD)
{
titcontext.x87fpu.ControlWord = (unsigned short)NewRegisterValue;
}
else if(IndexOfRegister == UE_X87_TAGWORD)
{
titcontext.x87fpu.TagWord = (unsigned short)NewRegisterValue;
}
else if(IndexOfRegister == UE_MXCSR)
{
titcontext.MxCsr = (unsigned short)NewRegisterValue;
}
else if(IndexOfRegister == UE_XMM0)
{
memcpy(& (titcontext.XmmRegisters[0]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM1)
{
memcpy(& (titcontext.XmmRegisters[1]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM2)
{
memcpy(& (titcontext.XmmRegisters[2]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM3)
{
memcpy(& (titcontext.XmmRegisters[3]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM4)
{
memcpy(& (titcontext.XmmRegisters[4]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM5)
{
memcpy(& (titcontext.XmmRegisters[5]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM6)
{
memcpy(& (titcontext.XmmRegisters[6]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_XMM7)
{
memcpy(& (titcontext.XmmRegisters[7]), (void*) NewRegisterValue, 16);
}
else if(IndexOfRegister == UE_MMX0)
{
memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX1)
{
memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX2)
{
memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX3)
{
memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX4)
{
memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX5)
{
memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX6)
{
memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10);
}
else if(IndexOfRegister == UE_MMX7)
{
memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10);
}
else else
{ {
ResumeThread(hActiveThread); ResumeThread(hActiveThread);

View File

@ -619,7 +619,6 @@ typedef struct
#define UE_SEG_DS 40 #define UE_SEG_DS 40
#define UE_SEG_CS 41 #define UE_SEG_CS 41
#define UE_SEG_SS 42 #define UE_SEG_SS 42
#define UE_x87_r0 43 #define UE_x87_r0 43
#define UE_x87_r1 44 #define UE_x87_r1 44
#define UE_x87_r2 45 #define UE_x87_r2 45
@ -628,6 +627,42 @@ typedef struct
#define UE_x87_r5 48 #define UE_x87_r5 48
#define UE_x87_r6 49 #define UE_x87_r6 49
#define UE_x87_r7 50 #define UE_x87_r7 50
#define UE_X87_STATUSWORD 51
#define UE_X87_CONTROLWORD 52
#define UE_X87_TAGWORD 53
#define UE_MXCSR 54
#define UE_MMX0 55
#define UE_MMX1 56
#define UE_MMX2 57
#define UE_MMX3 58
#define UE_MMX4 59
#define UE_MMX5 60
#define UE_MMX6 61
#define UE_MMX7 62
#define UE_XMM0 63
#define UE_XMM1 64
#define UE_XMM2 65
#define UE_XMM3 66
#define UE_XMM4 67
#define UE_XMM5 68
#define UE_XMM6 69
#define UE_XMM7 70
#define UE_XMM8 71
#define UE_XMM9 72
#define UE_XMM10 73
#define UE_XMM11 74
#define UE_XMM12 75
#define UE_XMM13 76
#define UE_XMM14 77
#define UE_XMM15 78
#define UE_x87_ST0 79
#define UE_x87_ST1 80
#define UE_x87_ST2 81
#define UE_x87_ST3 82
#define UE_x87_ST4 83
#define UE_x87_ST5 84
#define UE_x87_ST6 85
#define UE_x87_ST7 86
typedef struct typedef struct
{ {