private void When_SaveToTextWriter(Program program, TextWriter sw)
 {
     var saver = new ProjectSaver();
     var sProj = new Project_v3
     {
         Inputs = { saver.VisitProgram(program) }
     };
     var writer = new FilteringXmlWriter(sw);
     writer.Formatting = System.Xml.Formatting.Indented;
     XmlSerializer ser = SerializedLibrary.CreateSerializer_v3(typeof(Project_v3));
     ser.Serialize(writer, sProj);
 }
 public void SudSaveProject()
 {
     Project project = new Project
     {
         Programs =
         {
             new Program
             {
                 Image = new LoadedImage(Address.SegPtr(0x1000, 0), new byte[100]),
                 DisassemblyFilename = "foo.asm",
                 IntermediateFilename = "foo.cod",
                 User = new UserData
                 {
                     Procedures =
                     {
                         {
                             Address.SegPtr(0x1000, 0x10),
                             new Procedure_v1
                             {
                                 Name = "foo",
                                 Signature = new SerializedSignature
                                 {
                                     ReturnValue = new Argument_v1 { Kind = new Register_v1("eax") },
                                     Arguments = new Argument_v1[]
                                     {
                                         new Argument_v1
                                         {
                                             Kind = new StackVariable_v1(),
                                             Type = new PrimitiveType_v1(Domain.SignedInt, 4)
                                         },
                                         new Argument_v1
                                         {
                                             Kind = new StackVariable_v1(),
                                             Type = new PrimitiveType_v1(Domain.SignedInt, 4)
                                         }
                                     }
                                 }
                             }
                         }
                     },
                     Globals =
                     {
                         {
                           Address.SegPtr(0x2000, 0),
                           new GlobalDataItem_v2 {
                                Address = Address.SegPtr(0x2000, 0).ToString(),
                                DataType = new StringType_v2 {
                                    Termination=StringType_v2.ZeroTermination,
                                    CharType = new PrimitiveType_v1 { Domain = Domain.Character, ByteSize = 1 }
                                }
                           }
                         }
                     }
                 }
             }
         }
     };
     using (FileUnitTester fut = new FileUnitTester("Core/SudSaveProject.txt"))
     {
         FilteringXmlWriter writer = new FilteringXmlWriter(fut.TextWriter);
         writer.Formatting = System.Xml.Formatting.Indented;
         XmlSerializer ser = SerializedLibrary.CreateSerializer_v3(typeof(Project_v3));
         Project_v3 ud = new ProjectSaver().Save(project);
         ser.Serialize(writer, ud);
         fut.AssertFilesEqual();
     }
 }
 public void Sud_SaveMetadataReference()
 {
     var project = new Project
     {
         Programs =
         {
             new Program
             {
                 Filename = "c:\\test\\foo.exe",
             }
         },
         MetadataFiles =
         {
             new MetadataFile
             {
                 Filename = "c:\\test\\foo.def",
                 ModuleName = "foo.def",
             }
         }
     };
     var ps = new ProjectSaver();
     var sProject = ps.Save(project);
     Assert.AreEqual(1, project.MetadataFiles.Count);
     Assert.AreEqual("c:\\test\\foo.def", project.MetadataFiles[0].Filename);
     Assert.AreEqual("foo.def", project.MetadataFiles[0].ModuleName);
 }
Exemple #4
0
        /// <summary>
        /// Saves the project. 
        /// </summary>
        /// <returns>False if the user cancelled the save, true otherwise.</returns>
        public bool Save()
        {
            if (decompilerSvc.Decompiler == null)
                return true;
            if (string.IsNullOrEmpty(this.ProjectFileName))
            {
                string newName = PromptForFilename(
                    Path.ChangeExtension(
                        decompilerSvc.Decompiler.Project.Programs[0].Filename,
                        Project_v3.FileExtension));
                if (newName == null)
                    return false;
                ProjectFileName = newName;
                mru.Use(newName);
            }

            using (TextWriter sw = CreateTextWriter(ProjectFileName))
            {
                //$REFACTOR: rule of Demeter, push this into a Save() method.
                var sp = new ProjectSaver().Save(decompilerSvc.Decompiler.Project);
                new ProjectLoader(sc, loader).Save(sp, sw);
            }
            return true;
        }
        public void SudSaveProgramOptions()
        {
            var program = new Program();
            program.User.Heuristics.Add("shingle");

            var pSaver = new ProjectSaver();
            var file = pSaver.VisitProgram(program);
            var ip = (DecompilerInput_v3)file;
            Assert.IsTrue(ip.User.Heuristics.Any(h => h.Name == "shingle"));
        }
        public void SudSaveProgramOptions()
        {
            var program = new Program();
            program.Options.HeuristicScanning = true;
            
            var pSaver = new ProjectSaver();
            var file = pSaver.VisitProgram(program);
            var ip = (DecompilerInput_v2)file;
            Assert.IsTrue(ip.Options.HeuristicScanning);

        }
 public void SudSaveProgramOptions()
 {
     var program = new Program();
     program.User.Heuristics.Add("shingle");
     program.User.TextEncoding = Encoding.GetEncoding("windows-1251");
 
     var pSaver = new ProjectSaver(sc);
     var file = pSaver.VisitProgram("foo.proj", program);
     var ip = (DecompilerInput_v4)file;
     Assert.IsTrue(ip.User.Heuristics.Any(h => h.Name == "shingle"));
     Assert.AreEqual("windows-1251", ip.User.TextEncoding);
 }
        public void Sud_SaveMetadataReference()
        {
            Given_Architecture();
            Given_TestOS_Platform();
            var project = new Project
            {
                Programs =
                {
                    new Program
                    {
                        Architecture = arch,
                        Platform = platform,
                        Filename = "c:\\test\\foo.exe",
                    }
                },
                MetadataFiles =
                {
                    new MetadataFile
                    {
                        Filename = "c:\\test\\foo.def",
                        ModuleName = "foo.def",
                    }
                }
            };
            mr.ReplayAll();

            var ps = new ProjectSaver(sc);
            ps.Save("c:\\test\\foo.project", project);
            Assert.AreEqual(1, project.MetadataFiles.Count);
            Assert.AreEqual("c:\\test\\foo.def", project.MetadataFiles[0].Filename);
            Assert.AreEqual("foo.def", project.MetadataFiles[0].ModuleName);
        }
        public void SudSaveProject()
        {
            Given_Architecture();
            Given_TestOS_Platform();
            var eax = new RegisterStorage("eax", 0, 0, PrimitiveType.Word32);
            var ecx = new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32);
            var jumpTable = new ImageMapVectorTable(
                Address.SegPtr(0x1000, 0x400),
                new Address[] {
                    Address.SegPtr(0x1000, 0x500),
                    Address.SegPtr(0x1000, 0x513),
                    Address.SegPtr(0x1000, 0x5BA),
                }, 0);

            Project project = new Project
            {
                Programs =
                {
                    new Program
                    {
                        Architecture = arch,
                        Platform = platform,
                        SegmentMap = new SegmentMap(Address.SegPtr(0x1000, 0)), //, new byte[100]),
                        DisassemblyFilename = "foo.asm",
                        IntermediateFilename = "foo.cod",
                        User = new UserData
                        {
                            Procedures =
                            {
                                {
                                    Address.SegPtr(0x1000, 0x10),
                                    new Procedure_v1
                                    {
                                        Name = "foo",
                                        Signature = new SerializedSignature
                                        {
                                            ReturnValue = new Argument_v1 { Kind = new Register_v1("eax") },
                                            Arguments = new Argument_v1[]
                                            {
                                                new Argument_v1
                                                {
                                                    Kind = new StackVariable_v1(),
                                                    Type = new PrimitiveType_v1(Domain.SignedInt, 4)
                                                },
                                                new Argument_v1
                                                {
                                                    Kind = new StackVariable_v1(),
                                                    Type = new PrimitiveType_v1(Domain.SignedInt, 4)
                                                }
                                            }
                                        }
                                    }
                                }
                            },
                            Globals =
                            {
                                {
                                  Address.SegPtr(0x2000, 0),
                                  new GlobalDataItem_v2 {
                                       Address = Address.SegPtr(0x2000, 0).ToString(),
                                       DataType = new StringType_v2 {
                                           Termination=StringType_v2.ZeroTermination,
                                           CharType = new PrimitiveType_v1 { Domain = Domain.Character, ByteSize = 1 }
                                       }
                                  }
                                }
                            },
                            Calls =
                            {
                                {
                                    Address.SegPtr(0x1000, 0x0320),
                                    new UserCallData
                                    {
                                        Address = Address.SegPtr(0x1000, 0x0320),
                                        NoReturn = true,
                                    }
                                }
                            },
                            RegisterValues =
                            {
                                {
                                    Address.Ptr32(0x012310),
                                    new List<UserRegisterValue>
                                    {
                                        new UserRegisterValue { Register = eax, Value=Constant.Word32(0x01231) },
                                        new UserRegisterValue { Register = ecx, Value=Constant.Word32(0x42424711) },
                                    }
                                }
                            },
                            IndirectJumps =
                            {
                                {
                                    Address.SegPtr(0x1000, 0x380),
                                    new UserIndirectJump {
                                        Address = jumpTable.Address,
                                        Table = jumpTable,
                                        IndexRegister = new RegisterStorage("R1", 1, 0, PrimitiveType.Word32)
                                   }
                                }
                            },
                            JumpTables =
                            {
                                { jumpTable.Address, jumpTable }
                            }
                        }
                    }
                }
            };
            mr.ReplayAll();

            using (FileUnitTester fut = new FileUnitTester("Core/SudSaveProject.txt"))
            {
                FilteringXmlWriter writer = new FilteringXmlWriter(fut.TextWriter);
                writer.Formatting = System.Xml.Formatting.Indented;
                XmlSerializer ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4));
                Project_v4 ud = new ProjectSaver(sc).Save("/var/foo/foo.proj", project);
                ser.Serialize(writer, ud);
                fut.AssertFilesEqual();
            }
        }
Exemple #10
0
        /// <summary>
        /// Saves the project. 
        /// </summary>
        /// <returns>False if the user cancelled the save, true otherwise.</returns>
        public bool Save()
        {
            if (decompilerSvc.Decompiler == null)
                return true;
            if (string.IsNullOrEmpty(this.ProjectFileName))
            {
                string newName = PromptForFilename(
                    Path.ChangeExtension(
                        decompilerSvc.Decompiler.Project.Programs[0].Filename,
                        Project_v3.FileExtension));
                if (newName == null)
                    return false;
                ProjectFileName = newName;
                mru.Use(newName);
            }

            var fsSvc = Services.RequireService<IFileSystemService>();
            using (var xw = fsSvc.CreateXmlWriter(ProjectFileName))
            {
                var saver = new ProjectSaver(sc);
                var sProject = saver.Serialize(ProjectFileName, decompilerSvc.Decompiler.Project);
                saver.Save(sProject, xw);
            }
            return true;
        }