コード例 #1
0
        public void SudWrite()
        {
            Project_v5 ud = new Project_v5
            {
                Inputs =
                {
                    new DecompilerInput_v5
                    {
                        DisassemblyDirectory = "",
                        User = new UserData_v4 {
                            ExtractResources = true,
                            Procedures =
                            {
                                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)
                                            }
                                        }
                                    }
                                }
                            },
                            LoadAddress = "1000:0000",
                            IndirectJumps =
                            {
                                new IndirectJump_v4 {
                                    InstructionAddress ="1000:0220",
                                    TableAddress ="1000:0228"
                                },
                            },
                            JumpTables = {
                                new JumpTable_v4
                                {
                                    TableAddress = "1000:0228",
                                    Destinations = new string[]
                                    {
                                        "1000:0230",
                                        "1000:0244",
                                        "1000:033F",
                                    }
                                }
                            }
                        }
                    }
                }
            };

			using (FileUnitTester fut = new FileUnitTester("Core/SudWrite.txt"))
			{
			    var writer = new FilteringXmlWriter(fut.TextWriter);
				writer.Formatting = System.Xml.Formatting.Indented;
                XmlSerializer ser = SerializedLibrary.CreateSerializer_v5(typeof(Project_v5));
				ser.Serialize(writer, ud);
				fut.AssertFilesEqual();
			}
		}
コード例 #2
0
ファイル: ProjectSerializerTests.cs プロジェクト: ghmole/reko
        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",
                                    }
                                }
                            },
                            OutputFilePolicy = Program.SegmentFilePolicy,
                            BlockLabels      =
                            {
                                new BlockLabel_v1
                                {
                                    Location = "115252",
                                    Name     = "errorExit",
                                }
                            }
                        }
                    }
                }
            };
            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);

            Assert.AreEqual(1, inputFile.User.BlockLabels.Count);
            var blockLabel = inputFile.User.BlockLabels["115252"];

            Assert.AreEqual("errorExit", blockLabel);
            Assert.AreEqual(Program.SegmentFilePolicy, inputFile.User.OutputFilePolicy);
        }