HRESULT STDMETHODCALLTYPE CLiveExdiGdbSrvServer::SetContextEx()

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;
}