public void Scanner_GlobalDataRecursiveStructs() { var bytes = new byte[] { 0x17, 0x00, 0x21, 0x43, 0x00, 0x00, 0x21, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; Given_Program(Address.Ptr32(0x43210000), bytes); Given_Project(); var sc = new Scanner( this.program, new ImportResolver(project, program, eventListener), this.sc ); var ft = Given_Serialized_Signature(new SerializedSignature { ReturnValue = new Argument_v1 { Type = Real32() }, }); var str = new StructureType(); var fields = new StructureField[] { new StructureField(0, new Pointer(ft, 4), "func"), new StructureField(4, new Pointer(str, 4), "next"), }; str.Fields.AddRange(fields); sc.EnqueueUserGlobalData(Address.Ptr32(0x43210000), str); sc.ScanImage(); var sExpSig = @"Register real32 fn43210017() // stackDelta: 4; fpuStackDelta: 0; fpuMaxParam: -1 "; Assert.AreEqual(1, program.Procedures.Count); Assert.AreEqual(sExpSig, program.Procedures[Address.Ptr32(0x43210017)].Signature.ToString("fn43210017", FunctionType.EmitFlags.AllDetails)); }
public void Scanner_GlobalData_StructWithPadding() { var bytes = new byte[] { 0x03, 0x00, // Type field (halfword) 0x00, 0x00, // ...alignment padding 0x08, 0x0, 0x21, 0x43, // pointer to function 0xC3, // function code. }; Given_Program(Address.Ptr32(0x43210000), bytes); Given_Project(); var ft = new FunctionType( new Identifier("", PrimitiveType.Real32, null), new Identifier[0]); var str = new StructureType(); str.Fields.AddRange(new StructureField[] { new StructureField(0, PrimitiveType.Word16, "typeField"), // two-byte gap here. new StructureField(4, new Pointer(ft, 4), "pfn") }); var scanner = new Scanner( this.program, new ImportResolver(project, program, eventListener), this.sc); scanner.EnqueueUserGlobalData(Address.Ptr32(0x43210000), str); scanner.ScanImage(); Assert.AreEqual(1, program.Procedures.Count, "Scanner should have detected the pointer to function correctly."); Assert.AreEqual(Address.Ptr32(0x43210008), program.Procedures.Keys.First()); }
public void Scanner_GlobalData() { var bytes = new byte[] { 0x48, 0x00, 0x21, 0x43, 0x00, 0x00, 0x00, 0x01, 0x53, 0x00, 0x21, 0x43, 0x28, 0x00, 0x21, 0x43, 0x00, 0x00, 0x00, 0x02, 0x63, 0x00, 0x21, 0x43, 0x38, 0x00, 0x21, 0x43, 0x00, 0x00, 0x00, 0x03, 0x73, 0x00, 0x21, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; Given_Program(Address.Ptr32(0x43210000), bytes); var project = new Project { Programs = { program } }; var sc = new Scanner( this.program, new ImportResolver(project, program, eventListener), this.sc ); var ft1 = Given_Serialized_Signature(new SerializedSignature { ReturnValue = new Argument_v1 { Type = Int32() }, }); var ft2 = Given_Serialized_Signature(new SerializedSignature { ReturnValue = new Argument_v1 { Type = Char() } }); var str = new StructureType(); var fields = new StructureField[] { new StructureField(0, new Pointer(ft1, 4), "A"), new StructureField(4, PrimitiveType.Int32, "B"), new StructureField(8, new Pointer(ft2, 4), "C"), }; str.Fields.AddRange(fields); var elementType = new TypeReference("test", str); var arrayType = new ArrayType(elementType, 3); sc.EnqueueUserGlobalData(Address.Ptr32(0x43210000), arrayType); sc.ScanImage(); var sExpSig1 = @"Register ui32 sig1() // stackDelta: 4; fpuStackDelta: 0; fpuMaxParam: -1 "; var sExpSig2 = @"Register char sig2() // stackDelta: 4; fpuStackDelta: 0; fpuMaxParam: -1 "; Assert.AreEqual(6, program.Procedures.Count); Assert.AreEqual(sExpSig1, program.Procedures[Address.Ptr32(0x43210028)].Signature.ToString("sig1", FunctionType.EmitFlags.AllDetails)); Assert.AreEqual(sExpSig1, program.Procedures[Address.Ptr32(0x43210038)].Signature.ToString("sig1", FunctionType.EmitFlags.AllDetails)); Assert.AreEqual(sExpSig1, program.Procedures[Address.Ptr32(0x43210048)].Signature.ToString("sig1", FunctionType.EmitFlags.AllDetails)); Assert.AreEqual(sExpSig2, program.Procedures[Address.Ptr32(0x43210053)].Signature.ToString("sig2", FunctionType.EmitFlags.AllDetails)); Assert.AreEqual(sExpSig2, program.Procedures[Address.Ptr32(0x43210063)].Signature.ToString("sig2", FunctionType.EmitFlags.AllDetails)); Assert.AreEqual(sExpSig2, program.Procedures[Address.Ptr32(0x43210073)].Signature.ToString("sig2", FunctionType.EmitFlags.AllDetails)); }