public LoadDetails GetLoadDetails() { var config = Services.RequireService <IConfigurationService>(); var rawFileOption = (ListOption)this.RawFileTypes.SelectedValue; string archName = null; string envName = null; string sAddr = null; string loader = null; EntryPointDefinition entry = null; if (rawFileOption != null && rawFileOption.Value != null) { var raw = (RawFileDefinition)rawFileOption.Value; loader = raw.Loader; archName = raw.Architecture; envName = raw.Environment; sAddr = raw.BaseAddress; entry = raw.EntryPoint; } ArchitectureDefinition archOption = this.GetSelectedArchitecture(); PlatformDefinition envOption = this.GetSelectedEnvironment(); archName = archName ?? archOption?.Name; envName = envName ?? envOption?.Name; sAddr = sAddr ?? this.AddressTextBox.Text.Trim(); var arch = config.GetArchitecture(archName); if (arch is null) { throw new InvalidOperationException($"Unable to load {archName} architecture."); } arch.LoadUserOptions(this.ArchitectureOptions); if (!arch.TryParseAddress(sAddr, out var addrBase)) { throw new ApplicationException(string.Format("'{0}' doesn't appear to be a valid address.", sAddr)); } return(new LoadDetails { LoaderName = loader, ArchitectureName = archName, ArchitectureOptions = this.ArchitectureOptions, PlatformName = envName, LoadAddress = sAddr, EntryPoint = entry, }); }
private static WorkUnit?MakeWorkUnit(IConfigurationService cfg, ArchitectureDefinition archDef, int seed) { var arch = cfg.GetArchitecture(archDef.Name !); if (arch is null) { return(null); } var bytes = new byte[MemorySize]; var rnd = new Random(seed); rnd.NextBytes(bytes); var addr = Address.Create(arch.PointerType, 0x0010_0000); var mem = arch.CreateMemoryArea(addr, bytes); return(new WorkUnit(arch, mem, mem.BaseAddress, (int)mem.Length)); }
private void PopulateModels(ArchitectureDefinition arch) { var models = arch.Models.Values .OrderBy(m => m.Name) .Select(m => new ListOption(m.Name, m)) .ToArray(); Debug.Print("PopulateModels: models: {0}", models.Length); if (models.Length > 0) { dlg.ArchitectureModels.Enabled = true; dlg.ArchitectureModels.DataSource = new ArrayList(models); } else { dlg.ArchitectureModels.DataSource = null; dlg.ArchitectureModels.Enabled = false; } }
private static void TestArchitecture(RekoConfigurationService cfg, ArchitectureDefinition archDef) { Console.Out.WriteLine("= Testing {0} ============", archDef.Description); var work = MakeWorkUnit(cfg, archDef, 42); if (work is null) { Console.Out.WriteLine("*** Failed to load {0}", archDef.Name); return; } var factories = new RewriterTaskFactory[] { new LinearTaskFactory(), new ShingleTaskFactory(), new LinearShingleTaskFactory() }; foreach (var factory in factories) { CollectStatistics(work, factory); } }
public bool OpenBinaryAs(string initialFilename) { IOpenAsDialog dlg = null; IProcessorArchitecture arch = null; try { dlg = dlgFactory.CreateOpenAsDialog(); dlg.FileName.Text = initialFilename; dlg.Services = sc; dlg.ArchitectureOptions = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); if (uiSvc.ShowModalDialog(dlg) != DialogResult.OK) { return(false); } var rawFileOption = (ListOption)dlg.RawFileTypes.SelectedValue; string archName = null; string envName = null; string sAddr = null; string loader = null; EntryPointDefinition entry = null; if (rawFileOption != null && rawFileOption.Value != null) { var raw = (RawFileDefinition)rawFileOption.Value; loader = raw.Loader; archName = raw.Architecture; envName = raw.Environment; sAddr = raw.BaseAddress; entry = raw.EntryPoint; } ArchitectureDefinition archOption = dlg.GetSelectedArchitecture(); PlatformDefinition envOption = dlg.GetSelectedEnvironment(); archName = archName ?? archOption?.Name; envName = envName ?? envOption?.Name; sAddr = sAddr ?? dlg.AddressTextBox.Text.Trim(); arch = config.GetArchitecture(archName); if (arch == null) { throw new InvalidOperationException(string.Format("Unable to load {0} architecture.", archName)); } arch.LoadUserOptions(dlg.ArchitectureOptions); if (!arch.TryParseAddress(sAddr, out var addrBase)) { throw new ApplicationException(string.Format("'{0}' doesn't appear to be a valid address.", sAddr)); } var details = new LoadDetails { LoaderName = loader, ArchitectureName = archName, ArchitectureOptions = dlg.ArchitectureOptions, PlatformName = envName, LoadAddress = sAddr, EntryPoint = entry, }; OpenBinary(dlg.FileName.Text, (f) => pageInitial.OpenBinaryAs(f, details), f => false); } catch (Exception ex) { uiSvc.ShowError( ex, string.Format("An error occurred when opening the binary file {0}.", dlg.FileName.Text)); } return(true); }