1
0
Fork 0

DBG+BRIDGE+GUI: no more TitanEngine in the bridge (added separate structures + translation functions)

This commit is contained in:
Mr. eXoDia 2014-11-10 14:36:46 +01:00
parent 3394b99aa7
commit 6c33a17858
4 changed files with 220 additions and 91 deletions

View File

@ -2,7 +2,6 @@
#define _BRIDGEMAIN_H_
#include <windows.h>
#include "..\x64_dbg_dbg\TitanEngine\TitanEngine.h"
#ifndef __cplusplus
#include <stdbool.h>
@ -386,7 +385,7 @@ typedef struct
bool IE;
unsigned short RC;
} MxCsr_FIELDS_t;
} MXCSRFIELDS;
typedef struct
{
@ -406,7 +405,7 @@ typedef struct
unsigned short TOP;
} x87StatusWord_FIELDS_t;
} X87STATUSWORDFIELDS;
typedef struct
{
@ -422,17 +421,80 @@ typedef struct
unsigned short RC;
unsigned short PC;
} x87ControlWord_FIELDS_t;
} X87CONTROLWORDFIELDS;
typedef struct
{
TITAN_ENGINE_CONTEXT_t titcontext;
BYTE data[10];
int st_value;
int tag;
} X87FPUREGISTER;
typedef struct
{
WORD ControlWord;
WORD StatusWord;
WORD TagWord;
DWORD ErrorOffset;
DWORD ErrorSelector;
DWORD DataOffset;
DWORD DataSelector;
DWORD Cr0NpxState;
} X87FPU;
typedef struct
{
ULONG_PTR cax;
ULONG_PTR ccx;
ULONG_PTR cdx;
ULONG_PTR cbx;
ULONG_PTR csp;
ULONG_PTR cbp;
ULONG_PTR csi;
ULONG_PTR cdi;
#ifdef _WIN64
ULONG_PTR r8;
ULONG_PTR r9;
ULONG_PTR r10;
ULONG_PTR r11;
ULONG_PTR r12;
ULONG_PTR r13;
ULONG_PTR r14;
ULONG_PTR r15;
#endif //_WIN64
ULONG_PTR cip;
ULONG_PTR eflags;
unsigned short gs;
unsigned short fs;
unsigned short es;
unsigned short ds;
unsigned short cs;
unsigned short ss;
ULONG_PTR dr0;
ULONG_PTR dr1;
ULONG_PTR dr2;
ULONG_PTR dr3;
ULONG_PTR dr6;
ULONG_PTR dr7;
BYTE RegisterArea[80];
X87FPU x87fpu;
DWORD MxCsr;
#ifdef _WIN64
M128A XmmRegisters[16];
#else // x86
M128A XmmRegisters[8];
#endif
} REGISTERCONTEXT;
typedef struct
{
REGISTERCONTEXT regcontext;
FLAGS flags;
x87FPURegister_t x87FPURegisters[8];
uint64_t mmx[8];
MxCsr_FIELDS_t MxCsrFields;
x87StatusWord_FIELDS_t x87StatusWordFields;
x87ControlWord_FIELDS_t x87ControlWordFields;
X87FPUREGISTER x87FPURegisters[8];
unsigned long long mmx[8];
MXCSRFIELDS MxCsrFields;
X87STATUSWORDFIELDS x87StatusWordFields;
X87CONTROLWORDFIELDS x87ControlWordFields;
} REGDUMP;
typedef struct

View File

@ -333,7 +333,7 @@ extern "C" DLL_EXPORT int _dbg_bpgettypeat(duint addr)
return cacheResult;
}
void GetMxCsrFields(MxCsr_FIELDS_t* MxCsrFields, DWORD MxCsr)
static void GetMxCsrFields(MXCSRFIELDS* MxCsrFields, DWORD MxCsr)
{
MxCsrFields->DAZ = valmxcsrflagfromstring(MxCsr, "DAZ");
MxCsrFields->DE = valmxcsrflagfromstring(MxCsr, "DE");
@ -353,7 +353,7 @@ void GetMxCsrFields(MxCsr_FIELDS_t* MxCsrFields, DWORD MxCsr)
MxCsrFields->RC = valmxcsrfieldfromstring(MxCsr, "RC");
}
void Getx87ControlWordFields(x87ControlWord_FIELDS_t* x87ControlWordFields, WORD ControlWord)
static void Getx87ControlWordFields(X87CONTROLWORDFIELDS* x87ControlWordFields, WORD ControlWord)
{
x87ControlWordFields->DM = valx87controlwordflagfromstring(ControlWord, "DM");
x87ControlWordFields->IC = valx87controlwordflagfromstring(ControlWord, "IC");
@ -368,7 +368,7 @@ void Getx87ControlWordFields(x87ControlWord_FIELDS_t* x87ControlWordFields, WORD
x87ControlWordFields->PC = valx87controlwordfieldfromstring(ControlWord, "PC");
}
void Getx87StatusWordFields(x87StatusWord_FIELDS_t* x87StatusWordFields, WORD StatusWord)
static void Getx87StatusWordFields(X87STATUSWORDFIELDS* x87StatusWordFields, WORD StatusWord)
{
x87StatusWordFields->B = valx87statuswordflagfromstring(StatusWord, "B");
x87StatusWordFields->C0 = valx87statuswordflagfromstring(StatusWord, "C0");
@ -387,6 +387,71 @@ void Getx87StatusWordFields(x87StatusWord_FIELDS_t* x87StatusWordFields, WORD St
x87StatusWordFields->TOP = valx87statuswordfieldfromstring(StatusWord, "TOP");
}
static void TranslateTitanFpu(const x87FPU_t* titanfpu, X87FPU* fpu)
{
fpu->ControlWord = titanfpu->ControlWord;
fpu->StatusWord = titanfpu->StatusWord;
fpu->TagWord = titanfpu->TagWord;
fpu->ErrorOffset = titanfpu->ErrorOffset;
fpu->ErrorSelector = titanfpu->ErrorSelector;
fpu->DataOffset = titanfpu->DataOffset;
fpu->DataSelector = titanfpu->DataSelector;
fpu->Cr0NpxState = titanfpu->Cr0NpxState;
}
static void TranslateTitanContextToRegContext(const TITAN_ENGINE_CONTEXT_t* titcontext, REGISTERCONTEXT* regcontext)
{
regcontext->cax = titcontext->cax;
regcontext->ccx = titcontext->ccx;
regcontext->cdx = titcontext->cdx;
regcontext->cbx = titcontext->cbx;
regcontext->csp = titcontext->csp;
regcontext->cbp = titcontext->cbp;
regcontext->csi = titcontext->csi;
regcontext->cdi = titcontext->cdi;
#ifdef _WIN64
regcontext->r8 = titcontext->r8;
regcontext->r9 = titcontext->r9;
regcontext->r10 = titcontext->r10;
regcontext->r11 = titcontext->r11;
regcontext->r12 = titcontext->r12;
regcontext->r13 = titcontext->r13;
regcontext->r14 = titcontext->r14;
regcontext->r15 = titcontext->r15;
#endif //_WIN64
regcontext->cip = titcontext->cip;
regcontext->eflags = titcontext->eflags;
regcontext->gs = titcontext->gs;
regcontext->fs = titcontext->fs;
regcontext->es = titcontext->es;
regcontext->ds = titcontext->ds;
regcontext->cs = titcontext->cs;
regcontext->ss = titcontext->ss;
regcontext->dr0 = titcontext->dr0;
regcontext->dr1 = titcontext->dr1;
regcontext->dr2 = titcontext->dr2;
regcontext->dr3 = titcontext->dr3;
regcontext->dr6 = titcontext->dr6;
regcontext->dr7 = titcontext->dr7;
memcpy(regcontext->RegisterArea, titcontext->RegisterArea, sizeof(regcontext->RegisterArea));
TranslateTitanFpu(&titcontext->x87fpu, &regcontext->x87fpu);
regcontext->MxCsr = titcontext->MxCsr;
memcpy(regcontext->XmmRegisters, titcontext->XmmRegisters, sizeof(regcontext->XmmRegisters));
}
static void TranslateTitanFpuRegister(const x87FPURegister_t* titanReg, X87FPUREGISTER* reg)
{
memcpy(reg->data, titanReg->data, sizeof(reg->data));
reg->st_value = titanReg->st_value;
reg->tag = titanReg->tag;
}
static void TranslateTitanFpuRegisters(const x87FPURegister_t titanFpu[8], X87FPUREGISTER fpu[8])
{
for(int i = 0; i < 8; i++)
TranslateTitanFpuRegister(&titanFpu[i], &fpu[i]);
}
extern "C" DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump)
{
if(!DbgIsDebugging())
@ -395,10 +460,12 @@ extern "C" DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump)
return true;
}
if(!GetFullContextDataEx(hActiveThread, & (regdump->titcontext)))
TITAN_ENGINE_CONTEXT_t titcontext;
if(!GetFullContextDataEx(hActiveThread, &titcontext))
return false;
TranslateTitanContextToRegContext(&titcontext, &regdump->regcontext);
duint cflags = regdump->titcontext.eflags;
duint cflags = regdump->regcontext.eflags;
regdump->flags.c = valflagfromstring(cflags, "cf");
regdump->flags.p = valflagfromstring(cflags, "pf");
regdump->flags.a = valflagfromstring(cflags, "af");
@ -409,12 +476,14 @@ extern "C" DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump)
regdump->flags.d = valflagfromstring(cflags, "df");
regdump->flags.o = valflagfromstring(cflags, "of");
Getx87FPURegisters(regdump->x87FPURegisters, & (regdump->titcontext));
GetMMXRegisters(regdump->mmx, & (regdump->titcontext));
GetMxCsrFields(& (regdump->MxCsrFields), regdump->titcontext.MxCsr);
Getx87ControlWordFields(& (regdump->x87ControlWordFields), regdump->titcontext.x87fpu.ControlWord);
Getx87StatusWordFields(& (regdump->x87StatusWordFields), regdump->titcontext.x87fpu.StatusWord);
x87FPURegister_t x87FPURegisters[8];
Getx87FPURegisters(x87FPURegisters, &titcontext);
TranslateTitanFpuRegisters(x87FPURegisters, regdump->x87FPURegisters);
GetMMXRegisters(regdump->mmx, &titcontext);
GetMxCsrFields(& (regdump->MxCsrFields), regdump->regcontext.MxCsr);
Getx87ControlWordFields(& (regdump->x87ControlWordFields), regdump->regcontext.x87fpu.ControlWord);
Getx87StatusWordFields(& (regdump->x87StatusWordFields), regdump->regcontext.x87fpu.StatusWord);
return true;
}

View File

@ -158,19 +158,19 @@ void CPUSideBar::paintEvent(QPaintEvent* event)
const int_t cur_VA = CodePtr->getBase() + InstrBuffer->at(line).rva;
#ifdef _WIN64
if(cur_VA == regDump.titcontext.cax) drawLabel(&painter, line, "RAX");
if(cur_VA == regDump.titcontext.cbx) drawLabel(&painter, line, "RBX");
if(cur_VA == regDump.titcontext.ccx) drawLabel(&painter, line, "RCX");
if(cur_VA == regDump.titcontext.cdx) drawLabel(&painter, line, "RDX");
if(cur_VA == regDump.titcontext.csi) drawLabel(&painter, line, "RSI");
if(cur_VA == regDump.titcontext.cdi) drawLabel(&painter, line, "RDI");
if(cur_VA == regDump.regcontext.cax) drawLabel(&painter, line, "RAX");
if(cur_VA == regDump.regcontext.cbx) drawLabel(&painter, line, "RBX");
if(cur_VA == regDump.regcontext.ccx) drawLabel(&painter, line, "RCX");
if(cur_VA == regDump.regcontext.cdx) drawLabel(&painter, line, "RDX");
if(cur_VA == regDump.regcontext.csi) drawLabel(&painter, line, "RSI");
if(cur_VA == regDump.regcontext.cdi) drawLabel(&painter, line, "RDI");
#else //x86
if(cur_VA == regDump.titcontext.cax) drawLabel(&painter, line, "EAX");
if(cur_VA == regDump.titcontext.cbx) drawLabel(&painter, line, "EBX");
if(cur_VA == regDump.titcontext.ccx) drawLabel(&painter, line, "ECX");
if(cur_VA == regDump.titcontext.cdx) drawLabel(&painter, line, "EDX");
if(cur_VA == regDump.titcontext.csi) drawLabel(&painter, line, "ESI");
if(cur_VA == regDump.titcontext.cdi) drawLabel(&painter, line, "EDI");
if(cur_VA == regDump.regcontext.cax) drawLabel(&painter, line, "EAX");
if(cur_VA == regDump.regcontext.cbx) drawLabel(&painter, line, "EBX");
if(cur_VA == regDump.regcontext.ccx) drawLabel(&painter, line, "ECX");
if(cur_VA == regDump.regcontext.cdx) drawLabel(&painter, line, "EDX");
if(cur_VA == regDump.regcontext.csi) drawLabel(&painter, line, "ESI");
if(cur_VA == regDump.regcontext.cdi) drawLabel(&painter, line, "EDI");
#endif
}

View File

@ -5,7 +5,7 @@
#include "LineEditDialog.h"
#include "SelectFields.h"
#include <QMessageBox>
#include <ctype.h>
#include <stdint.h>
void RegistersView::SetChangeButton(QPushButton* push_button)
{
@ -1250,8 +1250,6 @@ QString RegistersView::getRegisterLabel(REGISTER_NAME register_selected)
return newText;
}
#include <limits>
#include <cmath>
double readFloat80(const uint8_t buffer[10])
{
/*
@ -1643,7 +1641,7 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value)
if(mRegisterUpdates.contains(x87SW_TOP))
p->setPen(ConfigColor("RegistersModifiedColor"));
newText = QString("ST%1 ").arg(((x87FPURegister_t*) registerValue(&wRegDumpStruct, reg))->st_value);
newText = QString("ST%1 ").arg(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->st_value);
width = newText.length() * mCharWidth;
p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText);
@ -1686,7 +1684,7 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value)
p->setPen(ConfigColor("RegistersModifiedColor"));
}
newText += GetTagWordStateString(((x87FPURegister_t*) registerValue(&wRegDumpStruct, reg))->tag) + QString(" ");
newText += GetTagWordStateString(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->tag) + QString(" ");
width = newText.length() * mCharWidth;
p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText);
@ -1700,7 +1698,7 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value)
if(DbgIsDebugging() && mRegisterUpdates.contains(reg))
p->setPen(ConfigColor("RegistersModifiedColor"));
newText += QString::number(readFloat80(((x87FPURegister_t*) registerValue(&wRegDumpStruct, reg))->data));
newText += QString::number(readFloat80(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->data));
width = newText.length() * mCharWidth;
p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText);
}
@ -2146,26 +2144,26 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
static int null_value = 0;
// this is probably the most efficient general method to access the values of the struct
// TODO: add an array with something like: return array[reg].data, this is more fast :-)
if(reg == CAX) return (char*) & (regd->titcontext.cax);
if(reg == CBX) return (char*) & (regd->titcontext.cbx);
if(reg == CCX) return (char*) & (regd->titcontext.ccx);
if(reg == CDX) return (char*) & (regd->titcontext.cdx);
if(reg == CSI) return (char*) & (regd->titcontext.csi);
if(reg == CDI) return (char*) & (regd->titcontext.cdi);
if(reg == CBP) return (char*) & (regd->titcontext.cbp);
if(reg == CSP) return (char*) & (regd->titcontext.csp);
if(reg == CAX) return (char*) & (regd->regcontext.cax);
if(reg == CBX) return (char*) & (regd->regcontext.cbx);
if(reg == CCX) return (char*) & (regd->regcontext.ccx);
if(reg == CDX) return (char*) & (regd->regcontext.cdx);
if(reg == CSI) return (char*) & (regd->regcontext.csi);
if(reg == CDI) return (char*) & (regd->regcontext.cdi);
if(reg == CBP) return (char*) & (regd->regcontext.cbp);
if(reg == CSP) return (char*) & (regd->regcontext.csp);
if(reg == CIP) return (char*) & (regd->titcontext.cip);
if(reg == EFLAGS) return (char*) & (regd->titcontext.eflags);
if(reg == CIP) return (char*) & (regd->regcontext.cip);
if(reg == EFLAGS) return (char*) & (regd->regcontext.eflags);
#ifdef _WIN64
if(reg == R8) return (char*) & (regd->titcontext.r8);
if(reg == R9) return (char*) & (regd->titcontext.r9);
if(reg == R10) return (char*) & (regd->titcontext.r10);
if(reg == R11) return (char*) & (regd->titcontext.r11);
if(reg == R12) return (char*) & (regd->titcontext.r12);
if(reg == R13) return (char*) & (regd->titcontext.r13);
if(reg == R14) return (char*) & (regd->titcontext.r14);
if(reg == R15) return (char*) & (regd->titcontext.r15);
if(reg == R8) return (char*) & (regd->regcontext.r8);
if(reg == R9) return (char*) & (regd->regcontext.r9);
if(reg == R10) return (char*) & (regd->regcontext.r10);
if(reg == R11) return (char*) & (regd->regcontext.r11);
if(reg == R12) return (char*) & (regd->regcontext.r12);
if(reg == R13) return (char*) & (regd->regcontext.r13);
if(reg == R14) return (char*) & (regd->regcontext.r14);
if(reg == R15) return (char*) & (regd->regcontext.r15);
#endif
// CF,PF,AF,ZF,SF,TF,IF,DF,OF
if(reg == CF) return (char*) & (regd->flags.c);
@ -2179,19 +2177,19 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
if(reg == OF) return (char*) & (regd->flags.o);
// GS,FS,ES,DS,CS,SS
if(reg == GS) return (char*) & (regd->titcontext.gs);
if(reg == FS) return (char*) & (regd->titcontext.fs);
if(reg == ES) return (char*) & (regd->titcontext.es);
if(reg == DS) return (char*) & (regd->titcontext.ds);
if(reg == CS) return (char*) & (regd->titcontext.cs);
if(reg == SS) return (char*) & (regd->titcontext.ss);
if(reg == GS) return (char*) & (regd->regcontext.gs);
if(reg == FS) return (char*) & (regd->regcontext.fs);
if(reg == ES) return (char*) & (regd->regcontext.es);
if(reg == DS) return (char*) & (regd->regcontext.ds);
if(reg == CS) return (char*) & (regd->regcontext.cs);
if(reg == SS) return (char*) & (regd->regcontext.ss);
if(reg == DR0) return (char*) & (regd->titcontext.dr0);
if(reg == DR1) return (char*) & (regd->titcontext.dr1);
if(reg == DR2) return (char*) & (regd->titcontext.dr2);
if(reg == DR3) return (char*) & (regd->titcontext.dr3);
if(reg == DR6) return (char*) & (regd->titcontext.dr6);
if(reg == DR7) return (char*) & (regd->titcontext.dr7);
if(reg == DR0) return (char*) & (regd->regcontext.dr0);
if(reg == DR1) return (char*) & (regd->regcontext.dr1);
if(reg == DR2) return (char*) & (regd->regcontext.dr2);
if(reg == DR3) return (char*) & (regd->regcontext.dr3);
if(reg == DR6) return (char*) & (regd->regcontext.dr6);
if(reg == DR7) return (char*) & (regd->regcontext.dr7);
if(reg == MM0) return (char*) & (regd->mmx[0]);
if(reg == MM1) return (char*) & (regd->mmx[1]);
@ -2211,9 +2209,9 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
if(reg == x87r6) return (char*) & (regd->x87FPURegisters[6]);
if(reg == x87r7) return (char*) & (regd->x87FPURegisters[7]);
if(reg == x87TagWord) return (char*) & (regd->titcontext.x87fpu.TagWord);
if(reg == x87TagWord) return (char*) & (regd->regcontext.x87fpu.TagWord);
if(reg == x87ControlWord) return (char*) & (regd->titcontext.x87fpu.ControlWord);
if(reg == x87ControlWord) return (char*) & (regd->regcontext.x87fpu.ControlWord);
if(reg == x87TW_0) return (char*) & (regd->x87FPURegisters[0].tag);
if(reg == x87TW_1) return (char*) & (regd->x87FPURegisters[1].tag);
@ -2235,7 +2233,7 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
if(reg == x87CW_RC) return (char*) & (regd->x87ControlWordFields.RC);
if(reg == x87CW_PC) return (char*) & (regd->x87ControlWordFields.PC);
if(reg == x87StatusWord) return (char*) & (regd->titcontext.x87fpu.StatusWord);
if(reg == x87StatusWord) return (char*) & (regd->regcontext.x87fpu.StatusWord);
if(reg == x87SW_B) return (char*) & (regd->x87StatusWordFields.B);
if(reg == x87SW_C3) return (char*) & (regd->x87StatusWordFields.C3);
@ -2252,7 +2250,7 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
if(reg == x87SW_C0) return (char*) & (regd->x87StatusWordFields.C0);
if(reg == x87SW_TOP) return (char*) & (regd->x87StatusWordFields.TOP);
if(reg == MxCsr) return (char*) & (regd->titcontext.MxCsr);
if(reg == MxCsr) return (char*) & (regd->regcontext.MxCsr);
if(reg == MxCsr_FZ) return (char*) & (regd->MxCsrFields.FZ);
if(reg == MxCsr_PM) return (char*) & (regd->MxCsrFields.PM);
@ -2270,22 +2268,22 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
if(reg == MxCsr_IE) return (char*) & (regd->MxCsrFields.IE);
if(reg == MxCsr_RC) return (char*) & (regd->MxCsrFields.RC);
if(reg == XMM0) return (char*) & (regd->titcontext.XmmRegisters[0]);
if(reg == XMM1) return (char*) & (regd->titcontext.XmmRegisters[1]);
if(reg == XMM2) return (char*) & (regd->titcontext.XmmRegisters[2]);
if(reg == XMM3) return (char*) & (regd->titcontext.XmmRegisters[3]);
if(reg == XMM4) return (char*) & (regd->titcontext.XmmRegisters[4]);
if(reg == XMM5) return (char*) & (regd->titcontext.XmmRegisters[5]);
if(reg == XMM6) return (char*) & (regd->titcontext.XmmRegisters[6]);
if(reg == XMM7) return (char*) & (regd->titcontext.XmmRegisters[7]);
if(reg == XMM8) return (char*) & (regd->titcontext.XmmRegisters[8]);
if(reg == XMM9) return (char*) & (regd->titcontext.XmmRegisters[9]);
if(reg == XMM10) return (char*) & (regd->titcontext.XmmRegisters[10]);
if(reg == XMM11) return (char*) & (regd->titcontext.XmmRegisters[11]);
if(reg == XMM12) return (char*) & (regd->titcontext.XmmRegisters[12]);
if(reg == XMM13) return (char*) & (regd->titcontext.XmmRegisters[13]);
if(reg == XMM14) return (char*) & (regd->titcontext.XmmRegisters[14]);
if(reg == XMM15) return (char*) & (regd->titcontext.XmmRegisters[15]);
if(reg == XMM0) return (char*) & (regd->regcontext.XmmRegisters[0]);
if(reg == XMM1) return (char*) & (regd->regcontext.XmmRegisters[1]);
if(reg == XMM2) return (char*) & (regd->regcontext.XmmRegisters[2]);
if(reg == XMM3) return (char*) & (regd->regcontext.XmmRegisters[3]);
if(reg == XMM4) return (char*) & (regd->regcontext.XmmRegisters[4]);
if(reg == XMM5) return (char*) & (regd->regcontext.XmmRegisters[5]);
if(reg == XMM6) return (char*) & (regd->regcontext.XmmRegisters[6]);
if(reg == XMM7) return (char*) & (regd->regcontext.XmmRegisters[7]);
if(reg == XMM8) return (char*) & (regd->regcontext.XmmRegisters[8]);
if(reg == XMM9) return (char*) & (regd->regcontext.XmmRegisters[9]);
if(reg == XMM10) return (char*) & (regd->regcontext.XmmRegisters[10]);
if(reg == XMM11) return (char*) & (regd->regcontext.XmmRegisters[11]);
if(reg == XMM12) return (char*) & (regd->regcontext.XmmRegisters[12]);
if(reg == XMM13) return (char*) & (regd->regcontext.XmmRegisters[13]);
if(reg == XMM14) return (char*) & (regd->regcontext.XmmRegisters[14]);
if(reg == XMM15) return (char*) & (regd->regcontext.XmmRegisters[15]);
return (char*) & null_value;
}
@ -2293,11 +2291,11 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
void RegistersView::setRegisters(REGDUMP* reg)
{
// tests if new-register-value == old-register-value holds
if(mCip != reg->titcontext.cip) //CIP changed
if(mCip != reg->regcontext.cip) //CIP changed
{
wCipRegDumpStruct = wRegDumpStruct;
mRegisterUpdates.clear();
mCip = reg->titcontext.cip;
mCip = reg->regcontext.cip;
}
QMap<REGISTER_NAME, QString>::const_iterator it = mRegisterMapping.begin();
@ -2314,7 +2312,7 @@ void RegistersView::setRegisters(REGDUMP* reg)
// now we can save the values
wRegDumpStruct = (*reg);
if(mCip != reg->titcontext.cip)
if(mCip != reg->regcontext.cip)
wCipRegDumpStruct = wRegDumpStruct;
// force repaint