void StoreContext(const CONTEXT * ctxt) { vector<REG> regs = GetTestRegs(); int numOfRegs = regs.size(); for (int r = 0; r < numOfRegs; ++r) { REG reg = regs[r]; PIN_GetContextRegval(ctxt, reg, GetRegval(reg)); } }
// There is no verification on the validity of the ID. uint128 PINContextHandler::getSSERegisterValue(uint64 TritRegID) const { REG reg = safecast(PINConverter::convertTritonReg2DBIReg(TritRegID)); uint128 value = 0; PIN_REGISTER tmp; if (!REG_valid(reg) || !(TritRegID >= ID_XMM0 && TritRegID <= ID_XMM15)) throw std::runtime_error("Error: getSSERegisterValue() - Invalid PIN register id."); PIN_GetContextRegval(this->_ctx, reg, reinterpret_cast<uint8 *>(&tmp)); value = *reinterpret_cast<uint128*>(&tmp); return value; }
VOID fn_call(CONTEXT *ctxt, FID fid) { trace_enter(); call_stack.push(fid); UINT64 sp; PIN_GetContextRegval(ctxt, REG_RSP, (UINT8*) &sp); sp_stack.push(sp); nb_call[fid]++; unsigned int param_val_size = 1 + nb_param_int[fid] + nb_param_int_stack[fid]; for (unsigned int pid = 1; pid < param_val_size; pid++) { if (!param_is_not_addr[fid][pid]) add_val(fid, ctxt, pid, sp); } trace_leave(); }
VOID add_val(unsigned int fid, CONTEXT *ctxt, unsigned int pid, UINT64 sp) { trace_enter(); if (param_val[fid][pid]->size() >= MAX_VALS_TO_COLLECT) { trace_leave(); return; } UINT64 val; if (pid < 1 + nb_param_int[fid]) { PIN_GetContextRegval(ctxt, param_reg(pid), (UINT8*) &val); } else { unsigned int sp_offset = pid - (1 + nb_param_int[fid]); UINT64* addr = (UINT64*) (sp + sp_offset * 8); val = *addr; } if (val != 0) param_val[fid][pid]->push_front(val); trace_leave(); }