mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
Parameters with persist property
This commit is contained in:
parent
84e4b8c6fe
commit
7329198ad7
10 changed files with 96 additions and 36 deletions
|
@ -3182,9 +3182,10 @@ void FuncProto::cancelInjectId(void)
|
|||
/// given a list of Varnodes and their associated trial information,
|
||||
/// create an input parameter for each trial in order, grabbing data-type
|
||||
/// information from the Varnode. Any old input parameters are cleared.
|
||||
/// \param data is the function containing the trial Varnodes
|
||||
/// \param triallist is the list of Varnodes
|
||||
/// \param activeinput is the trial container
|
||||
void FuncProto::updateInputTypes(const vector<Varnode *> &triallist,ParamActive *activeinput)
|
||||
void FuncProto::updateInputTypes(Funcdata &data,const vector<Varnode *> &triallist,ParamActive *activeinput)
|
||||
|
||||
{
|
||||
if (isInputLocked()) return; // Input is locked, do no updating
|
||||
|
@ -3195,15 +3196,25 @@ void FuncProto::updateInputTypes(const vector<Varnode *> &triallist,ParamActive
|
|||
ParamTrial &trial(activeinput->getTrial(i));
|
||||
if (trial.isUsed()) {
|
||||
Varnode *vn = triallist[trial.getSlot()-1];
|
||||
if (!vn->isMark()) {
|
||||
ParameterPieces pieces;
|
||||
if (vn->isMark()) continue;
|
||||
ParameterPieces pieces;
|
||||
if (vn->isPersist()) {
|
||||
int4 sz;
|
||||
pieces.addr = data.findDisjointCover(vn, sz);
|
||||
if (sz == vn->getSize())
|
||||
pieces.type = vn->getHigh()->getType();
|
||||
else
|
||||
pieces.type = data.getArch()->types->getBase(sz, TYPE_UNKNOWN);
|
||||
pieces.flags = 0;
|
||||
}
|
||||
else {
|
||||
pieces.addr = trial.getAddress();
|
||||
pieces.type = vn->getHigh()->getType();
|
||||
pieces.flags = 0;
|
||||
store->setInput(count,"",pieces);
|
||||
count += 1;
|
||||
vn->setMark(); // Make sure vn is used only once
|
||||
}
|
||||
store->setInput(count,"",pieces);
|
||||
count += 1;
|
||||
vn->setMark();
|
||||
}
|
||||
}
|
||||
for(int4 i=0;i<triallist.size();++i)
|
||||
|
@ -3215,29 +3226,36 @@ void FuncProto::updateInputTypes(const vector<Varnode *> &triallist,ParamActive
|
|||
/// This is accomplished in the same way as if there were data-types but instead of
|
||||
/// pulling a data-type from the Varnode, only the size is used.
|
||||
/// Undefined data-types are pulled from the given TypeFactory
|
||||
/// \param data is the function containing the trial Varnodes
|
||||
/// \param triallist is the list of Varnodes
|
||||
/// \param activeinput is the trial container
|
||||
/// \param factory is the given TypeFactory
|
||||
void FuncProto::updateInputNoTypes(const vector<Varnode *> &triallist,ParamActive *activeinput,
|
||||
TypeFactory *factory)
|
||||
void FuncProto::updateInputNoTypes(Funcdata &data,const vector<Varnode *> &triallist,ParamActive *activeinput)
|
||||
{
|
||||
if (isInputLocked()) return; // Input is locked, do no updating
|
||||
store->clearAllInputs();
|
||||
int4 count = 0;
|
||||
int4 numtrials = activeinput->getNumTrials();
|
||||
TypeFactory *factory = data.getArch()->types;
|
||||
for(int4 i=0;i<numtrials;++i) {
|
||||
ParamTrial &trial(activeinput->getTrial(i));
|
||||
if (trial.isUsed()) {
|
||||
Varnode *vn = triallist[trial.getSlot()-1];
|
||||
if (!vn->isMark()) {
|
||||
ParameterPieces pieces;
|
||||
pieces.type = factory->getBase(vn->getSize(),TYPE_UNKNOWN);
|
||||
pieces.addr = trial.getAddress();
|
||||
if (vn->isMark()) continue;
|
||||
ParameterPieces pieces;
|
||||
if (vn->isPersist()) {
|
||||
int4 sz;
|
||||
pieces.addr = data.findDisjointCover(vn, sz);
|
||||
pieces.type = factory->getBase(sz, TYPE_UNKNOWN);
|
||||
pieces.flags = 0;
|
||||
store->setInput(count,"",pieces);
|
||||
count += 1;
|
||||
vn->setMark(); // Make sure vn is used only once
|
||||
}
|
||||
else {
|
||||
pieces.addr = trial.getAddress();
|
||||
pieces.type = factory->getBase(vn->getSize(),TYPE_UNKNOWN);
|
||||
pieces.flags = 0;
|
||||
}
|
||||
store->setInput(count,"",pieces);
|
||||
count += 1;
|
||||
vn->setMark(); // Make sure vn is used only once
|
||||
}
|
||||
}
|
||||
for(int4 i=0;i<triallist.size();++i)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue