bool InterpreterEmulator::Execute(Expression const& rExpr) { InterpreterExpressionVisitor Visitor(m_Hooks, m_pCpuCtxt, m_pMemCtxt); if (rExpr.Visit(&Visitor) == nullptr) return false; auto RegPc = m_pCpuInfo->GetRegisterByType(CpuInformation::ProgramPointerRegister); auto RegSz = m_pCpuInfo->GetSizeOfRegisterInBit(RegPc) / 8; u64 CurPc = 0; m_pCpuCtxt->ReadRegister(RegPc, &CurPc, RegSz); TestHook(Address(CurPc), Emulator::HookOnExecute); return true; }
bool InterpreterEmulator::Execute(Expression::List const& rExprList) { InterpreterExpressionVisitor Visitor(m_Hooks, m_pCpuCtxt, m_pMemCtxt); for (auto itExpr = std::begin(rExprList); itExpr != std::end(rExprList); ++itExpr) { //Log::Write("interpreter") << "* exec: " << (*itExpr)->ToString() << LogEnd; if ((*itExpr)->Visit(&Visitor) == false) return false; auto RegPc = m_pCpuInfo->GetRegisterByType(CpuInformation::ProgramPointerRegister); auto RegSz = m_pCpuInfo->GetSizeOfRegisterInBit(RegPc) / 8; u64 CurPc = 0; m_pCpuCtxt->ReadRegister(RegPc, &CurPc, RegSz); TestHook(Address(CurPc), Emulator::HookOnExecute); } return true; }
bool InterpreterEmulator::Execute(Address const& rAddress, Expression::List const& rExprList) { InterpreterExpressionVisitor Visitor(m_Hooks, m_pCpuCtxt, m_pMemCtxt, m_pVarCtxt); for (Expression* pExpr : rExprList) { auto pCurExpr = pExpr->Visit(&Visitor); if (pCurExpr == nullptr) return false; auto RegPc = m_pCpuInfo->GetRegisterByType(CpuInformation::ProgramPointerRegister, m_pCpuCtxt->GetMode()); auto RegSz = m_pCpuInfo->GetSizeOfRegisterInBit(RegPc) / 8; u64 CurPc = 0; m_pCpuCtxt->ReadRegister(RegPc, &CurPc, RegSz); TestHook(Address(CurPc), Emulator::HookOnExecute); delete pCurExpr; } return true; }