in Exdi/exdigdbsrv/ExdiGdbSrv/LiveExdiGdbSrvServer.cpp [1258:1355]
HRESULT STDMETHODCALLTYPE CLiveExdiGdbSrvServer::SetContextEx(_In_ DWORD processorNumber, _In_ const CONTEXT_X86_64 *pContext)
{
if (pContext == nullptr)
{
return E_POINTER;
}
try
{
AsynchronousGdbSrvController * pController = GetGdbSrvController();
if (pController == nullptr)
{
return E_POINTER;
}
pController->StopTargetAtRun();
std::map<std::string, ULONGLONG> registers;
if (pContext->RegGroupSelection.fIntegerRegs)
{
registers["rax"] = pContext->Rax;
registers["rbx"] = pContext->Rbx;
registers["rcx"] = pContext->Rcx;
registers["rdx"] = pContext->Rdx;
registers["rsi"] = pContext->Rsi;
registers["rdi"] = pContext->Rdi;
registers["rip"] = pContext->Rip;
m_lastPcAddress = pContext->Rip;
registers["rsp"] = pContext->Rsp;
registers["rbp"] = pContext->Rbp;
registers["r8"] = pContext->R8;
registers["r9"] = pContext->R9;
registers["r10"] = pContext->R10;
registers["r11"] = pContext->R11;
registers["r12"] = pContext->R12;
registers["r13"] = pContext->R13;
registers["r14"] = pContext->R14;
registers["r15"] = pContext->R15;
registers["eflags"] = pContext->EFlags;
}
if (pContext->RegGroupSelection.fSegmentRegs)
{
registers["cs"] = pContext->SegCs;
registers["ss"] = pContext->SegSs;
registers["ds"] = pContext->SegDs;
registers["es"] = pContext->SegEs;
registers["fs"] = pContext->SegFs;
registers["gs"] = pContext->SegGs;
}
if (pContext->RegGroupSelection.fSystemRegisters)
{
registers["fctrl"] = pContext->ControlWord;
registers["fstat"] = pContext->StatusWord;
registers["ftag"] = pContext->TagWord;
registers["fioff"] = pContext->ErrorOffset;
registers["fiseg"] = pContext->ErrorSelector;
registers["fooff"] = pContext->DataOffset;
registers["foseg"] = pContext->DataSelector;
}
// Control registers
if (pContext->RegGroupSelection.fSystemRegisters)
{
// Control registers (System registers)
registers["cr0"] = pContext->RegCr0;
registers["cr2"] = pContext->RegCr2;
registers["cr3"] = pContext->RegCr3;
registers["cr4"] = pContext->RegCr4;
registers["cr8"] = pContext->RegCr8;
}
pController->SetRegisters(processorNumber, registers, false);
// Floating point registers
if (pContext->RegGroupSelection.fFloatingPointRegs)
{
for (int index = 0; index < s_numberFPRegList; ++index)
{
std::string regName(s_fpRegList[index]);
registers[regName] = reinterpret_cast<ULONGLONG>(&pContext->RegisterArea[index * s_numberOfBytesCoprocessorRegister]);
}
pController->SetRegisters(processorNumber, registers, true);
}
// SSE x64 registers
if (m_fEnableSSEContext)
{
for (int index = 0; index < s_numberOfSseX64Registers; ++index)
{
std::string regName(s_sseX64RegList[index]);
registers[regName] = reinterpret_cast<ULONGLONG>(&pContext->RegSSE[index]);
}
pController->SetRegisters(processorNumber, registers, true);
}
return S_OK;
}
CATCH_AND_RETURN_HRESULT;
}