class
RuleVmpStoreVarnode : public Rule {
public:
RuleVmpStoreVarnode(const string& g) : Rule(g,
0
,
"vmpstorevarnode"
) {}
/
/
/
< Constructor
virtual Rule
*
clone(const ActionGroupList& grouplist) const {
if
(!grouplist.contains(getGroup()))
return
(Rule
*
)
0
;
return
new RuleVmpStoreVarnode(getGroup());
}
virtual void getOpList(vector<uint4>& oplist) const;
virtual int4 applyOp(PcodeOp
*
op, Funcdata& data);
};
void RuleVmpStoreVarnode::getOpList(vector<uint4>& oplist) const
{
oplist.push_back(CPUI_STORE);
}
int4 RuleVmpStoreVarnode::applyOp(PcodeOp
*
op, Funcdata& data)
{
VmpStackEvaluator evalCall;
Varnode
*
offvn
=
op
-
>getIn(
1
);
int
stackOffset
=
0x0
;
if
(!evalCall.EvaluateStackOffset(data, offvn, stackOffset)) {
return
0
;
}
int4 size
=
op
-
>getIn(
2
)
-
>getSize();
Address addr(data.getArch()
-
>getStackSpace(), uint32_t(stackOffset));
data.newVarnodeOut(size, addr, op);
op
-
>getOut()
-
>setStackStore();
/
/
Mark as originally coming
from
CPUI_STORE
data.opRemoveInput(op,
1
);
data.opRemoveInput(op,
0
);
data.opSetOpcode(op, CPUI_COPY);
return
1
;
}