1
0
Fork 0

DBG+BRIDGE+GUI: deprecate DbgGetRegDump

This commit is contained in:
Duncan Ogilvie 2017-10-29 02:18:06 +02:00
parent ec0555dc0d
commit 2f26a80b78
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
11 changed files with 59 additions and 57 deletions

View File

@ -29,7 +29,7 @@ typedef bool (*DBGADDRINFOGET)(duint addr, SEGMENTREG segment, BRIDGE_ADDRINFO*
typedef bool (*DBGADDRINFOSET)(duint addr, BRIDGE_ADDRINFO* addrinfo);
typedef bool(*DBGENCODETYPESET)(duint addr, duint size, ENCODETYPE type);
typedef BPXTYPE(*DBGBPGETTYPEAT)(duint addr);
typedef bool (*DBGGETREGDUMP)(REGDUMP* regdump, size_t size);
typedef bool (*DBGGETREGDUMP)(REGDUMP* regdump);
typedef bool (*DBGVALTOSTRING)(const char* string, duint value);
typedef bool (*DBGMEMISVALIDREADPTR)(duint addr);
typedef int (*DBGGETBPLIST)(BPXTYPE type, BPMAP* bplist);

View File

@ -463,14 +463,39 @@ BRIDGE_IMPEXP duint DbgValFromString(const char* string)
return value;
}
BRIDGE_IMPEXP bool DbgGetRegDump(REGDUMP* regdump)
//deprecated api, only provided for binary compatibility
extern "C" __declspec(dllexport) bool DbgGetRegDump(REGDUMP* regdump)
{
return _dbg_getregdump(regdump, sizeof(REGDUMP));
typedef struct
{
REGISTERCONTEXT regcontext;
FLAGS flags;
X87FPUREGISTER x87FPURegisters[8];
unsigned long long mmx[8];
MXCSRFIELDS MxCsrFields;
X87STATUSWORDFIELDS x87StatusWordFields;
X87CONTROLWORDFIELDS x87ControlWordFields;
LASTERROR lastError;
} REGDUMP_OLD;
return DbgGetRegDumpEx(regdump, sizeof(REGDUMP_OLD));
}
BRIDGE_IMPEXP bool DbgGetRegDumpEx(REGDUMP* regdump, size_t size)
{
return _dbg_getregdump(regdump, size);
if(size == sizeof(REGDUMP))
return _dbg_getregdump(regdump);
if(size > sizeof(REGDUMP))
__debugbreak();
REGDUMP temp;
if(!_dbg_getregdump(&temp))
{
memset(regdump, 0, size);
return false;
}
memcpy(regdump, &temp, size);
return true;
}
// FIXME all

View File

@ -761,18 +761,6 @@ typedef struct
char name[128];
} LASTSTATUS;
typedef struct
{
REGISTERCONTEXT regcontext;
FLAGS flags;
X87FPUREGISTER x87FPURegisters[8];
unsigned long long mmx[8];
MXCSRFIELDS MxCsrFields;
X87STATUSWORDFIELDS x87StatusWordFields;
X87CONTROLWORDFIELDS x87ControlWordFields;
LASTERROR lastError;
} REGDUMP;
typedef struct
{
REGISTERCONTEXT regcontext;
@ -784,7 +772,7 @@ typedef struct
X87CONTROLWORDFIELDS x87ControlWordFields;
LASTERROR lastError;
LASTSTATUS lastStatus;
} REGDUMP_V2;
} REGDUMP;
typedef struct
{
@ -944,7 +932,6 @@ BRIDGE_IMPEXP void DbgClearBookmarkRange(duint start, duint end);
BRIDGE_IMPEXP bool DbgGetModuleAt(duint addr, char* text);
BRIDGE_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr);
BRIDGE_IMPEXP duint DbgValFromString(const char* string);
BRIDGE_IMPEXP bool DbgGetRegDump(REGDUMP* regdump);
BRIDGE_IMPEXP bool DbgGetRegDumpEx(REGDUMP* regdump, size_t size);
BRIDGE_IMPEXP bool DbgValToString(const char* string, duint value);
BRIDGE_IMPEXP bool DbgMemIsValidReadPtr(duint addr);

View File

@ -257,7 +257,7 @@ void TraceRecordManager::TraceExecuteRecord(const Capstone & newInstruction)
duint newMemoryAddress[32];
duint oldMemory[32];
unsigned char newMemoryArrayCount = 0;
DbgGetRegDump(&newContext.registers);
DbgGetRegDumpEx(&newContext.registers, sizeof(REGDUMP));
newThreadId = ThreadGetId(hActiveThread);
// Don't try to resolve memory values for lea and nop instructions
if(!(newInstruction.IsNop() || newInstruction.GetId() == X86_INS_LEA))
@ -541,13 +541,12 @@ bool TraceRecordManager::enableRunTrace(bool enabled, const char* fileName)
for(size_t i = 0; i < _countof(rtOldContextChanged); i++)
rtOldContextChanged[i] = true;
dprintf(QT_TRANSLATE_NOOP("DBG", "Run trace started. File: %s\r\n"), fileName);
REGDUMP cip;
Capstone cp;
unsigned char instr[MAX_DISASM_BUFFER];
DbgGetRegDump(&cip);
if(MemRead(cip.regcontext.cip, instr, MAX_DISASM_BUFFER))
auto cip = GetContextDataEx(hActiveThread, UE_CIP);
if(MemRead(cip, instr, MAX_DISASM_BUFFER))
{
cp.DisassembleSafe(cip.regcontext.cip, instr, MAX_DISASM_BUFFER);
cp.DisassembleSafe(cip, instr, MAX_DISASM_BUFFER);
TraceExecuteRecord(cp);
}
GuiOpenTraceFile(fileName);

View File

@ -627,14 +627,11 @@ static void TranslateTitanFpuRegisters(const x87FPURegister_t titanFpu[8], X87FP
TranslateTitanFpuRegister(&titanFpu[i], &fpu[i]);
}
extern "C" DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump, size_t size)
extern "C" DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump)
{
if(size != sizeof(REGDUMP) && size != sizeof(REGDUMP_V2))
return false;
if(!DbgIsDebugging())
{
memset(regdump, 0, size);
memset(regdump, 0, sizeof(REGDUMP));
return true;
}
@ -661,21 +658,18 @@ extern "C" DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump, size_t size)
GetMxCsrFields(& (regdump->MxCsrFields), regdump->regcontext.MxCsr);
Getx87ControlWordFields(& (regdump->x87ControlWordFields), regdump->regcontext.x87fpu.ControlWord);
Getx87StatusWordFields(& (regdump->x87StatusWordFields), regdump->regcontext.x87fpu.StatusWord);
LASTERROR lastError;
memset(&lastError.name, 0, sizeof(lastError.name));
lastError.code = ThreadGetLastError(ThreadGetId(hActiveThread));
strncpy_s(lastError.name, ErrorCodeToName(lastError.code).c_str(), _TRUNCATE);
regdump->lastError = lastError;
if(size >= sizeof(REGDUMP_V2))
{
REGDUMP_V2* regdumpV2 = (REGDUMP_V2*)regdump;
LASTSTATUS lastStatus;
memset(&lastStatus.name, 0, sizeof(lastStatus.name));
lastStatus.code = ThreadGetLastStatus(ThreadGetId(hActiveThread));
strncpy_s(lastStatus.name, NtStatusCodeToName(lastStatus.code).c_str(), _TRUNCATE);
regdumpV2->lastStatus = lastStatus;
}
LASTSTATUS lastStatus;
memset(&lastStatus.name, 0, sizeof(lastStatus.name));
lastStatus.code = ThreadGetLastStatus(ThreadGetId(hActiveThread));
strncpy_s(lastStatus.name, NtStatusCodeToName(lastStatus.code).c_str(), _TRUNCATE);
regdump->lastStatus = lastStatus;
return true;
}

View File

@ -20,7 +20,7 @@ DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, BRIDGE_ADDRINFO
DLL_EXPORT bool _dbg_addrinfoset(duint addr, BRIDGE_ADDRINFO* addrinfo);
DLL_EXPORT bool _dbg_encodetypeset(duint addr, duint size, ENCODETYPE type);
DLL_EXPORT int _dbg_bpgettypeat(duint addr);
DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump, size_t size);
DLL_EXPORT bool _dbg_getregdump(REGDUMP* regdump);
DLL_EXPORT bool _dbg_valtostring(const char* string, duint value);
DLL_EXPORT int _dbg_getbplist(BPXTYPE type, BPMAP* list);
DLL_EXPORT duint _dbg_getbranchdestination(duint addr);

View File

@ -101,8 +101,7 @@ void CPUSideBar::reload()
void CPUSideBar::changeTopmostAddress(dsint i)
{
topVA = i;
memset(&regDump, 0, sizeof(REGDUMP));
DbgGetRegDump(&regDump);
DbgGetRegDumpEx(&regDump, sizeof(REGDUMP));
reload();
}

View File

@ -176,8 +176,7 @@ void LocalVarsView::updateSlot()
return;
}
REGDUMP z;
memset(&z, 0, sizeof(REGDUMP));
DbgGetRegDump(&z);
DbgGetRegDumpEx(&z, sizeof(REGDUMP));
duint start, end;
if(DbgFunctionGet(z.regcontext.cip, &start, &end))

View File

@ -1315,8 +1315,8 @@ RegistersView::RegistersView(CPUWidget* parent) : QScrollArea(parent), mVScrollO
InitMappings();
memset(&wRegDumpStruct, 0, sizeof(REGDUMP_V2));
memset(&wCipRegDumpStruct, 0, sizeof(REGDUMP_V2));
memset(&wRegDumpStruct, 0, sizeof(REGDUMP));
memset(&wCipRegDumpStruct, 0, sizeof(REGDUMP));
mCip = 0;
mRegisterUpdates.clear();
@ -2503,9 +2503,8 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value)
void RegistersView::updateRegistersSlot()
{
// read registers
REGDUMP_V2 z;
memset(&z, 0, sizeof(REGDUMP_V2));
DbgGetRegDumpEx((REGDUMP*)&z, sizeof(REGDUMP_V2));
REGDUMP z;
DbgGetRegDumpEx(&z, sizeof(REGDUMP));
// update gui
setRegisters(&z);
}
@ -3332,7 +3331,7 @@ SIZE_T RegistersView::GetSizeRegister(const REGISTER_NAME reg_name)
return size;
}
int RegistersView::CompareRegisters(const REGISTER_NAME reg_name, REGDUMP_V2* regdump1, REGDUMP_V2* regdump2)
int RegistersView::CompareRegisters(const REGISTER_NAME reg_name, REGDUMP* regdump1, REGDUMP* regdump2)
{
SIZE_T size = GetSizeRegister(reg_name);
char* reg1_data = registerValue(regdump1, reg_name);
@ -3344,7 +3343,7 @@ int RegistersView::CompareRegisters(const REGISTER_NAME reg_name, REGDUMP_V2* re
return -1;
}
char* RegistersView::registerValue(const REGDUMP_V2* regd, const REGISTER_NAME reg)
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
@ -3659,7 +3658,7 @@ char* RegistersView::registerValue(const REGDUMP_V2* regd, const REGISTER_NAME r
return (char*) &null_value;
}
void RegistersView::setRegisters(REGDUMP_V2* reg)
void RegistersView::setRegisters(REGDUMP* reg)
{
// tests if new-register-value == old-register-value holds
if(mCip != reg->regcontext.cip) //CIP changed

View File

@ -139,8 +139,8 @@ protected:
// use-in-class-only methods
void drawRegister(QPainter* p, REGISTER_NAME reg, char* value);
void setRegisters(REGDUMP_V2* reg);
char* registerValue(const REGDUMP_V2* regd, const REGISTER_NAME reg);
void setRegisters(REGDUMP* reg);
char* registerValue(const REGDUMP* regd, const REGISTER_NAME reg);
bool identifyRegister(const int y, const int x, REGISTER_NAME* clickedReg);
QString helpRegister(REGISTER_NAME reg);
void CreateDumpNMenu(QMenu* dumpMenu);
@ -187,7 +187,7 @@ protected slots:
void onSIMDHQWord();
void onClose();
QString getRegisterLabel(REGISTER_NAME);
int CompareRegisters(const REGISTER_NAME reg_name, REGDUMP_V2* regdump1, REGDUMP_V2* regdump2);
int CompareRegisters(const REGISTER_NAME reg_name, REGDUMP* regdump1, REGDUMP* regdump2);
SIZE_T GetSizeRegister(const REGISTER_NAME reg_name);
QString GetRegStringValueFromValue(REGISTER_NAME reg, const char* value);
QString GetTagWordStateString(unsigned short);
@ -247,8 +247,8 @@ private:
// contains viewport positions
QMap<REGISTER_NAME, Register_Position> mRegisterPlaces;
// contains a dump of the current register values
REGDUMP_V2 wRegDumpStruct;
REGDUMP_V2 wCipRegDumpStruct;
REGDUMP wRegDumpStruct;
REGDUMP wCipRegDumpStruct;
// font measures (TODO: create a class that calculates all thos values)
unsigned int mRowHeight, mCharWidth;
// SIMD registers display mode

View File

@ -345,7 +345,7 @@ static bool readBlock(QFile & traceFile)
if(traceFile.seek(traceFile.pos() + skipOffset * sizeof(duint)) == false)
throw std::wstring(L"Unspecified");
//Gathered information, build index
if(changedCountFlags[0] == (sizeof(REGDUMP) - 128) / sizeof(duint))
if(changedCountFlags[0] == (FIELD_OFFSET(REGDUMP, lastError) + sizeof(DWORD)) / sizeof(duint))
return true;
else
return false;
@ -464,7 +464,7 @@ TraceFilePage::TraceFilePage(TraceFileReader* parent, unsigned long long fileOff
union
{
REGDUMP registers;
duint regwords[(sizeof(REGDUMP) - 128) / sizeof(duint)];
duint regwords[(FIELD_OFFSET(REGDUMP, lastError) + sizeof(DWORD)) / sizeof(duint)];
};
unsigned char changed[_countof(regwords)];
duint regContent[_countof(regwords)];