コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: rgallini/IntegrationTool
        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");
        }
コード例 #9
0
        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();
                }
            }
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
 public void Setup()
 {
     project = new ProjectLoader(File.ReadAllText(GetCSProjFile("testproject2.csproj.txt")), GetCSProjFile("testproject2.csproj.txt"));
 }
コード例 #14
0
        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);
        }
コード例 #15
0
        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();
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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;
            }
        }
コード例 #18
0
        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()
                );
        }
コード例 #19
0
        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);
        }
コード例 #20
0
        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());
        }
コード例 #21
0
        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));
        }
コード例 #22
0
        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);
        }
コード例 #23
0
 static void Main(String[] args)
 {
     ProjectLoader loader     = new ProjectLoader();
     ProjectDef    projectDef = loader.Load("samples/Test.json");
 }
コード例 #24
0
 public ProjectLoaderTests()
 {
     _filesystem = new Mock <IFilesystem>(MockBehavior.Strict);
     _testee     = new ProjectLoader(_filesystem.Object, new Mock <ILogger <ProjectLoader> >().Object);
 }
コード例 #25
0
        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);
        }
コード例 #26
0
 public void Setup()
 {
     project = new ProjectLoader(GetCSProjFile("testproject2.csproj.txt"));
 }
コード例 #27
0
        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);
        }
コード例 #28
0
        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();
        }
コード例 #29
0
        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());
        }
コード例 #30
0
        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);
        }
コード例 #31
0
ファイル: AssemblyGenerator.cs プロジェクト: ByteChkR/Byt3
        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));
        }