1
0
Fork 0
x64dbg/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp

211 lines
6.8 KiB
C++

#include "ThreadView.h"
ThreadView::ThreadView(StdTable *parent) : StdTable(parent)
{
int charwidth=QFontMetrics(this->font()).width(QChar(' '));
addColumnAt(8+charwidth*sizeof(unsigned int)*2, "Number", false);
addColumnAt(8+charwidth*sizeof(unsigned int)*2, "ID", false);
addColumnAt(8+charwidth*sizeof(uint_t)*2, "Entry", false);
addColumnAt(8+charwidth*sizeof(uint_t)*2, "TEB", false);
#ifdef _WIN64
addColumnAt(8+charwidth*sizeof(uint_t)*2, "RIP", false);
#else
addColumnAt(8+charwidth*sizeof(uint_t)*2, "EIP", false);
#endif //_WIN64
addColumnAt(8+charwidth*14, "Suspend Count", false);
addColumnAt(8+charwidth*12, "Priority", false);
addColumnAt(8+charwidth*16, "WaitReason", false);
addColumnAt(8+charwidth*10, "LastError", false);
addColumnAt(0, "", false);
connect(Bridge::getBridge(), SIGNAL(updateThreads()), this, SLOT(updateThreadList()));
}
void ThreadView::updateThreadList()
{
THREADLIST threadList;
memset(&threadList, 0, sizeof(THREADLIST));
DbgGetThreadList(&threadList);
setRowCount(threadList.count);
for(int i=0; i<threadList.count; i++)
{
if(!threadList.list[i].BasicInfo.ThreadNumber)
setCellContent(i, 0, "Main");
else
setCellContent(i, 0, QString("%1").arg(threadList.list[i].BasicInfo.ThreadNumber, 0, 10));
setCellContent(i, 1, QString("%1").arg(threadList.list[i].BasicInfo.dwThreadId, 0, 16).toUpper());
setCellContent(i, 2, QString("%1").arg(threadList.list[i].BasicInfo.ThreadStartAddress, sizeof(int_t) * 2, 16, QChar('0')).toUpper());
setCellContent(i, 3, QString("%1").arg(threadList.list[i].BasicInfo.ThreadLocalBase, sizeof(int_t) * 2, 16, QChar('0')).toUpper());
setCellContent(i, 4, QString("%1").arg(threadList.list[i].ThreadCip, sizeof(int_t) * 2, 16, QChar('0')).toUpper());
setCellContent(i, 5, QString("%1").arg(threadList.list[i].SuspendCount, 0, 10));
QString priorityString;
switch(threadList.list[i].Priority)
{
case PriorityIdle:
priorityString="Idle";
break;
case PriorityAboveNormal:
priorityString="AboveNormal";
break;
case PriorityBelowNormal:
priorityString="BelowNormal";
break;
case PriorityHighest:
priorityString="Highest";
break;
case PriorityLowest:
priorityString="Lowest";
break;
case PriorityNormal:
priorityString="Normal";
break;
case PriorityTimeCritical:
priorityString="TimeCritical";
break;
default:
priorityString="Unknown";
break;
}
setCellContent(i, 6, priorityString);
QString waitReasonString;
switch(threadList.list[i].WaitReason)
{
case Executive:
waitReasonString="Executive";
break;
case FreePage:
waitReasonString="FreePage";
break;
case PageIn:
waitReasonString="PageIn";
break;
case PoolAllocation:
waitReasonString="PoolAllocation";
break;
case DelayExecution:
waitReasonString="DelayExecution";
break;
case Suspended:
waitReasonString="Suspended";
break;
case UserRequest:
waitReasonString="UserRequest";
break;
case WrExecutive:
waitReasonString="WrExecutive";
break;
case WrFreePage:
waitReasonString="WrFreePage";
break;
case WrPageIn:
waitReasonString="WrPageIn";
break;
case WrPoolAllocation:
waitReasonString="WrPoolAllocation";
break;
case WrDelayExecution:
waitReasonString="WrDelayExecution";
break;
case WrSuspended:
waitReasonString="WrSuspended";
break;
case WrUserRequest:
waitReasonString="WrUserRequest";
break;
case WrEventPair:
waitReasonString="WrEventPair";
break;
case WrQueue:
waitReasonString="WrQueue";
break;
case WrLpcReceive:
waitReasonString="WrLpcReceive";
break;
case WrLpcReply:
waitReasonString="WrLpcReply";
break;
case WrVirtualMemory:
waitReasonString="WrVirtualMemory";
break;
case WrPageOut:
waitReasonString="WrPageOut";
break;
case WrRendezvous:
waitReasonString="WrRendezvous";
break;
case Spare2:
waitReasonString="Spare2";
break;
case Spare3:
waitReasonString="Spare3";
break;
case Spare4:
waitReasonString="Spare4";
break;
case Spare5:
waitReasonString="Spare5";
break;
case WrCalloutStack:
waitReasonString="WrCalloutStack";
break;
case WrKernel:
waitReasonString="WrKernel";
break;
case WrResource:
waitReasonString="WrResource";
break;
case WrPushLock:
waitReasonString="WrPushLock";
break;
case WrMutex:
waitReasonString="WrMutex";
break;
case WrQuantumEnd:
waitReasonString="WrQuantumEnd";
break;
case WrDispatchInt:
waitReasonString="WrDispatchInt";
break;
case WrPreempted:
waitReasonString="WrPreempted";
break;
case WrYieldExecution:
waitReasonString="WrYieldExecution";
break;
case WrFastMutex:
waitReasonString="WrFastMutex";
break;
case WrGuardedMutex:
waitReasonString="WrGuardedMutex";
break;
case WrRundown:
waitReasonString="WrRundown";
break;
default:
waitReasonString="Unknown";
break;
}
setCellContent(i, 7, waitReasonString);
setCellContent(i, 8, QString("%1").arg(threadList.list[i].LastError, sizeof(unsigned int) * 2, 16, QChar('0')).toUpper());
}
if(threadList.count)
BridgeFree(threadList.list);
mCurrentThread=threadList.CurrentThread;
reloadData();
}
QString ThreadView::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h)
{
QString ret=StdTable::paintContent(painter, rowBase, rowOffset, col, x, y, w, h);
if(rowBase+rowOffset==mCurrentThread && !col)
{
painter->save();
painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000")));
painter->setPen(QPen(QColor("#FFFFFF"))); //white text
painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, ret);
painter->restore();
ret="";
}
return ret;
}