From 1ef361ba10c9d223112662cdbb462d774d399f3a Mon Sep 17 00:00:00 2001 From: dreg_fr33project Date: Sun, 26 Oct 2014 02:28:20 +0200 Subject: [PATCH] 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;