mirror of https://github.com/x64dbg/GleeBug
50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
#include "Debugger.Thread.h"
|
|
|
|
namespace GleeBug
|
|
{
|
|
ThreadInfo::ThreadInfo()
|
|
{
|
|
this->hThread = INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
ThreadInfo::ThreadInfo(DWORD dwThreadId, LPVOID lpThreadLocalBase, LPVOID lpStartAddress)
|
|
{
|
|
this->dwThreadId = dwThreadId;
|
|
this->hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwThreadId);
|
|
this->lpThreadLocalBase = (ULONG_PTR)lpThreadLocalBase;
|
|
this->lpStartAddress = (ULONG_PTR)lpStartAddress;
|
|
}
|
|
|
|
ThreadInfo::~ThreadInfo()
|
|
{
|
|
if (this->hThread != INVALID_HANDLE_VALUE)
|
|
CloseHandle(this->hThread);
|
|
}
|
|
|
|
bool ThreadInfo::RegReadContext()
|
|
{
|
|
SuspendThread(this->hThread);
|
|
memset(&this->_oldContext, 0, sizeof(CONTEXT));
|
|
this->_oldContext.ContextFlags = CONTEXT_ALL;
|
|
bool bReturn = false;
|
|
if (GetThreadContext(this->hThread, &this->_oldContext))
|
|
{
|
|
this->registers.SetContext(this->_oldContext);
|
|
bReturn = true;
|
|
}
|
|
ResumeThread(this->hThread);
|
|
return bReturn;
|
|
}
|
|
|
|
bool ThreadInfo::RegWriteContext()
|
|
{
|
|
//check if something actually changed
|
|
if (memcmp(&this->_oldContext, this->registers.GetContext(), sizeof(CONTEXT)) == 0)
|
|
return true;
|
|
//update the context
|
|
SuspendThread(this->hThread);
|
|
bool bReturn = !!SetThreadContext(this->hThread, this->registers.GetContext());
|
|
ResumeThread(this->hThread);
|
|
return bReturn;
|
|
}
|
|
}; |