Example #1
0
        public void ScanImageSymbol(ImageSymbol sym, bool isEntryPoint)
        {
            if (sym.Name != null && sym.Name == "")
            {
                sym.ToString();
            }
            try
            {
                Address addr = sym.Address !;
                if (sym.NoDecompile || IsNoDecompiledProcedure(addr))
                {
                    return;
                }
                Procedure?proc = Program.EnsureProcedure(sym.Architecture, addr, sym.Name);
                if (visitedProcs.Contains(proc))
                {
                    return; // Already scanned. Do nothing.
                }
                if (sym.Signature != null)
                {
                    var sser = Program.CreateProcedureSerializer();
                    proc.Signature = sser.Deserialize(sym.Signature, proc.Frame) !;
                }
                else if (!string.IsNullOrEmpty(sym.Name))
                {
                    var sProc = Program.Platform.SignatureFromName(sym.Name !);
                    if (sProc != null)
                    {
                        var loader = Program.CreateTypeLibraryDeserializer();
                        var exp    = loader.LoadExternalProcedure(sProc);
                        if (exp != null)
                        {
                            proc.Name          = exp !.Name;
                            proc.Signature     = exp.Signature;
                            proc.EnclosingType = exp.EnclosingType;
                        }
                    }
                    else
                    {
                        proc.Name = sym.Name !;
                    }
                }

                var state = sym.ProcessorState ?? sym.Architecture.CreateProcessorState();
                var pb    = ScanProcedure(sym.Architecture, sym.Address !, sym.Name, state);
                proc = pb as Procedure;
                if (isEntryPoint && proc != null)
                {
                    Program.CallGraph.AddEntryPoint(proc);
                }
            }
            catch (AddressCorrelatedException aex)
            {
                Error(aex.Address, aex.Message);
            }
        }