/// <summary> /// Loads (or assembles) the decompiler project. If a binary file is /// specified instead, we create a simple project for the file. /// </summary> /// <param name="fileName">The filename to load.</param> /// <param name="loaderName">Optional .NET class name of a custom /// image loader</param> /// <returns>True if the file could be loaded.</returns> public bool Load(string fileName, string loaderName = null) { eventListener.ShowStatus("Loading source program."); byte[] image = loader.LoadImageBytes(fileName, 0); var projectLoader = new ProjectLoader(this.services, loader, eventListener); projectLoader.ProgramLoaded += (s, e) => { RunScriptOnProgramImage(e.Program, e.Program.User.OnLoadedScript); }; this.Project = projectLoader.LoadProject(fileName, image); if (Project == null) { var program = loader.LoadExecutable(fileName, image, loaderName, null); if (program == null) { return(false); } this.Project = AddProgramToProject(fileName, program); this.Project.LoadedMetadata = program.Platform.CreateMetadata(); program.EnvironmentMetadata = this.Project.LoadedMetadata; } BuildImageMaps(); eventListener.ShowStatus("Source program loaded."); return(true); }
public void Prld_v2() { var sExp = @"<?xml version=""1.0"" encoding=""utf-8""?> <project xmlns=""http://schemata.jklnet.org/Decompiler/v2""> <input> <filename>/foo/foo</filename> </input> </project>"; var ldr = new Mock <ILoader>(); var platform = new TestPlatform(sc); Given_Binary(ldr, platform); Given_TypeLibraryLoaderService(); cfgSvc.Setup(c => c.GetEnvironment("testOS")).Returns(new PlatformDefinition { }); var prld = new ProjectLoader(sc, ldr.Object, listener.Object); var project = prld.LoadProject("/foo/bar", new MemoryStream(Encoding.UTF8.GetBytes(sExp))); Assert.AreEqual(1, project.Programs.Count); }
public void Prld_v2() { var sExp = @"<?xml version=""1.0"" encoding=""utf-8""?> <project xmlns=""http://schemata.jklnet.org/Decompiler/v2""> <input> </input> </project>"; var ldr = mr.Stub <ILoader>(); var platform = new TestPlatform(sc); Given_Binary(ldr, platform); Given_TypeLibraryLoaderService(); cfgSvc.Stub(c => c.GetEnvironment("testOS")).Return(new OperatingEnvironmentElement { }); mr.ReplayAll(); var prld = new ProjectLoader(sc, ldr, listener); var project = prld.LoadProject("/foo/bar", new MemoryStream(Encoding.UTF8.GetBytes(sExp))); Assert.AreEqual(1, project.Programs.Count); }
private Project LoadProject() { Project project = null; if (configFile != null) { var absFile = FileUnitTester.MapTestPath(configFile); var fsSvc = sc.RequireService <IFileSystemService>(); using (Stream stm = fsSvc.CreateFileStream(absFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { project = new ProjectLoader( null, new Loader(sc), new FakeDecompilerEventListener()) .LoadProject(absFile, stm); } } else { project = new Project(); } return(project); }
public void SudLoadMetadata() { var sProject = new Project_v2 { Inputs = { new MetadataFile_v2 { Filename = "c:\\tmp\\foo.def" } } }; var loader = mr.Stub <ILoader>(); var typelib = new TypeLibrary(); loader.Stub(l => l.LoadMetadata("", null)).IgnoreArguments().Return(typelib); mr.ReplayAll(); var ploader = new ProjectLoader(sc, loader); var project = ploader.LoadProject(sProject); Assert.AreEqual(1, project.MetadataFiles.Count); Assert.AreEqual("c:\\tmp\\foo.def", project.MetadataFiles[0].Filename); }
public void Prld_issue_299() { var sExp = @"<?xml version=""1.0"" encoding=""utf-8""?> <project xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://schemata.jklnet.org/Reko/v3""> <input> <filename>switch.dll</filename> <disassembly>switch.asm</disassembly> <intermediate-code>switch.dis</intermediate-code> <output>switch.c</output> <types-file>switch.h</types-file> <global-vars>switch.globals.c</global-vars> <user> <procedure name=""get""> <address>10071000</address> <CSignature>char * get(unsigned int n)</CSignature> </procedure> <heuristic name=""shingle"" /> </user> </input> </project> "; var ldr = new Mock <ILoader>(); var platform = new TestPlatform(sc); Given_TestArch(); Given_TestOS(); Given_Binary(ldr, platform); Given_TypeLibraryLoaderService(); oe.Setup(o => o.TypeLibraries).Returns(new List <TypeLibraryDefinition>()); oe.Setup(o => o.CharacteristicsLibraries).Returns(new List <TypeLibraryDefinition>()); var prld = new ProjectLoader(sc, ldr.Object, listener.Object); var project = prld.LoadProject("/foo/bar", new MemoryStream(Encoding.UTF8.GetBytes(sExp))); Assert.AreEqual(1, project.Programs.Count); }
public void Prld_PlatformOptions_Dictionary() { var sproject = @"<?xml version=""1.0"" encoding=""utf-8""?> <project xmlns=""http://schemata.jklnet.org/Reko/v4""> <arch>testArch</arch> <platform>testOS</platform> <input> <user> <platform> <dict key=""Names""> <item key=""Adam"">30</item> <item key=""Bob"">10</item> <item key=""Cecil"">120</item> </dict> <item key=""Name2"">Sue</item> </platform> </user> </input> </project>"; var ldr = mr.Stub <ILoader>(); Given_TestArch(); Given_TestOS(); Given_Binary(ldr, platform); Expect_LoadOptions(); mr.ReplayAll(); var prld = new ProjectLoader(sc, ldr); prld.LoadProject("c:\\foo\\bar.proj", new MemoryStream(Encoding.UTF8.GetBytes(sproject))); var list = (IDictionary)loadedOptions["Names"]; Assert.AreEqual(3, list.Count); }
static void Main(string[] args) { CommandLineOptions commandLineOptions = ParseCommandLineOptions(args); ApplicationInitializer appInitializer = new ApplicationInitializer(); Project project = ProjectLoader.LoadFromPath(commandLineOptions.ProjectPath, appInitializer); Type[] extraTypes = appInitializer.ModuleLoader.GetModuleTypeList(); Console.WriteLine("Starting execution of project " + project.ProjectName + "\n"); string[] packagesToRun = String.IsNullOrEmpty(commandLineOptions.Packages) ? project.Packages.Select(t => t.DisplayName).ToArray <string>() : packagesToRun = commandLineOptions.Packages.Split(','); List <Package> packagesToExecute = new List <Package>(); foreach (string packageName in packagesToRun) { Package package = project.Packages.Where(t => t.DisplayName == packageName).FirstOrDefault(); if (package == null) { Console.WriteLine("Package " + packageName + " does not exist in project " + project.ProjectName); Environment.Exit(1); } packagesToExecute.Add(package); } foreach (Package package in packagesToExecute) { Task.Run(() => RunPackage(package, project.Connections, appInitializer.ModuleLoader.Modules, extraTypes)).Wait(); } Console.WriteLine("\nExecution finished"); }
private void LinkLabel5_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { OpenFileDialog opnfd = new OpenFileDialog(); opnfd.Filter = "BUPX Files (*.bupx;)|*.bupx;"; //string dPath = ProjectConfig.projectPath.Replace("temp_", "") + ProjectConfig.projectExtension; if (opnfd.ShowDialog() == DialogResult.OK) { _LoadingDialog ld = new _LoadingDialog(AppMessages.messages["project_loading"]); try { Task.Factory.StartNew(() => { ld.ShowDialog(); }); string proPath = opnfd.FileName; string tempPath = Path.Combine(Path.GetDirectoryName(opnfd.FileName), "~temp_" + opnfd.SafeFileName.Replace(ProjectConfig.projectExtension, "")); ProjectLoader.load(proPath, tempPath); MainWindow mf = new MainWindow(); mf.Show(); t = 1; } catch (Exception ex) { MessageBox.Show("Exception: " + ex.Message); } finally { Invoke(new MethodInvoker(() => { ld.Close(); })); this.Close(); } } }
public void Prld_PlatformOptions_List() { var sExp = @"<?xml version=""1.0"" encoding=""utf-8""?> <project xmlns=""http://schemata.jklnet.org/Reko/v4""> <arch>testArch</arch> <platform>testOS</platform> <input> <user> <platform> <list key=""Names""> <item>Adam</item> <item>Bob</item> <item>Cecil</item> </list> <item key=""Name2"">Sue</item> </platform> </user> </input> </project>"; var ldr = mr.Stub <ILoader>(); Given_TestArch(); Given_TestOS(); Given_Binary(ldr, platform); Expect_LoadOptions(); mr.ReplayAll(); var prld = new ProjectLoader(sc, ldr); prld.LoadProject("/ff/b/foo.proj", new MemoryStream(Encoding.UTF8.GetBytes(sExp))); var list = (IList)loadedOptions["Names"]; Assert.AreEqual(3, list.Count); }
private NHConfigFile GetNhConfigFileFromCsprojFile(string filepath) { nhConfigFile = null; if (!File.Exists(filepath)) { return(null); } try { // Check whether we can find a config file XmlDocument doc = new XmlDocument(); doc.LoadXml(File.ReadAllText(filepath)); CSProjFile csProjFile = new CSProjFile(doc, tbProjectLocation.Text); Slyce.Common.FileController fileController = new FileController(); nhConfigFile = ProjectLoader.GetNhConfigFile(csProjFile, fileController); } catch { // Do nothing. We are probably trying to process a non-XML file. } return(nhConfigFile); }
public void ProjectLoader_Parse_Test() { var projectText = "<Project Sdk=\"Microsoft.NET.Sdk\"> <PropertyGroup> <Version>0.0.0.1</Version> <FileVersion>0.0.0.2</FileVersion> <AssemblyVersion>0.0.0.3</AssemblyVersion> </PropertyGroup>" + " <ItemGroup> <PackageReference Include=\"packageReference1\" Version=\"1.0.0.0\" /> <PackageReference Include=\"packageReference2\" Version=\"1.0.0.1\" /> </ItemGroup>" + " <ItemGroup> <ProjectReference Include=\"..\\projectReference\\projectReference.csproj\" /> </ItemGroup></Project>"; var project = ProjectLoader.Parse(projectText); Assert.Equal(Version.Parse("0.0.0.1"), project.Versions.Version); Assert.Equal(Version.Parse("0.0.0.2"), project.Versions.FileVersion); Assert.Equal(Version.Parse("0.0.0.3"), project.Versions.AssemblyVersion); Assert.Equal(3, project.References.Count); var packageReference1 = project.References.FirstOrDefault(p => p.ReferenceName == "packageReference1"); Assert.NotNull(packageReference1); Assert.Equal(Version.Parse("1.0.0.0"), packageReference1.Version); Assert.Equal("packageReference1", packageReference1.ReferenceName); Assert.Equal(ReferenceType.Package, packageReference1.ReferenceType); var packageReference2 = project.References.FirstOrDefault(p => p.ReferenceName == "packageReference2"); Assert.NotNull(packageReference2); Assert.Equal("packageReference2", packageReference2.ReferenceName); Assert.Equal(Version.Parse("1.0.0.1"), packageReference2.Version); Assert.Equal(ReferenceType.Package, packageReference2.ReferenceType); var projectReference = project.References.FirstOrDefault(p => p.ReferenceName == "projectReference"); Assert.NotNull(projectReference); Assert.Equal(ReferenceType.Project, projectReference.ReferenceType); Assert.Equal("projectReference", projectReference.ReferenceName); Assert.Equal("..\\projectReference\\projectReference.csproj", projectReference.ReferenceFullName); }
public void Setup() { project = new ProjectLoader(File.ReadAllText(GetCSProjFile("testproject2.csproj.txt")), GetCSProjFile("testproject2.csproj.txt")); }
public void SudLoadProgramOptions() { var sProject = new Project_v4 { ArchitectureName = "testArch", PlatformName = "testOS", Inputs = { new DecompilerInput_v4 { User = new UserData_v4 { Heuristics = { new Heuristic_v3 { Name = "HeuristicScanning" } }, TextEncoding = "windows-1251", Calls = { new SerializedCall_v1 { InstructionAddress = "0041230", NoReturn = true, } }, RegisterValues = new RegisterValue_v2[] { new RegisterValue_v2 { Address = "00443210", Register = "eax", Value = "42" }, new RegisterValue_v2 { Address = "00443210", Register = "ecx", Value = "10" }, } } } } }; Given_Architecture(); Given_TestOS_Platform(); Expect_TryParseAddress("0041230", Address.Ptr32(0x0041230)); Expect_TryParseAddress("00443210", Address.Ptr32(0x00443210)); arch.Stub(a => a.GetRegister("eax")).Return(new RegisterStorage("eax", 0, 0, PrimitiveType.Word32)); arch.Stub(a => a.GetRegister("ecx")).Return(new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32)); var loader = mr.Stub <ILoader>(); loader.Stub(l => l.LoadImageBytes(null, 0)) .IgnoreArguments() .Return(new byte[10]); loader.Stub(l => l.LoadExecutable(null, null, null, null)) .IgnoreArguments() .Return(new Program { Platform = this.platform, }); mr.ReplayAll(); var ploader = new ProjectLoader(sc, loader, listener); var project = ploader.LoadProject("c:\\tmp\\foo\\bar.proj", sProject); Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning")); Assert.AreEqual("windows-1251", project.Programs[0].User.TextEncoding.WebName); Assert.AreEqual(1, project.Programs[0].User.RegisterValues.Count); Assert.AreEqual(2, project.Programs[0].User.RegisterValues[Address.Ptr32(0x00443210)].Count); }
public override void RunCustomNewProjectLogic(ArchAngel.Interfaces.ProviderInfo theProviderInfo, IUserInteractor userInteractor) { NHibernateHelper.ProviderInfo providerInfo = (NHibernateHelper.ProviderInfo)theProviderInfo; providerInfo.Clear(); providerInfo.NhConfigFile = this.NhConfigFile; userInteractor.ShowWaitScreen("Loading from your existing NHibernate project"); // Run this in its own thread BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (s, args) => { try { var loader = new ProjectLoader(new FileController(), new IUserInteractorProgressUpdatorAdapter(userInteractor), userInteractor); var result = loader.LoadEntityModelFromCSProj(Filename, this.NhConfigFile); args.Result = new RunResult { MappingSet = result.MappingSet, DatabaseLoader = result.DatabaseLoader, NhConfigFile = result.NhConfigFile, CsProjFile = result.CsProjFile }; } catch (NHibernateLoaderException e) { //var sb = new StringBuilder(); //sb.Append("The HBM files [").Append(e.Filenames).AppendLine( // "] could not be loaded due to the following errors:"); //e.Errors.ForEach(err => sb.AppendLine(err.Message)); //sb.AppendLine("Please send this file to [email protected] so we can make our HBM Loader better."); args.Result = new RunResult { ErrorOccurred = true, Exception = e }; } catch (Exception e) { throw new NHibernateLoaderException(e.Message + Environment.NewLine + e.StackTrace, null, null); } }; worker.RunWorkerCompleted += (s, args) => { if (args.Error != null) { userInteractor.RemoveWaitScreen(); providerInfo.EntityProviderInfo.MappingSet = new MappingSetImpl(); throw new Exception("An error occurred in RunCustomNewProjectLogic. The inner exception is: " + args.Error.StackTrace, args.Error); //System.Windows.Forms.Clipboard.SetText(args.Error.StackTrace); //userInteractor.ShowError("An Error Occurred", args.Error.Message + Environment.NewLine + Environment.NewLine + "The stacktrace has been copied to the clipboard. Please email to [email protected]"); //providerInfo.EntityProviderInfo.MappingSet = new MappingSetImpl(); } else { var result = (RunResult)args.Result; if (result.ErrorOccurred) { userInteractor.RemoveWaitScreen(); providerInfo.EntityProviderInfo.MappingSet = new MappingSetImpl(); string errorMessage = string.Format("Unsupported elements or Schema Validation Errors occurred. Please submit this error.\nFiles: {0}", result.Exception.Filenames); throw new Exception(errorMessage, result.Exception); //var form = new NHibernateHBMLoadErrorView(); //form.Title = "Unsupported elements or Schema Validation Errors occurred"; //form.NameOfFileWithError = result.Exception.Filename; //form.SetErrors(result.Exception.Errors); //userInteractor.ShowDialog(form); } else { // Set the MappingSet to the result of our work. providerInfo.EntityProviderInfo.MappingSet = result.MappingSet; providerInfo.NhConfigFile = result.NhConfigFile; providerInfo.CsProjFile = result.CsProjFile; if (!string.IsNullOrEmpty(providerInfo.CsProjFile.GetProjectGuid())) { ArchAngel.Interfaces.SharedData.CurrentProject.SetUserOption("ProjectGuid", providerInfo.CsProjFile.GetProjectGuid()); } ArchAngel.Interfaces.SharedData.CurrentProject.SetUserOption("CacheProviderClass", providerInfo.NhConfigFile.cache_provider_class); // Then run the validation rules userInteractor.UpdateWaitScreen("Runnng Model Validation"); //var rulesEngine = new ValidationRulesEngine(result.MappingSet); //var database = result.DatabaseLoader.LoadDatabase(); //rulesEngine.AddModule(new NHibernateProjectLoaderModule(database)); providerInfo.EntityProviderInfo.RunValidationRules(); //rulesEngine); userInteractor.RemoveWaitScreen(); } } }; worker.RunWorkerAsync(); }
public void SudLoadProgramOptions() { var sProject = new Project_v4 { ArchitectureName = "testArch", PlatformName = "testOS", InputFiles = { new DecompilerInput_v4 { Filename = "c:\\tmp\\foo\\foo.exe", User = new UserData_v4 { Heuristics = { new Heuristic_v3 { Name = "HeuristicScanning" } }, TextEncoding = "windows-1251", Calls = { new SerializedCall_v1 { InstructionAddress = "0041230", NoReturn = true, } }, RegisterValues = new RegisterValue_v2[] { new RegisterValue_v2 { Address = "00443210", Register = "eax", Value = "42" }, new RegisterValue_v2 { Address = "00443210", Register = "ecx", Value = "10" }, } } } } }; Given_Architecture(); Given_TestOS_Platform(); Expect_TryParseAddress("0041230", Address.Ptr32(0x0041230)); Expect_TryParseAddress("00443210", Address.Ptr32(0x00443210)); Expect_TryGetRegister(arch, "eax", new RegisterStorage("eax", 0, 0, PrimitiveType.Word32)); Expect_TryGetRegister(arch, "ecx", new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32)); var loader = new Mock <ILoader>(); loader.Setup(l => l.LoadFileBytes(It.IsAny <string>())) .Returns(new byte[10]); loader.Setup(l => l.LoadBinaryImage( It.IsAny <ImageLocation>(), It.IsAny <byte[]>(), It.IsAny <string>(), It.IsAny <Address>())) .Returns(new Program { Platform = this.platform.Object }); var location = ImageLocation.FromUri("c:\\tmp\\foo\\bar.proj"); var ploader = new ProjectLoader(sc, loader.Object, location, new FakeDecompilerEventListener()); var project = ploader.LoadProject(sProject); Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning")); Assert.AreEqual("windows-1251", project.Programs[0].User.TextEncoding.WebName); Assert.AreEqual(1, project.Programs[0].User.RegisterValues.Count); Assert.AreEqual(2, project.Programs[0].User.RegisterValues[Address.Ptr32(0x00443210)].Count); }
static void Main(string[] args) { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; ProcessorProject project; var cmd = (args.FirstOrDefault(it => it.StartsWith("--cmd=", StringComparison.OrdinalIgnoreCase)) ?? "--cmd=timepoint").Split(new[] { '=' }, 2)[1]; var mode = args.FirstOrDefault(it => it.StartsWith("--mode=", StringComparison.OrdinalIgnoreCase)); if (mode != null && mode.Split(new[] { '=' }, 2)[1].Equals("csv", StringComparison.OrdinalIgnoreCase)) { var filename = args.FirstOrDefault(it => it.StartsWith("--fileRadiants=", StringComparison.OrdinalIgnoreCase)); var radiants = filename == null ? String.Empty : File.ReadAllText(filename.Split(new[] { '=' }, 2)[1]); filename = args.FirstOrDefault(it => it.StartsWith("--fileLayers=", StringComparison.OrdinalIgnoreCase)); var layers = filename == null ? String.Empty : File.ReadAllText(filename.Split(new[] { '=' }, 2)[1]); filename = args.FirstOrDefault(it => it.StartsWith("--fileSignals=", StringComparison.OrdinalIgnoreCase)); var signals = filename == null ? String.Empty : File.ReadAllText(filename.Split(new[] { '=' }, 2)[1]); filename = args.FirstOrDefault(it => it.StartsWith("--fileSphere=", StringComparison.OrdinalIgnoreCase)); var sphere = filename == null ? String.Empty : File.ReadAllText(filename.Split(new[] { '=' }, 2)[1]); filename = args.FirstOrDefault(it => it.StartsWith("--fileResearchSets=", StringComparison.OrdinalIgnoreCase)); var researchSets = filename == null ? String.Empty : File.ReadAllText(filename.Split(new[] { '=' }, 2)[1]); filename = args.FirstOrDefault(it => it.StartsWith("--fileCommon=", StringComparison.OrdinalIgnoreCase)); var common = filename == null ? String.Empty : File.ReadAllText(filename.Split(new[] { '=' }, 2)[1]); project = new ProjectLoader().LoadFromCsv(radiants, layers, signals, sphere, researchSets, common); } else { var filename = args.FirstOrDefault(it => it.StartsWith("--fileJson=", StringComparison.OrdinalIgnoreCase)); var json = File.ReadAllText(filename == null ? String.Empty : filename.Split(new[] { '=' }, 2)[1]); project = new ProjectLoader().LoadFromJson(json); } var timeFromStr = args.FirstOrDefault(it => it.StartsWith("--timeFrom=", StringComparison.OrdinalIgnoreCase)) ?? "--timeFrom=0"; var timeToStr = args.FirstOrDefault(it => it.StartsWith("--timeTo=", StringComparison.OrdinalIgnoreCase)) ?? timeFromStr; var timeStepStr = args.FirstOrDefault(it => it.StartsWith("--timeStep=", StringComparison.OrdinalIgnoreCase)); var impulseDurationStr = args.FirstOrDefault(it => it.StartsWith("--impulseDuration=", StringComparison.OrdinalIgnoreCase)) ?? timeToStr; var flushPointsStr = args.FirstOrDefault(it => it.StartsWith("--flushEveryNPoints=", StringComparison.OrdinalIgnoreCase)) ?? "--flushEveryNPoints=1000"; var flushPoints = Int32.Parse(flushPointsStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var timeFrom = Double.Parse(timeFromStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var timeTo = Double.Parse(timeToStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var timeStep = timeStepStr == null ? ((timeTo - timeFrom) / 10.0) : Double.Parse(timeStepStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); //correct time in relation with timeStep timeTo = Math.Ceiling((timeTo - timeFrom) / timeStep) * timeStep + timeFrom; var impulseDuration = Double.Parse(impulseDurationStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var pointStr = args.FirstOrDefault(it => it.StartsWith("--point=", StringComparison.OrdinalIgnoreCase)); Point3D pt; if (pointStr != null) { var parts = pointStr.Split(new[] { '=' }, 2)[1].Split(','); pt = new Point3D( Double.Parse(parts[0], CultureInfo.InvariantCulture), Double.Parse(parts[1], CultureInfo.InvariantCulture), Double.Parse(parts[2], CultureInfo.InvariantCulture)); } else { pt = new Point3D(project.SphereRadius, 0, 0); } var processor = new Processor(); processor.Init(project); var outputDirectory = Environment.CurrentDirectory; var dir = Path.Combine(outputDirectory, DateTime.Now.ToString("yy-MM-dd_HHmmss")); Directory.CreateDirectory(dir); switch (cmd) { case "timepoint": { var setNo = 0; foreach (var researchSetBase in project.ResearchSets) { setNo++; for (var time = timeFrom; time <= timeTo; time += timeStep) { var name = Path.Combine(dir, String.Format("Set{0:D2}_time{1}.csv", setNo, time)); using (var fs = new StreamWriter(name, false)) { var pointsSinceFlush = 0; foreach (var point3D in researchSetBase.GetPoints()) { var val = processor.GetResearchValue(point3D, impulseDuration, time); fs.WriteLine("{0},{1},{2},{3}", point3D.X, point3D.Y, point3D.Z, val); if (++pointsSinceFlush > flushPoints) { pointsSinceFlush = 0; fs.Flush(); } } fs.Flush(); } } } var data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, "Project.json"), false)) { fs.Write(data); fs.Flush(); } } break; case "delays": { var radiants = processor.PreCalcRadiants(pt, impulseDuration, CancellationToken.None, timeStep).ToList(); var minTime = radiants.Max(r => r.MinTime); var min = radiants.Sum(r => r.MinValue); project.Radiants.Clear(); radiants.ForEach( it => project.Radiants.Add( new ProcessorRadiant { Delay = minTime - it.MinTime, Position = it.Radiant.Position, Radius = it.Radiant.Radius })); var data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, String.Format("ProjectRadiants_min{0}_time{1}.json", min, minTime)), false)) { fs.Write(data); fs.Flush(); } var maxTime = radiants.Max(r => r.MaxTime); var max = radiants.Sum(r => r.MaxValue); project.Radiants.Clear(); radiants.ForEach( it => project.Radiants.Add( new ProcessorRadiant { Delay = maxTime - it.MaxTime, Position = it.Radiant.Position, Radius = it.Radiant.Radius })); data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, String.Format("ProjectRadiants_max{0}_time{1}.json", max, maxTime)), false)) { fs.Write(data); fs.Flush(); } } break; case "pointvalues": { var name = Path.Combine(dir, String.Format(CultureInfo.InvariantCulture, "ProjectPoint{0} {1} {2}_timeFrom{3}_timeTo{4}.csv", pt.X, pt.Y, pt.Z, timeFrom, timeTo)); using (var fs = new StreamWriter(name, false)) { var pointsSinceFlush = 0; foreach (var pair in processor.GetPointValues(pt, impulseDuration, timeFrom, timeTo, timeStep).OrderBy(it => it.Key)) { fs.WriteLine("{0},{1}", pair.Key, pair.Value); if (++pointsSinceFlush > flushPoints) { pointsSinceFlush = 0; fs.Flush(); } } fs.Flush(); } } break; case "byradiants": { var setNo = 0; foreach (var researchSetBase in project.ResearchSets) { setNo++; for (var time = timeFrom; time <= timeTo; time += timeStep) { var name = Path.Combine(dir, String.Format("ByRadinats_Set{0:D2}_time{1}.csv", setNo, time)); using (var fs = new StreamWriter(name, false)) { var pointsSinceFlush = 0; var vals = processor.GetResearchValueByRadinats(researchSetBase, impulseDuration, time); foreach (var tuple in vals) { fs.Write("{0},{1},{2},{3},", tuple.Item1.X, tuple.Item1.Y, tuple.Item1.Z, tuple.Item2); fs.WriteLine(String.Join(",", tuple.Item3.Select(it => it.Value).ToString())); if (++pointsSinceFlush > flushPoints) { pointsSinceFlush = 0; fs.Flush(); } } fs.Flush(); } } } var data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, "Project.json"), false)) { fs.Write(data); fs.Flush(); } } break; case "curves": { var setNo = 0; foreach (var researchSetBase in project.ResearchSets) { var name = Path.Combine(dir, String.Format("CurvesByRadinats_timeFrom{0}_timeTo{1}_timeStep{2}.csv", timeFrom, timeTo, timeStep)); using (var fs = new StreamWriter(name, false)) { var pointsSinceFlush = 0; foreach (var point in researchSetBase.GetPoints()) { var vals = processor.GetCurves(point, impulseDuration, timeFrom, timeTo, timeStep); fs.Write("{0},{1},{2},,{3},{4},,{5},{6},,,", point.X, point.Y, point.Z, vals.MaxTime, vals.MaxValue, vals.MinTime, vals.MinValue); fs.WriteLine(String.Join(",,", vals.RadiantCurves.Select( it => String.Format("{0},{1},{2},{3},{4},{5},{6}", it.Radiant.Position.X, it.Radiant.Position.Y, it.Radiant.Position.Z, it.MaxTime, it.MaxValue, it.MinTime, it.MinValue)))); if (++pointsSinceFlush > flushPoints) { pointsSinceFlush = 0; fs.Flush(); } fs.Flush(); } } } var data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, "Project.json"), false)) { fs.Write(data); fs.Flush(); } } break; case "sphere": { var radiantCountStr = args.FirstOrDefault(it => it.StartsWith("--radiantCount=", StringComparison.OrdinalIgnoreCase)); var radiantRadiusStr = args.FirstOrDefault(it => it.StartsWith("--radiantRadius=", StringComparison.OrdinalIgnoreCase)); var radiantDistanceStr = args.FirstOrDefault(it => it.StartsWith("--radiantDistance=", StringComparison.OrdinalIgnoreCase)); if (!String.IsNullOrEmpty(radiantCountStr)) { var radiantCount = Int32.Parse(radiantCountStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var radiantRadius = Double.Parse(radiantRadiusStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var radiantDistance = Double.Parse(radiantDistanceStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var list = SphereGenerator.GenerateRandomRadiantPositions(project.SphereRadius, project.SphereCutRadius, radiantCount, radiantDistance, project.Radiants.Select(it => new Vector3D(it.Position.X, it.Position.Y, it.Position.Z)).ToList()); project.Radiants.Clear(); project.Radiants = list.Select(it => new ProcessorRadiant { Position = it, Radius = radiantRadius }).ToList(); var data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, "Project.json"), false)) { fs.Write(data); fs.Flush(); } } } break; case "sphereOctahedron": { var depthStr = args.FirstOrDefault(it => it.StartsWith("--divideDepth=", StringComparison.OrdinalIgnoreCase)); var radiantRadiusStr = args.FirstOrDefault(it => it.StartsWith("--radiantRadius=", StringComparison.OrdinalIgnoreCase)); var radiantDistanceStr = args.FirstOrDefault(it => it.StartsWith("--radiantDistance=", StringComparison.OrdinalIgnoreCase)); if (!String.IsNullOrEmpty(depthStr)) { var depth = Int32.Parse(depthStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var radiantRadius = Double.Parse(radiantRadiusStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var radiantDistance = Double.Parse(radiantDistanceStr.Split(new[] { '=' }, 2)[1], CultureInfo.InvariantCulture); var list = SphereGenerator.MakeOctahedronNet(project.SphereRadius, project.SphereCutRadius, depth, radiantDistance); project.Radiants.Clear(); project.Radiants = list.Select(it => new ProcessorRadiant { Position = new Point3D(it.X, it.Y, it.Z), Radius = radiantRadius }).ToList(); var data = new ProjectLoader().SaveToJson(project); using (var fs = new StreamWriter(Path.Combine(dir, "Project.json"), false)) { fs.Write(data); fs.Flush(); } } } break; } }
public void Prld_LoadUserDefinedMetadata() { var sProject = new Project_v4 { ArchitectureName = "testArch", PlatformName = "testOS", Inputs = { new DecompilerInput_v4 { Filename = "foo.exe", }, new MetadataFile_v3 { Filename = "meta1.xml", }, new MetadataFile_v3 { Filename = "meta2.xml", }, } }; var types1 = new Dictionary <string, DataType>() { { "USRTYPE1", PrimitiveType.Word16 } }; var types2 = new Dictionary <string, DataType>() { { "USRTYPE2", PrimitiveType.Word32 } }; var ldr = mockFactory.CreateLoader(); Given_TestArch(); Given_TestOS(); mockFactory.CreateLoadMetadataStub( OsPath.Absolute("meta1.xml"), this.platform, new TypeLibrary( types1, new Dictionary <string, ProcedureSignature>() ) ); mockFactory.CreateLoadMetadataStub( OsPath.Absolute("meta2.xml"), this.platform, new TypeLibrary( types2, new Dictionary <string, ProcedureSignature>() ) ); mr.ReplayAll(); var prld = new ProjectLoader(sc, ldr); var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject); Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count); Assert.AreEqual( "word16", project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString() ); Assert.AreEqual( "word32", project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString() ); }
public (ProjectFileInfo, ImmutableArray <MSBuildDiagnostic>, ProjectLoadedEventArgs) Reload(ProjectLoader loader) { var(projectInstance, diagnostics) = loader.BuildProject(FilePath); if (projectInstance == null) { return(null, diagnostics, null); } var data = ProjectData.Create(projectInstance); var projectFileInfo = new ProjectFileInfo(Id, FilePath, data); var eventArgs = new ProjectLoadedEventArgs(Id, projectInstance, diagnostics, isReload: true); return(projectFileInfo, diagnostics, eventArgs); }
public async Task LoadLibrary_ThemeNested() { var libLoader = new Mock <ILibraryLoader>(); libLoader.Setup(m => m.LoadThemeFiles(It.IsAny <string>(), It.IsAny <string[]>())).Returns( (string n, string[] f) => { if (n == "A") { return(new IFile[] { new FileMock(Location.FromPath("dir\\file2.txt"), $"{n}_theme_f2"), new FileMock(Location.FromPath("dir\\file3.txt"), $"{n}_theme_f3"), new FileMock(Location.FromPath("file4.txt"), $"{n}_theme_f4"), new FileMock(Location.FromPath("dir\\file4.txt"), $"{n}_theme_dir-f4") }.ToAsyncEnumerable()); } else if (n == "B") { return(new IFile[] { new FileMock(Location.FromPath("file1.txt"), $"{n}_theme_f1"), new FileMock(Location.FromPath("dir\\file2.txt"), $"{n}_theme_f2"), new FileMock(Location.FromPath("dir\\file4.txt"), $"{n}_theme_f4") }.ToAsyncEnumerable()); } else { throw new Exception(); } }); var fileLoaderMock = new Mock <IFileLoader>(); fileLoaderMock.Setup(m => m.LoadFolder(It.IsAny <ILocation>(), It.IsAny <string[]>())) .Returns((ILocation l, string[] f) => new IFile[] { new FileMock(Location.FromPath("dir\\file2.txt"), "f2"), new FileMock(Location.FromPath("dir\\file3.txt"), "f3"), new FileMock(Location.FromPath("file5.txt"), "f5") }.ToAsyncEnumerable()); var conf = new Configuration(); conf.ThemesHierarchy.Add("A"); conf.ThemesHierarchy.Add("B"); var loader = new ProjectLoader(fileLoaderMock.Object, libLoader.Object, new Mock <IPluginsManager>().Object, conf, new Mock <ILoaderExtension>().Object, new Mock <ILogger>().Object); var res = await loader.Load(new ILocation[] { Location.FromPath("") }).ToListAsync(); Assert.AreEqual(6, res.Count()); Assert.IsNotNull(res.First(f => f.Location.ToId() == "file1.txt")); Assert.IsNotNull(res.First(f => f.Location.ToId() == "dir::file2.txt")); Assert.IsNotNull(res.First(f => f.Location.ToId() == "dir::file3.txt")); Assert.IsNotNull(res.First(f => f.Location.ToId() == "file4.txt")); Assert.IsNotNull(res.First(f => f.Location.ToId() == "file5.txt")); Assert.IsNotNull(res.First(f => f.Location.ToId() == "dir::file4.txt")); Assert.AreEqual("B_theme_f1", res.First(f => f.Location.ToId() == "file1.txt").AsTextContent()); Assert.AreEqual("f2", res.First(f => f.Location.ToId() == "dir::file2.txt").AsTextContent()); Assert.AreEqual("f3", res.First(f => f.Location.ToId() == "dir::file3.txt").AsTextContent()); Assert.AreEqual("A_theme_f4", res.First(f => f.Location.ToId() == "file4.txt").AsTextContent()); Assert.AreEqual("f5", res.First(f => f.Location.ToId() == "file5.txt").AsTextContent()); Assert.AreEqual("A_theme_dir-f4", res.First(f => f.Location.ToId() == "dir::file4.txt").AsTextContent()); }
private static Tuple <string, List <ModuleDefinition> > GenerateProject(string msBuildPath, string workingDir, AssemblyDefinition definition, bool lib = true) { if (workingDir == null) { throw new ArgumentNullException(nameof(workingDir)); } if (definition == null) { throw new ArgumentNullException(nameof(definition)); } if (!Directory.Exists(workingDir)) { throw new DirectoryNotFoundException("Can not find the working directory: " + workingDir); } Logger.Log(LogType.Log, "Generating csproject File..."); DotNetHelper.New(msBuildPath, workingDir, definition.AssemblyName, lib); File.Delete(Path.Combine(workingDir, definition.AssemblyName, lib ? "Class1.cs" : "Program.cs")); //Delete Default Class string projectFile = Path.Combine(workingDir, definition.AssemblyName, definition.AssemblyName + ".csproj"); List <ModuleDefinition> modules = new List <ModuleDefinition>(); for (int i = 0; i < definition.IncludedModules.Count; i++) { if (modules.Count(x => x.Name == definition.IncludedModules[i].Name) == 0) { DiscoverModules(definition.IncludedModules[i], modules); } } Logger.Log(LogType.Log, $"Discovered {modules.Count} Modules."); CSharpProject p = ProjectLoader.LoadProject(projectFile); foreach (ModuleDefinition defintionDefinition in modules) { for (int i = 0; i < defintionDefinition.Packages.Length; i++) { p.AddReference(defintionDefinition.Packages[i]); } //for (int i = 0; i < defintionDefinition.Projects.Length; i++) //{ // CSharpReference r = PrepareForTransfer(defintionDefinition.Projects[i], // defintionDefinition); // string path = r.Attributes["Include"]; // if (modules.Count(x => path == Path.GetFullPath(Path.Combine(x.RootDirectory, x.Name + ".csproj"))) == 0) // { // p.AddReference(r); // } //} for (int i = 0; i < defintionDefinition.EmbeddedFiles.Length; i++) { p.AddReference(defintionDefinition.EmbeddedFiles[i]); } } File.Delete(projectFile); p.Save(projectFile); return(new Tuple <string, List <ModuleDefinition> >(projectFile, modules)); }
public void Ps_Load_v1() { var bytes = new byte[100]; loader.Stub(l => l.LoadImageBytes(null, 0)).IgnoreArguments().Return(bytes); loader.Stub(l => l.LoadExecutable(null, null, null)).IgnoreArguments().Return( new Program { Architecture = arch }); mr.ReplayAll(); var sp = new Project_v1 { Input = new DecompilerInput_v1 { Filename = "f.exe", }, UserProcedures = { new Procedure_v1 { Name = "Fn", Decompile = true, Characteristics = new ProcedureCharacteristics { Terminates = true, }, Address = "113300", Signature = new SerializedSignature{ ReturnValue = new Argument_v1{ Type = new PrimitiveType_v1(Domain.SignedInt, 4), }, Arguments = new Argument_v1[]{ new Argument_v1 { Name = "a", Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.Character, 2) }, new Argument_v1 { Name = "b", Kind = new StackVariable_v1(), Type = new PointerType_v1{ DataType = new PrimitiveType_v1(Domain.Character, 2) } } } } } } }; var ps = new ProjectLoader(loader); var p = ps.LoadProject(sp); Assert.AreEqual(1, p.Programs.Count); var inputFile = p.Programs[0]; Assert.AreEqual(1, inputFile.UserProcedures.Count); Assert.AreEqual("Fn", inputFile.UserProcedures.First().Value.Name); }
static void Main(String[] args) { ProjectLoader loader = new ProjectLoader(); ProjectDef projectDef = loader.Load("samples/Test.json"); }
public ProjectLoaderTests() { _filesystem = new Mock <IFilesystem>(MockBehavior.Strict); _testee = new ProjectLoader(_filesystem.Object, new Mock <ILogger <ProjectLoader> >().Object); }
public void Prld_LoadUserDefinedMetadata() { var sProject = new Project_v4 { ArchitectureName = "testArch", PlatformName = "testOS", Inputs = { new DecompilerInput_v4 { Filename = "foo.exe", User = new UserData_v4 { LoadAddress = "00123400" } }, new MetadataFile_v3 { Filename = "meta1.xml", }, new MetadataFile_v3 { Filename = "meta2.xml", }, } }; var types1 = new Dictionary <string, DataType>() { { "USRTYPE1", PrimitiveType.Word16 } }; var types2 = new Dictionary <string, DataType>() { { "USRTYPE2", PrimitiveType.Word32 } }; var ldr = mockFactory.CreateLoader(); Given_TestArch(); Given_TestOS(); var addr = Address.Ptr32(0x00123400); arch.Setup(a => a.TryParseAddress( "00123400", out addr)) .Returns(true); mockFactory.CreateLoadMetadataStub( OsPath.Absolute("meta1.xml"), this.platform.Object, new TypeLibrary( types1, new Dictionary <string, FunctionType>(), new Dictionary <string, DataType>() ) ); mockFactory.CreateLoadMetadataStub( OsPath.Absolute("meta2.xml"), this.platform.Object, new TypeLibrary( types2, new Dictionary <string, FunctionType>(), new Dictionary <string, DataType>() ) ); var prld = new ProjectLoader(sc, ldr, listener.Object); var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject); Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count); Assert.AreEqual( "word16", project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString() ); Assert.AreEqual( "word32", project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString() ); Assert.AreEqual( Address.Ptr32(0x00123400), project.Programs[0].User.LoadAddress); }
public void Setup() { project = new ProjectLoader(GetCSProjFile("testproject2.csproj.txt")); }
public static (ProjectFileInfo, ImmutableArray <MSBuildDiagnostic>, ProjectLoadedEventArgs) Load(string filePath, ProjectLoader loader) { if (!File.Exists(filePath)) { return(null, ImmutableArray <MSBuildDiagnostic> .Empty, null); } var(projectInstance, diagnostics) = loader.BuildProject(filePath); if (projectInstance == null) { return(null, diagnostics, null); } var id = ProjectId.CreateNewId(debugName: filePath); var data = ProjectData.Create(projectInstance); var projectFileInfo = new ProjectFileInfo(id, filePath, data); var eventArgs = new ProjectLoadedEventArgs(id, projectInstance, diagnostics, isReload: false); return(projectFileInfo, diagnostics, eventArgs); }
public override void RunCustomNewProjectLogic(ArchAngel.Interfaces.ProviderInfo theProviderInfo, IUserInteractor userInteractor) { NHibernateHelper.ProviderInfo providerInfo = (NHibernateHelper.ProviderInfo)theProviderInfo; providerInfo.Clear(); providerInfo.NhConfigFile = this.NhConfigFile; userInteractor.ShowWaitScreen("Loading from your existing NHibernate project"); // Run this in its own thread BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (s, args) => { try { var loader = new ProjectLoader(new FileController(), new IUserInteractorProgressUpdatorAdapter(userInteractor), userInteractor); var result = loader.LoadEntityModelFromCSProj(Filename, this.NhConfigFile); args.Result = new RunResult { MappingSet = result.MappingSet, DatabaseLoader = result.DatabaseLoader, NhConfigFile = result.NhConfigFile, CsProjFile = result.CsProjFile }; } catch (NHibernateLoaderException e) { //var sb = new StringBuilder(); //sb.Append("The HBM files [").Append(e.Filenames).AppendLine( // "] could not be loaded due to the following errors:"); //e.Errors.ForEach(err => sb.AppendLine(err.Message)); //sb.AppendLine("Please send this file to [email protected] so we can make our HBM Loader better."); args.Result = new RunResult { ErrorOccurred = true, Exception = e }; } catch (Exception e) { throw new NHibernateLoaderException(e.Message + Environment.NewLine + e.StackTrace, null, null); } }; worker.RunWorkerCompleted += (s, args) => { if (args.Error != null) { userInteractor.RemoveWaitScreen(); providerInfo.EntityProviderInfo.MappingSet = new MappingSetImpl(); throw new Exception("An error occurred in RunCustomNewProjectLogic. The inner exception is: " + args.Error.StackTrace, args.Error); //System.Windows.Forms.Clipboard.SetText(args.Error.StackTrace); //userInteractor.ShowError("An Error Occurred", args.Error.Message + Environment.NewLine + Environment.NewLine + "The stacktrace has been copied to the clipboard. Please email to [email protected]"); //providerInfo.EntityProviderInfo.MappingSet = new MappingSetImpl(); } else { var result = (RunResult)args.Result; if (result.ErrorOccurred) { userInteractor.RemoveWaitScreen(); providerInfo.EntityProviderInfo.MappingSet = new MappingSetImpl(); string errorMessage = string.Format("Unsupported elements or Schema Validation Errors occurred. Please submit this error.\nFiles: {0}", result.Exception.Filenames); throw new Exception(errorMessage, result.Exception); //var form = new NHibernateHBMLoadErrorView(); //form.Title = "Unsupported elements or Schema Validation Errors occurred"; //form.NameOfFileWithError = result.Exception.Filename; //form.SetErrors(result.Exception.Errors); //userInteractor.ShowDialog(form); } else { // Set the MappingSet to the result of our work. providerInfo.EntityProviderInfo.MappingSet = result.MappingSet; providerInfo.NhConfigFile = result.NhConfigFile; providerInfo.CsProjFile = result.CsProjFile; if (!string.IsNullOrEmpty(providerInfo.CsProjFile.GetProjectGuid())) ArchAngel.Interfaces.SharedData.CurrentProject.SetUserOption("ProjectGuid", providerInfo.CsProjFile.GetProjectGuid()); ArchAngel.Interfaces.SharedData.CurrentProject.SetUserOption("CacheProviderClass", providerInfo.NhConfigFile.cache_provider_class); // Then run the validation rules userInteractor.UpdateWaitScreen("Runnng Model Validation"); //var rulesEngine = new ValidationRulesEngine(result.MappingSet); //var database = result.DatabaseLoader.LoadDatabase(); //rulesEngine.AddModule(new NHibernateProjectLoaderModule(database)); providerInfo.EntityProviderInfo.RunValidationRules();//rulesEngine); userInteractor.RemoveWaitScreen(); } } }; worker.RunWorkerAsync(); }
public void Sud_LoadProject_Inputs_v5() { Given_Loader(); Given_Architecture(); Given_TestOS_Platform(); Expect_Arch_ParseAddress("1000:0400", Address.SegPtr(0x1000, 0x0400)); Given_ExecutableProgram("foo.exe", Address.SegPtr(0x1000, 0x0000)); Given_BinaryFile("foo.bin", Address.SegPtr(0x1000, 0x0000)); var sProject = new Project_v5 { ArchitectureName = arch.Object.Name, PlatformName = platform.Object.Name, InputFiles = { new DecompilerInput_v5 { Filename = "foo.exe", User = { LoadAddress = "1000:0000", GlobalData = { new GlobalDataItem_v2 { Address = "1000:0400", DataType = new StringType_v2{ Termination = StringType_v2.ZeroTermination, CharType = new PrimitiveType_v1 { ByteSize = 1,Domain = Domain.Character } } } } }, Comment = "main file", }, new DecompilerInput_v5 { Filename = "foo.bin", Comment = "overlay", User = { LoadAddress = "1000:D000", Processor = new ProcessorOptions_v4 { Name = "x86-real-16", } } } } }; var location = ImageLocation.FromUri("/var/project.dcproj"); var ps = new ProjectLoader(sc, loader.Object, location, listener.Object); var project = ps.LoadProject(sProject); Assert.AreEqual(2, project.Programs.Count); var input0 = project.Programs[0]; Assert.AreEqual(1, input0.User.Globals.Count); Assert.AreEqual("1000:0400", input0.User.Globals.Values[0].Address.ToString()); var str_t = (StringType_v2)input0.User.Globals.Values[0].DataType; Assert.AreEqual("prim(Character,1)", str_t.CharType.ToString()); }
public void Ps_Load_v5() { var bytes = new byte[100]; loader.Setup(l => l.LoadImageBytes( It.IsAny <string>(), It.IsAny <int>())). Returns(bytes); loader.Setup(l => l.LoadExecutable( It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <string>(), It.IsAny <Address>())).Returns( new Program { Architecture = arch.Object }); Given_Architecture(); Given_TestOS_Platform(); Given_Platform_Address("113800", 0x113800); Given_Platform_Address("114000", 0x114000); Given_Platform_Address("115000", 0x115000); Given_Platform_Address("115012", 0x115012); Given_Platform_Address("11504F", 0x11504F); arch.Setup(a => a.GetRegister("r1")).Returns(new RegisterStorage("r1", 1, 0, PrimitiveType.Word32)); var sp = new Project_v5 { ArchitectureName = "testArch", PlatformName = "testOS", Inputs = { new DecompilerInput_v5 { Filename = "f.exe", User = new UserData_v4 { Procedures = { new Procedure_v1 { Name = "Fn", Decompile = true, Characteristics = new ProcedureCharacteristics { Terminates = true, }, Address = "113300", Signature = new SerializedSignature{ ReturnValue = new Argument_v1{ Type = new PrimitiveType_v1(Domain.SignedInt, 4), }, Arguments = new Argument_v1[]{ new Argument_v1 { Name = "a", Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.Character, 2) }, new Argument_v1 { Name = "b", Kind = new StackVariable_v1(), Type = new PointerType_v1{ DataType = new PrimitiveType_v1(Domain.Character, 2) } } } } } }, IndirectJumps = { new IndirectJump_v4 { InstructionAddress = "113800", IndexRegister = "r1", TableAddress = "114000", } }, JumpTables = { new JumpTable_v4 { TableAddress = "114000", Destinations = new [] { "115000", "115012", "11504F", } } } } } } }; var ps = new ProjectLoader(sc, loader.Object, listener.Object); var p = ps.LoadProject("c:\\tmp\\fproj.proj", sp); Assert.AreEqual(1, p.Programs.Count); var inputFile = p.Programs[0]; Assert.AreEqual(1, inputFile.User.Procedures.Count); Assert.AreEqual("Fn", inputFile.User.Procedures.First().Value.Name); Assert.AreEqual(1, inputFile.User.JumpTables.Count); var jumpTable = inputFile.User.JumpTables[Address.Ptr32(0x114000)]; Assert.AreEqual(Address.Ptr32(0x00115000), jumpTable.Addresses[0]); Assert.AreEqual(Address.Ptr32(0x00115012), jumpTable.Addresses[1]); Assert.AreEqual(Address.Ptr32(0x0011504F), jumpTable.Addresses[2]); Assert.AreEqual(1, inputFile.User.IndirectJumps.Count); var indJump = inputFile.User.IndirectJumps[Address.Ptr32(0x00113800)]; Assert.AreSame(jumpTable, indJump.Table); }
private static Tuple <string, List <ModuleDefinition> > GenerateProject(string msBuildPath, string workingDir, AssemblyDefinition definition, bool lib) { if (workingDir == null) { throw new ArgumentNullException(nameof(workingDir)); } if (definition == null) { throw new ArgumentNullException(nameof(definition)); } if (!Directory.Exists(workingDir)) { throw new DirectoryNotFoundException("Can not find the working directory: " + workingDir); } Logger.Log(LogType.Log, "Generating csproject File...", 1); if (lib) { DotNetHelper.NewLib(msBuildPath, workingDir, definition.AssemblyName); } else { DotNetHelper.NewCommandLine(msBuildPath, workingDir, definition.AssemblyName); } File.Delete(Path.Combine(workingDir, definition.AssemblyName, lib ? "Class1.cs" : "Program.cs")); //Delete Default Class string projectFile = Path.Combine(workingDir, definition.AssemblyName, definition.AssemblyName + ".csproj"); List <ModuleDefinition> modules = new List <ModuleDefinition>(); for (int i = 0; i < definition.IncludedModules.Count; i++) { if (modules.Count(x => x.Name == definition.IncludedModules[i].Name) == 0) { DiscoverModules(definition.IncludedModules[i], modules); } } Logger.Log(LogType.Log, $"Discovered {modules.Count} Modules.", 1); CSharpProject p = ProjectLoader.LoadProject(projectFile); foreach (ModuleDefinition defintionDefinition in modules) { for (int i = 0; i < defintionDefinition.Packages.Length; i++) { p.AddReference(defintionDefinition.Packages[i]); } for (int i = 0; i < defintionDefinition.EmbeddedFiles.Length; i++) { p.AddReference(defintionDefinition.EmbeddedFiles[i]); } } File.Delete(projectFile); p.Save(projectFile); return(new Tuple <string, List <ModuleDefinition> >(projectFile, modules)); }