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); } }