public void ScanImageSymbol(Program program, ImageSymbol sym, bool isEntryPoint)
{
try
{
Address addr = sym.Address;
Procedure proc;
if (program.Procedures.TryGetValue(addr, out proc))
return; // Already scanned. Do nothing.
if (sym.NoDecompile || IsNoDecompiledProcedure(addr))
return;
proc = EnsureProcedure(addr, sym.Name);
if (sym.Signature != null)
{
var sser = program.CreateProcedureSerializer();
proc.Signature = sser.Deserialize(sym.Signature, proc.Frame);
}
else if (sym.Name != null)
{
var exp = program.Platform.SignatureFromName(sym.Name);
if (exp != null)
{
proc.Name = exp.Name;
proc.Signature = exp.Signature;
proc.EnclosingType = exp.EnclosingType;
}
else
{
proc.Name = sym.Name;
}
}
//if (sp.Characteristics != null)
//{
// proc.Characteristics = sp.Characteristics;
//}
var pb = ScanProcedure(sym.Address, sym.Name, sym.ProcessorState);
proc = pb as Procedure;
if (isEntryPoint && proc != null)
{
program.CallGraph.AddEntryPoint(proc);
}
}
catch (AddressCorrelatedException aex)
{
Error(aex.Address, aex.Message);
}
}