From 1ef361ba10c9d223112662cdbb462d774d399f3a Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Sun, 26 Oct 2014 02:28:20 +0200 Subject: [PATCH 1/4] last changes --- SDK/C/TitanEngine.h | 11 +- TitanEngine/Global.Engine.Threading.h | 6 + TitanEngine/TitanEngine.Debugger.Context.cpp | 358 +++++++++++++------ TitanEngine/definitions.h | 2 + TitanEngine/stdafx.h | 18 +- 5 files changed, 270 insertions(+), 125 deletions(-) diff --git a/SDK/C/TitanEngine.h b/SDK/C/TitanEngine.h index c2f69fb..f111e4e 100644 --- a/SDK/C/TitanEngine.h +++ b/SDK/C/TitanEngine.h @@ -262,18 +262,18 @@ typedef struct { BYTE data[10]; int st_value; + int tag; } x87FPURegister_t; typedef struct { - DWORD ControlWord; - DWORD StatusWord; - DWORD TagWord; + WORD ControlWord; + WORD StatusWord; + WORD TagWord; DWORD ErrorOffset; DWORD ErrorSelector; DWORD DataOffset; DWORD DataSelector; - x87FPURegister_t x87FPURegister[8]; DWORD Cr0NpxState; } x87FPU_t; @@ -314,7 +314,6 @@ typedef struct BYTE RegisterArea[80]; x87FPU_t x87fpu; DWORD MxCsr; - uint64_t mmx[8]; #ifdef _WIN64 M128A XmmRegisters[16]; #else // x86 @@ -765,6 +764,8 @@ __declspec(dllexport) bool TITCALL SetMemoryBPX(ULONG_PTR MemoryStart, SIZE_T Si __declspec(dllexport) bool TITCALL SetMemoryBPXEx(ULONG_PTR MemoryStart, SIZE_T SizeOfMemory, DWORD BreakPointType, bool RestoreOnHit, LPVOID bpxCallBack); __declspec(dllexport) bool TITCALL RemoveMemoryBPX(ULONG_PTR MemoryStart, SIZE_T SizeOfMemory); __declspec(dllexport) bool TITCALL GetContextFPUDataEx(HANDLE hActiveThread, void* FPUSaveArea); +__declspec(dllexport) void TITCALL Getx87FPURegisters(x87FPURegister_t x87FPURegisters[8], TITAN_ENGINE_CONTEXT_t* titcontext); +__declspec(dllexport) void TITCALL GetMMXRegisters(uint64_t mmx[8], TITAN_ENGINE_CONTEXT_t* titcontext); __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext); __declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister); __declspec(dllexport) ULONG_PTR TITCALL GetContextData(DWORD IndexOfRegister); diff --git a/TitanEngine/Global.Engine.Threading.h b/TitanEngine/Global.Engine.Threading.h index 67d4d72..1882d16 100644 --- a/TitanEngine/Global.Engine.Threading.h +++ b/TitanEngine/Global.Engine.Threading.h @@ -1,6 +1,12 @@ #ifndef _GLOBAL_ENGINE_THREADING_H #define _GLOBAL_ENGINE_THREADING_H +#define GetSTInTOPStackFromStatusWord(StatusWord) ((StatusWord & 0x3800) >> 11) +#define Getx87r0PositionInRegisterArea(STInTopStack) ((8 - STInTopStack) % 8) +#define Calculatex87registerPositionInRegisterArea(x87r0_position, index) (((x87r0_position + index) % 8)) +#define GetRegisterAreaOf87register(register_area, x87r0_position, index) (((char *) register_area) + 10 * Calculatex87registerPositionInRegisterArea(x87r0_position, i) ) +#define GetSTValueFromIndex(x87r0_position, index) ((x87r0_position + index) % 8) + enum CriticalSectionLock { LockBreakPointBuffer, diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp index 7408102..f9a7779 100644 --- a/TitanEngine/TitanEngine.Debugger.Context.cpp +++ b/TitanEngine/TitanEngine.Debugger.Context.cpp @@ -5,6 +5,39 @@ #include "Global.Handle.h" #include "Global.Engine.Threading.h" +__declspec(dllexport) void TITCALL GetMMXRegisters(uint64_t mmx[8], TITAN_ENGINE_CONTEXT_t* titcontext) +{ + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext->x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + int i; + + for(i = 0; i < 8; i++) + mmx[i] = * ((uint64_t*) GetRegisterAreaOf87register(titcontext->RegisterArea, x87r0_position, i)); +} + +__declspec(dllexport) void TITCALL Getx87FPURegisters(x87FPURegister_t x87FPURegisters[8], TITAN_ENGINE_CONTEXT_t* titcontext) +{ + + /* + GET Actual TOP register from StatusWord to order the FPUx87registers like in the FPU internal order. + The TOP field (bits 13-11) is where the FPU keeps track of which of its 80-bit registers is at the TOP. + The register number for the FPU's internal numbering system of the 80-bit registers would be displayed in that field. + When the programmer specifies one of the FPU 80-bit registers ST(x) in an instruction, the FPU adds (modulo 8) the ST number + supplied to the value in this TOP field to determine in which of its registers the required data is located. + */ + + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext->x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + int i; + + for(i = 0; i < 8; i++) + { + memcpy(x87FPURegisters[i].data, GetRegisterAreaOf87register(titcontext->RegisterArea, x87r0_position, i), 10); + x87FPURegisters[i].st_value = GetSTValueFromIndex(x87r0_position, i); + x87FPURegisters[i].tag = (int)((titcontext->x87fpu.TagWord >> (i * 2)) & 0x3); + } +} + __declspec(dllexport) bool TITCALL GetContextFPUDataEx(HANDLE hActiveThread, void* FPUSaveArea) { if(FPUSaveArea) @@ -32,24 +65,135 @@ __declspec(dllexport) bool TITCALL GetContextFPUDataEx(HANDLE hActiveThread, voi return false; } -__declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext) + +__declspec(dllexport) bool TITCALL _SetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext) { - ULONG_PTR retValue = 0; CONTEXT DBGContext; - memset(&DBGContext, 0, sizeof(CONTEXT)); - DBGContext.ContextFlags = CONTEXT_ALL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS; int i; - if(SuspendThread(hActiveThread) == (DWORD) - 1) - return false; + memset(&DBGContext, 0, sizeof(DBGContext)); + + DBGContext.ContextFlags = CONTEXT_ALL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS; if(!GetThreadContext(hActiveThread, &DBGContext)) { ResumeThread(hActiveThread); return false; } + + DBGContext.EFlags = titcontext->eflags; + DBGContext.Dr0 = titcontext->dr0; + DBGContext.Dr1 = titcontext->dr1; + DBGContext.Dr2 = titcontext->dr2; + DBGContext.Dr3 = titcontext->dr3; + DBGContext.Dr6 = titcontext->dr6; + DBGContext.Dr7 = titcontext->dr7; + DBGContext.SegGs = titcontext->gs; + DBGContext.SegFs = titcontext->fs; + DBGContext.SegEs = titcontext->es; + DBGContext.SegDs = titcontext->ds; + DBGContext.SegCs = titcontext->cs; + DBGContext.SegSs = titcontext->ss; + +#ifdef _WIN64 //x64 + DBGContext.Rax = titcontext->cax; + DBGContext.Rbx = titcontext->cbx; + DBGContext.Rcx = titcontext->ccx; + DBGContext.Rdx = titcontext->cdx; + DBGContext.Rdi = titcontext->cdi; + DBGContext.Rsi = titcontext->csi; + DBGContext.Rbp = titcontext->cbp; + DBGContext.Rsp = titcontext->csp; + DBGContext.Rip = titcontext->cip; + DBGContext.R8 = titcontext->r8; + DBGContext.R9 = titcontext->r9; + DBGContext.R10 = titcontext->r10; + DBGContext.R11 = titcontext->r11; + DBGContext.R12 = titcontext->r12; + DBGContext.R13 = titcontext->r13; + DBGContext.R14 = titcontext->r14; + DBGContext.R15 = titcontext->r15; + + DBGContext.FltSave.ControlWord = titcontext->x87fpu.ControlWord; + DBGContext.FltSave.StatusWord = titcontext->x87fpu.StatusWord; + memcpy(& (DBGContext.FltSave.TagWord), & (titcontext->x87fpu.TagWord), sizeof(titcontext->x87fpu.TagWord)); +#ifdef _WIN64 +#define WIN64_CASTDWORDTOWORD (WORD) +#else +#define WIN64_CASTDWORDTOWORD (DWORD) +#endif + DBGContext.FltSave.ErrorSelector = WIN64_CASTDWORDTOWORD titcontext->x87fpu.ErrorSelector; + DBGContext.FltSave.ErrorOffset = titcontext->x87fpu.ErrorOffset; + DBGContext.FltSave.DataSelector = WIN64_CASTDWORDTOWORD titcontext->x87fpu.DataSelector; + DBGContext.FltSave.DataOffset = titcontext->x87fpu.DataOffset; + // Skip titcontext->x87fpu.Cr0NpxState + DBGContext.FltSave.MxCsr = titcontext->MxCsr; + + for(i = 0; i < 8; i++) + memcpy(& DBGContext.FltSave.FloatRegisters[i], &(titcontext->RegisterArea[i * 10]), 10); + + for(i = 0; i < 16; i++) + memcpy(& (DBGContext.FltSave.XmmRegisters[i]), & (titcontext->XmmRegisters[i]), 16); + +#else //x86 + DBGContext.Eax = titcontext->cax; + DBGContext.Ebx = titcontext->cbx; + DBGContext.Ecx = titcontext->ccx; + DBGContext.Edx = titcontext->cdx; + DBGContext.Edi = titcontext->cdi; + DBGContext.Esi = titcontext->csi; + DBGContext.Ebp = titcontext->cbp; + DBGContext.Esp = titcontext->csp; + DBGContext.Eip = titcontext->cip; + + DBGContext.FloatSave.ControlWord = titcontext->x87fpu.ControlWord; + DBGContext.FloatSave.StatusWord = titcontext->x87fpu.StatusWord; + DBGContext.FloatSave.TagWord = titcontext->x87fpu.TagWord; + DBGContext.FloatSave.ErrorSelector = titcontext->x87fpu.ErrorSelector; + DBGContext.FloatSave.ErrorOffset = titcontext->x87fpu.ErrorOffset; + DBGContext.FloatSave.DataSelector = titcontext->x87fpu.DataSelector; + DBGContext.FloatSave.DataOffset = titcontext->x87fpu.DataOffset; + DBGContext.FloatSave.Cr0NpxState = titcontext->x87fpu.Cr0NpxState; + + memcpy(DBGContext.FloatSave.RegisterArea, titcontext->RegisterArea, 80); + + // MXCSR ExtendedRegisters[24] + memcpy(& (DBGContext.ExtendedRegisters[24]), & titcontext->MxCsr, sizeof(titcontext->MxCsr)); + + // for x86 copy the 8 Xmm Registers from ExtendedRegisters[(10+n)*16]; (n is the index of the xmm register) to the XMM register + for(i = 0; i < 8; i++) + memcpy(& DBGContext.ExtendedRegisters[(10 + i) * 16], &(titcontext->XmmRegisters[i]), 16); +#endif + + return SetThreadContext(hActiveThread, & DBGContext) ? true : false; +} + +__declspec(dllexport) bool TITCALL SetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext) +{ + bool returnf; + + if(SuspendThread(hActiveThread) == (DWORD) - 1) + return false; + + returnf = _SetFullContextDataEx(hActiveThread, titcontext); + ResumeThread(hActiveThread); + return returnf; +} + +__declspec(dllexport) bool TITCALL _GetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext) +{ + CONTEXT DBGContext; + int i; + + memset(&DBGContext, 0, sizeof(CONTEXT)); + + DBGContext.ContextFlags = CONTEXT_ALL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS; + + if(!GetThreadContext(hActiveThread, &DBGContext)) + return false; + titcontext->eflags = DBGContext.EFlags; titcontext->dr0 = DBGContext.Dr0; titcontext->dr1 = DBGContext.Dr1; @@ -85,7 +229,7 @@ __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TI titcontext->x87fpu.ControlWord = DBGContext.FltSave.ControlWord; titcontext->x87fpu.StatusWord = DBGContext.FltSave.StatusWord; - titcontext->x87fpu.TagWord = DBGContext.FltSave.TagWord; + memcpy(& (titcontext->x87fpu.TagWord), & (DBGContext.FltSave.TagWord), sizeof(titcontext->x87fpu.TagWord)); titcontext->x87fpu.ErrorSelector = DBGContext.FltSave.ErrorSelector; titcontext->x87fpu.ErrorOffset = DBGContext.FltSave.ErrorOffset; titcontext->x87fpu.DataSelector = DBGContext.FltSave.DataSelector; @@ -97,7 +241,7 @@ __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TI memcpy(&(titcontext->RegisterArea[i * 10]), & DBGContext.FltSave.FloatRegisters[i], 10); for(i = 0; i < 16; i++) - memcpy(& (titcontext->XmmRegisters[i]), & (DBGContext.FltSave.XmmRegisters[i]), sizeof(*titcontext->XmmRegisters)); + memcpy(& (titcontext->XmmRegisters[i]), & (DBGContext.FltSave.XmmRegisters[i]), 16); #else //x86 titcontext->cax = DBGContext.Eax; @@ -110,9 +254,9 @@ __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TI titcontext->csp = DBGContext.Esp; titcontext->cip = DBGContext.Eip; - titcontext->x87fpu.ControlWord = DBGContext.FloatSave.ControlWord; - titcontext->x87fpu.StatusWord = DBGContext.FloatSave.StatusWord; - titcontext->x87fpu.TagWord = DBGContext.FloatSave.TagWord; + titcontext->x87fpu.ControlWord = (WORD) DBGContext.FloatSave.ControlWord; + titcontext->x87fpu.StatusWord = (WORD) DBGContext.FloatSave.StatusWord; + titcontext->x87fpu.TagWord = (WORD) DBGContext.FloatSave.TagWord; titcontext->x87fpu.ErrorSelector = DBGContext.FloatSave.ErrorSelector; titcontext->x87fpu.ErrorOffset = DBGContext.FloatSave.ErrorOffset; titcontext->x87fpu.DataSelector = DBGContext.FloatSave.DataSelector; @@ -122,50 +266,36 @@ __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TI memcpy(titcontext->RegisterArea, DBGContext.FloatSave.RegisterArea, 80); // MXCSR ExtendedRegisters[24] - titcontext->MxCsr = DBGContext.ExtendedRegisters[24]; + memcpy(& (titcontext->MxCsr), & (DBGContext.ExtendedRegisters[24]), sizeof(titcontext->MxCsr)); // for x86 copy the 8 Xmm Registers from ExtendedRegisters[(10+n)*16]; (n is the index of the xmm register) to the XMM register for(i = 0; i < 8; i++) - memcpy(& (titcontext->XmmRegisters[i]), & DBGContext.ExtendedRegisters[(10 + i) * 16], sizeof(*titcontext->XmmRegisters)); + memcpy(&(titcontext->XmmRegisters[i]), & DBGContext.ExtendedRegisters[(10 + i) * 16], 16); #endif -#define GetSTInTOPStackFromStatusWord(StatusWord) ((StatusWord & 0x3800) >> 11) -#define Getx87r0PositionInRegisterArea(STInTopStack) ((8 - STInTopStack) % 8) -#define Calculatex87registerPositionInRegisterArea(x87r0_position, index) (((x87r0_position + index) % 8)) -#define GetRegisterAreaOf87register(register_area, x87r0_position, index) (((char *) register_area) + 10 * Calculatex87registerPositionInRegisterArea(x87r0_position, i) ) -#define GetSTValueFromIndex(x87r0_position, index) ((x87r0_position + index) % 8) - - int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext->x87fpu.StatusWord); - DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); - for(i = 0; i < 8; i++) - titcontext->mmx[i] = * ((int64_t*) GetRegisterAreaOf87register(titcontext->RegisterArea, x87r0_position, i)); - - - /* - GET Actual TOP register from StatusWord to order the FPUx87registers like in the FPU internal order. - The TOP field (bits 13-11) is where the FPU keeps track of which of its 80-bit registers is at the TOP. - The register number for the FPU's internal numbering system of the 80-bit registers would be displayed in that field. - When the programmer specifies one of the FPU 80-bit registers ST(x) in an instruction, the FPU adds (modulo 8) the ST number - supplied to the value in this TOP field to determine in which of its registers the required data is located. - */ - /* - int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext->x87fpu.StatusWord); - DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); - */ - for(i = 0; i < 8; i++) - { - memcpy(titcontext->x87fpu.x87FPURegister[i].data, GetRegisterAreaOf87register(titcontext->RegisterArea, x87r0_position, i), 10); - titcontext->x87fpu.x87FPURegister[i].st_value = GetSTValueFromIndex(x87r0_position, i); - } - return true; } +__declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext) +{ + bool returnf; + + if(SuspendThread(hActiveThread) == (DWORD) - 1) + return false; + + returnf = _GetFullContextDataEx(hActiveThread, titcontext); + + ResumeThread(hActiveThread); + + return returnf; +} + __declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister) { ULONG_PTR retValue = 0; CONTEXT DBGContext; memset(&DBGContext, 0, sizeof(CONTEXT)); + DBGContext.ContextFlags = CONTEXT_ALL; if(SuspendThread(hActiveThread) == (DWORD) - 1) @@ -441,14 +571,15 @@ __declspec(dllexport) bool TITCALL SetContextFPUDataEx(HANDLE hActiveThread, voi __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister, ULONG_PTR NewRegisterValue) { - CONTEXT DBGContext; - memset(&DBGContext, 0, sizeof(CONTEXT)); - DBGContext.ContextFlags = CONTEXT_ALL; + TITAN_ENGINE_CONTEXT_t titcontext; + bool returnf; if(SuspendThread(hActiveThread) == (DWORD) - 1) return false; - if(!GetThreadContext(hActiveThread, &DBGContext)) + memset(&titcontext, 0, sizeof(titcontext)); + + if(! _GetFullContextDataEx(hActiveThread, & titcontext)) { ResumeThread(hActiveThread); return false; @@ -457,230 +588,230 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD #ifdef _WIN64 //x64 if(IndexOfRegister == UE_EAX) { - NewRegisterValue = DBGContext.Rax - (DWORD)DBGContext.Rax + NewRegisterValue; - DBGContext.Rax = NewRegisterValue; + NewRegisterValue = titcontext.cax - (DWORD)titcontext.cax + NewRegisterValue; + titcontext.cax = NewRegisterValue; } else if(IndexOfRegister == UE_EBX) { - NewRegisterValue = DBGContext.Rbx - (DWORD)DBGContext.Rbx + NewRegisterValue; - DBGContext.Rbx = NewRegisterValue; + NewRegisterValue = titcontext.cbx - (DWORD)titcontext.cbx + NewRegisterValue; + titcontext.cbx = NewRegisterValue; } else if(IndexOfRegister == UE_ECX) { - NewRegisterValue = DBGContext.Rcx - (DWORD)DBGContext.Rcx + NewRegisterValue; - DBGContext.Rcx = NewRegisterValue; + NewRegisterValue = titcontext.ccx - (DWORD)titcontext.ccx + NewRegisterValue; + titcontext.ccx = NewRegisterValue; } else if(IndexOfRegister == UE_EDX) { - NewRegisterValue = DBGContext.Rdx - (DWORD)DBGContext.Rdx + NewRegisterValue; - DBGContext.Rdx = NewRegisterValue; + NewRegisterValue = titcontext.cdx - (DWORD)titcontext.cdx + NewRegisterValue; + titcontext.cdx = NewRegisterValue; } else if(IndexOfRegister == UE_EDI) { - NewRegisterValue = DBGContext.Rdi - (DWORD)DBGContext.Rdi + NewRegisterValue; - DBGContext.Rdi = NewRegisterValue; + NewRegisterValue = titcontext.cdi - (DWORD)titcontext.cdi + NewRegisterValue; + titcontext.cdi = NewRegisterValue; } else if(IndexOfRegister == UE_ESI) { - NewRegisterValue = DBGContext.Rsi - (DWORD)DBGContext.Rsi + NewRegisterValue; - DBGContext.Rsi = NewRegisterValue; + NewRegisterValue = titcontext.csi - (DWORD)titcontext.csi + NewRegisterValue; + titcontext.csi = NewRegisterValue; } else if(IndexOfRegister == UE_EBP) { - NewRegisterValue = DBGContext.Rbp - (DWORD)DBGContext.Rbp + NewRegisterValue; - DBGContext.Rbp = NewRegisterValue; + NewRegisterValue = titcontext.cbp - (DWORD)titcontext.cbp + NewRegisterValue; + titcontext.cbp = NewRegisterValue; } else if(IndexOfRegister == UE_ESP) { - NewRegisterValue = DBGContext.Rsp - (DWORD)DBGContext.Rsp + NewRegisterValue; - DBGContext.Rsp = NewRegisterValue; + NewRegisterValue = titcontext.csp - (DWORD)titcontext.csp + NewRegisterValue; + titcontext.csp = NewRegisterValue; } else if(IndexOfRegister == UE_EIP) { - NewRegisterValue = DBGContext.Rip - (DWORD)DBGContext.Rip + NewRegisterValue; - DBGContext.Rip = NewRegisterValue; + NewRegisterValue = titcontext.cip - (DWORD)titcontext.cip + NewRegisterValue; + titcontext.cip = NewRegisterValue; } else if(IndexOfRegister == UE_EFLAGS) { - DBGContext.EFlags = (DWORD)NewRegisterValue; + titcontext.eflags = (DWORD)NewRegisterValue; } else if(IndexOfRegister == UE_RAX) { - DBGContext.Rax = NewRegisterValue; + titcontext.cax = NewRegisterValue; } else if(IndexOfRegister == UE_RBX) { - DBGContext.Rbx = NewRegisterValue; + titcontext.cbx = NewRegisterValue; } else if(IndexOfRegister == UE_RCX) { - DBGContext.Rcx = NewRegisterValue; + titcontext.ccx = NewRegisterValue; } else if(IndexOfRegister == UE_RDX) { - DBGContext.Rdx = NewRegisterValue; + titcontext.cdx = NewRegisterValue; } else if(IndexOfRegister == UE_RDI) { - DBGContext.Rdi = NewRegisterValue; + titcontext.cdi = NewRegisterValue; } else if(IndexOfRegister == UE_RSI) { - DBGContext.Rsi = NewRegisterValue; + titcontext.csi = NewRegisterValue; } else if(IndexOfRegister == UE_RBP) { - DBGContext.Rbp = NewRegisterValue; + titcontext.cbp = NewRegisterValue; } else if(IndexOfRegister == UE_RSP) { - DBGContext.Rsp = NewRegisterValue; + titcontext.csp = NewRegisterValue; } else if(IndexOfRegister == UE_RIP) { - DBGContext.Rip = NewRegisterValue; + titcontext.cip = NewRegisterValue; } else if(IndexOfRegister == UE_RFLAGS) { - DBGContext.EFlags = (DWORD)NewRegisterValue; + titcontext.eflags = (unsigned int) NewRegisterValue; } else if(IndexOfRegister == UE_R8) { - DBGContext.R8 = NewRegisterValue; + titcontext.r8 = NewRegisterValue; } else if(IndexOfRegister == UE_R9) { - DBGContext.R9 = NewRegisterValue; + titcontext.r9 = NewRegisterValue; } else if(IndexOfRegister == UE_R10) { - DBGContext.R10 = NewRegisterValue; + titcontext.r10 = NewRegisterValue; } else if(IndexOfRegister == UE_R11) { - DBGContext.R11 = NewRegisterValue; + titcontext.r11 = NewRegisterValue; } else if(IndexOfRegister == UE_R12) { - DBGContext.R12 = NewRegisterValue; + titcontext.r12 = NewRegisterValue; } else if(IndexOfRegister == UE_R13) { - DBGContext.R13 = NewRegisterValue; + titcontext.r13 = NewRegisterValue; } else if(IndexOfRegister == UE_R14) { - DBGContext.R14 = NewRegisterValue; + titcontext.r14 = NewRegisterValue; } else if(IndexOfRegister == UE_R15) { - DBGContext.R15 = NewRegisterValue; + titcontext.r15 = NewRegisterValue; } else if(IndexOfRegister == UE_CIP) { - DBGContext.Rip = NewRegisterValue; + titcontext.cip = NewRegisterValue; } else if(IndexOfRegister == UE_CSP) { - DBGContext.Rsp = NewRegisterValue; + titcontext.csp = NewRegisterValue; } #else //x86 if(IndexOfRegister == UE_EAX) { - DBGContext.Eax = NewRegisterValue; + titcontext.cax = NewRegisterValue; } else if(IndexOfRegister == UE_EBX) { - DBGContext.Ebx = NewRegisterValue; + titcontext.cbx = NewRegisterValue; } else if(IndexOfRegister == UE_ECX) { - DBGContext.Ecx = NewRegisterValue; + titcontext.ccx = NewRegisterValue; } else if(IndexOfRegister == UE_EDX) { - DBGContext.Edx = NewRegisterValue; + titcontext.cdx = NewRegisterValue; } else if(IndexOfRegister == UE_EDI) { - DBGContext.Edi = NewRegisterValue; + titcontext.cdi = NewRegisterValue; } else if(IndexOfRegister == UE_ESI) { - DBGContext.Esi = NewRegisterValue; + titcontext.csi = NewRegisterValue; } else if(IndexOfRegister == UE_EBP) { - DBGContext.Ebp = NewRegisterValue; + titcontext.cbp = NewRegisterValue; } else if(IndexOfRegister == UE_ESP) { - DBGContext.Esp = NewRegisterValue; + titcontext.csp = NewRegisterValue; } else if(IndexOfRegister == UE_EIP) { - DBGContext.Eip = NewRegisterValue; + titcontext.cip = NewRegisterValue; } else if(IndexOfRegister == UE_EFLAGS) { - DBGContext.EFlags = NewRegisterValue; + titcontext.eflags = NewRegisterValue; } else if(IndexOfRegister == UE_CIP) { - DBGContext.Eip = NewRegisterValue; + titcontext.cip = NewRegisterValue; } else if(IndexOfRegister == UE_CSP) { - DBGContext.Esp = NewRegisterValue; + titcontext.csp = NewRegisterValue; } #endif else if(IndexOfRegister == UE_DR0) { - DBGContext.Dr0 = NewRegisterValue; + titcontext.dr0 = NewRegisterValue; } else if(IndexOfRegister == UE_DR1) { - DBGContext.Dr1 = NewRegisterValue; + titcontext.dr1 = NewRegisterValue; } else if(IndexOfRegister == UE_DR2) { - DBGContext.Dr2 = NewRegisterValue; + titcontext.dr2 = NewRegisterValue; } else if(IndexOfRegister == UE_DR3) { - DBGContext.Dr3 = NewRegisterValue; + titcontext.dr3 = NewRegisterValue; } else if(IndexOfRegister == UE_DR6) { - DBGContext.Dr6 = NewRegisterValue; + titcontext.dr6 = NewRegisterValue; } else if(IndexOfRegister == UE_DR7) { - DBGContext.Dr7 = NewRegisterValue; + titcontext.dr7 = NewRegisterValue; } else if(IndexOfRegister == UE_SEG_GS) { - DBGContext.SegGs = (WORD)NewRegisterValue; + titcontext.gs = (unsigned short)NewRegisterValue; } else if(IndexOfRegister == UE_SEG_FS) { - DBGContext.SegFs = (WORD)NewRegisterValue; + titcontext.fs = (unsigned short)NewRegisterValue; } else if(IndexOfRegister == UE_SEG_ES) { - DBGContext.SegEs = (WORD)NewRegisterValue; + titcontext.es = (unsigned short)NewRegisterValue; } else if(IndexOfRegister == UE_SEG_DS) { - DBGContext.SegDs = (WORD)NewRegisterValue; + titcontext.ds = (unsigned short)NewRegisterValue; } else if(IndexOfRegister == UE_SEG_CS) { - DBGContext.SegCs = (WORD)NewRegisterValue; + titcontext.cs = (unsigned short)NewRegisterValue; } else if(IndexOfRegister == UE_SEG_SS) { - DBGContext.SegSs = (WORD)NewRegisterValue; + titcontext.ss = (unsigned short)NewRegisterValue; } else { @@ -688,14 +819,11 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD return false; } - if(SetThreadContext(hActiveThread, &DBGContext)) - { - ResumeThread(hActiveThread); - return true; - } + returnf = _SetFullContextDataEx(hActiveThread, &titcontext); ResumeThread(hActiveThread); - return false; + + return returnf; } __declspec(dllexport) bool TITCALL SetContextData(DWORD IndexOfRegister, ULONG_PTR NewRegisterValue) diff --git a/TitanEngine/definitions.h b/TitanEngine/definitions.h index 608d039..7c2d1c9 100644 --- a/TitanEngine/definitions.h +++ b/TitanEngine/definitions.h @@ -180,6 +180,8 @@ __declspec(dllexport) bool TITCALL SetMemoryBPXEx(ULONG_PTR MemoryStart, SIZE_T __declspec(dllexport) bool TITCALL RemoveMemoryBPX(ULONG_PTR MemoryStart, SIZE_T SizeOfMemory); __declspec(dllexport) bool TITCALL GetContextFPUDataEx(HANDLE hActiveThread, void* FPUSaveArea); __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_t* titcontext); +__declspec(dllexport) void TITCALL Getx87FPURegisters(x87FPURegister_t x87FPURegisters[8], TITAN_ENGINE_CONTEXT_t* titcontext); +__declspec(dllexport) void TITCALL GetMMXRegisters(uint64_t mmx[8], TITAN_ENGINE_CONTEXT_t* titcontext); __declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister); __declspec(dllexport) ULONG_PTR TITCALL GetContextData(DWORD IndexOfRegister); __declspec(dllexport) bool TITCALL SetContextFPUDataEx(HANDLE hActiveThread, void* FPUSaveArea); diff --git a/TitanEngine/stdafx.h b/TitanEngine/stdafx.h index d5bb54a..f37bced 100644 --- a/TitanEngine/stdafx.h +++ b/TitanEngine/stdafx.h @@ -94,18 +94,18 @@ typedef struct { BYTE data[10]; int st_value; + int tag; } x87FPURegister_t; typedef struct { - DWORD ControlWord; - DWORD StatusWord; - DWORD TagWord; + WORD ControlWord; + WORD StatusWord; + WORD TagWord; DWORD ErrorOffset; DWORD ErrorSelector; DWORD DataOffset; DWORD DataSelector; - x87FPURegister_t x87FPURegister[8]; DWORD Cr0NpxState; } x87FPU_t; @@ -146,7 +146,6 @@ typedef struct BYTE RegisterArea[80]; x87FPU_t x87fpu; DWORD MxCsr; - uint64_t mmx[8]; #ifdef _WIN64 M128A XmmRegisters[16]; #else // x86 @@ -621,6 +620,15 @@ typedef struct #define UE_SEG_CS 41 #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 + typedef struct { DWORD PE32Offset; From 650bb5a46b80283d934ecf7c0c786d8947879e60 Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Mon, 27 Oct 2014 08:03:11 +0100 Subject: [PATCH 2/4] las fpu changes --- SDK/C/TitanEngine.h | 45 ++++ TitanEngine/TitanEngine.Debugger.Context.cpp | 249 ++++++++++++++----- TitanEngine/stdafx.h | 37 ++- 3 files changed, 269 insertions(+), 62 deletions(-) diff --git a/SDK/C/TitanEngine.h b/SDK/C/TitanEngine.h index f111e4e..3c5bf42 100644 --- a/SDK/C/TitanEngine.h +++ b/SDK/C/TitanEngine.h @@ -253,6 +253,51 @@ #define UE_SEG_DS 40 #define UE_SEG_CS 41 #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 #define CONTEXT_EXTENDED_REGISTERS 0 diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp index f9a7779..51f8e69 100644 --- a/TitanEngine/TitanEngine.Debugger.Context.cpp +++ b/TitanEngine/TitanEngine.Debugger.Context.cpp @@ -293,239 +293,254 @@ __declspec(dllexport) bool TITCALL GetFullContextDataEx(HANDLE hActiveThread, TI __declspec(dllexport) ULONG_PTR TITCALL GetContextDataEx(HANDLE hActiveThread, DWORD IndexOfRegister) { ULONG_PTR retValue = 0; - CONTEXT DBGContext; - memset(&DBGContext, 0, sizeof(CONTEXT)); - - DBGContext.ContextFlags = CONTEXT_ALL; + TITAN_ENGINE_CONTEXT_t titcontext; if(SuspendThread(hActiveThread) == (DWORD) - 1) - return retValue; + return false; - if(!GetThreadContext(hActiveThread, &DBGContext)) + memset(&titcontext, 0, sizeof(titcontext)); + + if(! _GetFullContextDataEx(hActiveThread, & titcontext)) { ResumeThread(hActiveThread); - return retValue; + return false; } ResumeThread(hActiveThread); #ifdef _WIN64 //x64 if(IndexOfRegister == UE_EAX) { - retValue = DBGContext.Rax & 0xFFFFFFFF; + retValue = titcontext.cax & 0xFFFFFFFF; } else if(IndexOfRegister == UE_EBX) { - retValue = DBGContext.Rbx & 0xFFFFFFFF; + retValue = titcontext.cbx & 0xFFFFFFFF; } else if(IndexOfRegister == UE_ECX) { - retValue = DBGContext.Rcx & 0xFFFFFFFF; + retValue = titcontext.ccx & 0xFFFFFFFF; } else if(IndexOfRegister == UE_EDX) { - retValue = DBGContext.Rdx & 0xFFFFFFFF; + retValue = titcontext.cdx & 0xFFFFFFFF; } else if(IndexOfRegister == UE_EDI) { - retValue = DBGContext.Rdi & 0xFFFFFFFF; + retValue = titcontext.cdi & 0xFFFFFFFF; } else if(IndexOfRegister == UE_ESI) { - retValue = DBGContext.Rsi & 0xFFFFFFFF; + retValue = titcontext.csi & 0xFFFFFFFF; } else if(IndexOfRegister == UE_EBP) { - retValue = DBGContext.Rbp & 0xFFFFFFFF; + retValue = titcontext.cbp & 0xFFFFFFFF; } else if(IndexOfRegister == UE_ESP) { - retValue = DBGContext.Rsp & 0xFFFFFFFF; + retValue = titcontext.csp & 0xFFFFFFFF; } else if(IndexOfRegister == UE_EIP) { - retValue = DBGContext.Rip & 0xFFFFFFFF; + retValue = titcontext.cip & 0xFFFFFFFF; } else if(IndexOfRegister == UE_EFLAGS) { - retValue = DBGContext.EFlags & 0xFFFFFFFF; + retValue = titcontext.eflags & 0xFFFFFFFF; } else if(IndexOfRegister == UE_RAX) { - retValue = DBGContext.Rax; + retValue = titcontext.cax; } else if(IndexOfRegister == UE_RBX) { - retValue = DBGContext.Rbx; + retValue = titcontext.cbx; } else if(IndexOfRegister == UE_RCX) { - retValue = DBGContext.Rcx; + retValue = titcontext.ccx; } else if(IndexOfRegister == UE_RDX) { - retValue = DBGContext.Rdx; + retValue = titcontext.cdx; } else if(IndexOfRegister == UE_RDI) { - retValue = DBGContext.Rdi; + retValue = titcontext.cdi; } else if(IndexOfRegister == UE_RSI) { - retValue = DBGContext.Rsi; + retValue = titcontext.csi; } else if(IndexOfRegister == UE_RBP) { - retValue = DBGContext.Rbp; + retValue = titcontext.cbp; } else if(IndexOfRegister == UE_RSP) { - retValue = DBGContext.Rsp; + retValue = titcontext.csp; } else if(IndexOfRegister == UE_RIP) { - retValue = DBGContext.Rip; + retValue = titcontext.cip; } else if(IndexOfRegister == UE_RFLAGS) { - retValue = DBGContext.EFlags; + retValue = titcontext.eflags; } else if(IndexOfRegister == UE_R8) { - retValue = DBGContext.R8; + retValue = titcontext.r8; } else if(IndexOfRegister == UE_R9) { - retValue = DBGContext.R9; + retValue = titcontext.r9; } else if(IndexOfRegister == UE_R10) { - retValue = DBGContext.R10; + retValue = titcontext.r10; } else if(IndexOfRegister == UE_R11) { - retValue = DBGContext.R11; + retValue = titcontext.r11; } else if(IndexOfRegister == UE_R12) { - retValue = DBGContext.R12; + retValue = titcontext.r12; } else if(IndexOfRegister == UE_R13) { - retValue = DBGContext.R13; + retValue = titcontext.r13; } else if(IndexOfRegister == UE_R14) { - retValue = DBGContext.R14; + retValue = titcontext.r14; } else if(IndexOfRegister == UE_R15) { - retValue = DBGContext.R15; + retValue = titcontext.r15; } else if(IndexOfRegister == UE_CIP) { - retValue = DBGContext.Rip; + retValue = titcontext.cip; } else if(IndexOfRegister == UE_CSP) { - retValue = DBGContext.Rsp; + retValue = titcontext.csp; } #else //x86 if(IndexOfRegister == UE_EAX) { - retValue = DBGContext.Eax; + retValue = titcontext.cax; } else if(IndexOfRegister == UE_EBX) { - retValue = DBGContext.Ebx; + retValue = titcontext.cbx; } else if(IndexOfRegister == UE_ECX) { - retValue = DBGContext.Ecx; + retValue = titcontext.ccx; } else if(IndexOfRegister == UE_EDX) { - retValue = DBGContext.Edx; + retValue = titcontext.cdx; } else if(IndexOfRegister == UE_EDI) { - retValue = DBGContext.Edi; + retValue = titcontext.cdi; } else if(IndexOfRegister == UE_ESI) { - retValue = DBGContext.Esi; + retValue = titcontext.csi; } else if(IndexOfRegister == UE_EBP) { - retValue = DBGContext.Ebp; + retValue = titcontext.cbp; } else if(IndexOfRegister == UE_ESP) { - retValue = DBGContext.Esp; + retValue = titcontext.csp; } else if(IndexOfRegister == UE_EIP) { - retValue = DBGContext.Eip; + retValue = titcontext.cip; } else if(IndexOfRegister == UE_CIP) { - retValue = DBGContext.Eip; + retValue = titcontext.cip; } else if(IndexOfRegister == UE_CSP) { - retValue = DBGContext.Esp; + retValue = titcontext.csp; } #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) { - retValue = DBGContext.EFlags; + retValue = titcontext.eflags; } else if(IndexOfRegister == UE_DR0) { - retValue = DBGContext.Dr0; + retValue = titcontext.dr0; } else if(IndexOfRegister == UE_DR1) { - retValue = DBGContext.Dr1; + retValue = titcontext.dr1; } else if(IndexOfRegister == UE_DR2) { - retValue = DBGContext.Dr2; + retValue = titcontext.dr2; } else if(IndexOfRegister == UE_DR3) { - retValue = DBGContext.Dr3; + retValue = titcontext.dr3; } else if(IndexOfRegister == UE_DR6) { - retValue = DBGContext.Dr6; + retValue = titcontext.dr6; } else if(IndexOfRegister == UE_DR7) { - retValue = DBGContext.Dr7; + retValue = titcontext.dr7; } else if(IndexOfRegister == UE_SEG_GS) { - retValue = DBGContext.SegGs; + retValue = titcontext.gs; } else if(IndexOfRegister == UE_SEG_FS) { - retValue = DBGContext.SegFs; + retValue = titcontext.fs; } else if(IndexOfRegister == UE_SEG_ES) { - retValue = DBGContext.SegEs; + retValue = titcontext.es; } else if(IndexOfRegister == UE_SEG_DS) { - retValue = DBGContext.SegDs; + retValue = titcontext.ds; } else if(IndexOfRegister == UE_SEG_CS) { - retValue = DBGContext.SegCs; + retValue = titcontext.cs; } else if(IndexOfRegister == UE_SEG_SS) { - retValue = DBGContext.SegSs; + retValue = titcontext.ss; } return retValue; } @@ -715,6 +730,38 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD { 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 if(IndexOfRegister == UE_EAX) { @@ -813,6 +860,86 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD { 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 { ResumeThread(hActiveThread); diff --git a/TitanEngine/stdafx.h b/TitanEngine/stdafx.h index f37bced..de93123 100644 --- a/TitanEngine/stdafx.h +++ b/TitanEngine/stdafx.h @@ -619,7 +619,6 @@ typedef struct #define UE_SEG_DS 40 #define UE_SEG_CS 41 #define UE_SEG_SS 42 - #define UE_x87_r0 43 #define UE_x87_r1 44 #define UE_x87_r2 45 @@ -628,6 +627,42 @@ typedef struct #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 typedef struct { From 71b5f65fbc952295ebfb07bd7415a05454b9529b Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Sun, 2 Nov 2014 00:31:43 +0100 Subject: [PATCH 3/4] last fpu changes - ended basic first version --- TitanEngine/Global.Engine.Threading.h | 2 +- TitanEngine/TitanEngine.Debugger.Context.cpp | 72 +++++++++++++++++--- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/TitanEngine/Global.Engine.Threading.h b/TitanEngine/Global.Engine.Threading.h index 1882d16..2b39b6d 100644 --- a/TitanEngine/Global.Engine.Threading.h +++ b/TitanEngine/Global.Engine.Threading.h @@ -4,7 +4,7 @@ #define GetSTInTOPStackFromStatusWord(StatusWord) ((StatusWord & 0x3800) >> 11) #define Getx87r0PositionInRegisterArea(STInTopStack) ((8 - STInTopStack) % 8) #define Calculatex87registerPositionInRegisterArea(x87r0_position, index) (((x87r0_position + index) % 8)) -#define GetRegisterAreaOf87register(register_area, x87r0_position, index) (((char *) register_area) + 10 * Calculatex87registerPositionInRegisterArea(x87r0_position, i) ) +#define GetRegisterAreaOf87register(register_area, x87r0_position, index) (((char *) register_area) + 10 * Calculatex87registerPositionInRegisterArea(x87r0_position, index) ) #define GetSTValueFromIndex(x87r0_position, index) ((x87r0_position + index) % 8) enum CriticalSectionLock diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp index 51f8e69..390f367 100644 --- a/TitanEngine/TitanEngine.Debugger.Context.cpp +++ b/TitanEngine/TitanEngine.Debugger.Context.cpp @@ -910,35 +910,91 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD } else if(IndexOfRegister == UE_MMX0) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX1) { - memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX2) { - memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX3) { - memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX4) { - memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX5) { - memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX6) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX7) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 10); + memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + } + else if(IndexOfRegister == UE_x87_r0) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 0)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r1) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 1)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r2) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 2)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r3) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 3)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r4) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 4)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r5) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 5)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r6) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 6)), (char*) NewRegisterValue, 10); + } + else if(IndexOfRegister == UE_x87_r7) + { + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 7)), (char*) NewRegisterValue, 10); } else { From dce958c74836b2dc7b3022775883e1c0de773d3a Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Sun, 2 Nov 2014 01:45:41 +0100 Subject: [PATCH 4/4] fix a bug in MMX get --- TitanEngine/TitanEngine.Debugger.Context.cpp | 40 ++++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/TitanEngine/TitanEngine.Debugger.Context.cpp b/TitanEngine/TitanEngine.Debugger.Context.cpp index 390f367..bcc4084 100644 --- a/TitanEngine/TitanEngine.Debugger.Context.cpp +++ b/TitanEngine/TitanEngine.Debugger.Context.cpp @@ -910,35 +910,59 @@ __declspec(dllexport) bool TITCALL SetContextDataEx(HANDLE hActiveThread, DWORD } else if(IndexOfRegister == UE_MMX0) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 0)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX1) { - memcpy(&(titcontext.RegisterArea[1 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 1)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX2) { - memcpy(&(titcontext.RegisterArea[2 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 2)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX3) { - memcpy(&(titcontext.RegisterArea[3 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 3)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX4) { - memcpy(&(titcontext.RegisterArea[4 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 4)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX5) { - memcpy(&(titcontext.RegisterArea[5 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 5)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX6) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 6)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_MMX7) { - memcpy(&(titcontext.RegisterArea[0 * 10]), (void*) NewRegisterValue, 8); + int STInTopStack = GetSTInTOPStackFromStatusWord(titcontext.x87fpu.StatusWord); + DWORD x87r0_position = Getx87r0PositionInRegisterArea(STInTopStack); + + memcpy(((uint64_t*) GetRegisterAreaOf87register(titcontext.RegisterArea, x87r0_position, 7)), (char*) NewRegisterValue, 8); } else if(IndexOfRegister == UE_x87_r0) {