Beispiel #1
0
        public void DumpAssembler(ImageMap map, Address addrStart, Address addrLast, TextWriter writer)
        {
            ImageSegment segment;

            if (!map.TryFindSegment(addrStart, out segment))
            {
                return;
            }
            var dasm = arch.CreateDisassembler(arch.CreateImageReader(segment.MemoryArea, addrStart));

            try
            {
                foreach (var instr in dasm)
                {
                    if (instr.Address >= addrLast)
                    {
                        break;
                    }
                    if (!DumpAssemblerLine(segment.MemoryArea, instr, writer))
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine(ex.Message);
                writer.WriteLine();
            }
        }
Beispiel #2
0
        public ImageWriter CreateImageWriter(Address addr)
        {
            ImageSegment segment;

            if (!ImageMap.TryFindSegment(addr, out segment))
            {
                throw new ArgumentException(string.Format("The address {0} is invalid.", addr));
            }
            return(Architecture.CreateImageWriter(segment.MemoryArea, addr));
        }
Beispiel #3
0
        public IEnumerable <MachineInstruction> CreateDisassembler(Address addr)
        {
            ImageSegment segment;

            if (!ImageMap.TryFindSegment(addr, out segment))
            {
                throw new ArgumentException(string.Format("The address {0} is invalid.", addr));
            }
            return(Architecture.CreateDisassembler(
                       Architecture.CreateImageReader(segment.MemoryArea, addr)));
        }
Beispiel #4
0
        public void DumpData(ImageMap map, Address address, long cbBytes, TextWriter stm)
        {
            ulong        cSkip = address.ToLinear() & 0x0F;
            ImageSegment segment;

            if (!map.TryFindSegment(address, out segment) || segment.MemoryArea == null)
            {
                return;
            }
            ImageReader rdr = arch.CreateImageReader(segment.MemoryArea, address);

            while (cbBytes > 0)
            {
                StringBuilder sb = new StringBuilder(0x12);
                try
                {
                    stm.Write("{0} ", rdr.Address);
                    for (int i = 0; i < 16; ++i)
                    {
                        if (cbBytes > 0 && cSkip == 0)
                        {
                            byte b = rdr.ReadByte();
                            stm.Write("{0:X2} ", b);
                            sb.Append(0x20 <= b && b < 0x7F
                                                                ? (char)b
                                                                : '.');
                            --cbBytes;
                        }
                        else
                        {
                            stm.Write("   ");
                            if (cSkip > 0)
                            {
                                sb.Append(' ');
                            }
                            --cSkip;
                        }
                    }
                }
                catch
                {
                    stm.WriteLine();
                    stm.WriteLine("...end of image");
                    return;
                }
                stm.WriteLine(sb.ToString());
            }
        }
Beispiel #5
0
        public void Dump(Program program, ImageMap map, TextWriter stm)
        {
            ImageMapSegment segment = null;

            if (map == null)
            {
                DumpAssembler(program.Image, program.Image.BaseAddress, program.Image.BaseAddress + (uint)program.Image.Length, stm);
            }
            else
            {
                foreach (ImageMapItem i in map.Items.Values)
                {
                    if (!program.Image.IsValidAddress(i.Address))
                    {
                        continue;
                    }
                    ImageMapSegment seg;
                    if (!map.TryFindSegment(i.Address, out seg))
                    {
                        continue;
                    }
                    if (seg != segment)
                    {
                        segment = seg;
                        stm.WriteLine(";;; Segment {0} ({1})", seg.Name, seg.Address);
                    }

                    //				Address addrLast = i.Address + i.Size;
                    ImageMapBlock block = i as ImageMapBlock;
                    if (block != null)
                    {
                        stm.WriteLine();
                        if (program.Procedures.ContainsKey(block.Address))
                        {
                            stm.WriteLine(block.Address.GenerateName("fn", "()"));
                        }
                        else
                        {
                            stm.WriteLine(block.Address.GenerateName("l", ":"));
                        }
                        DumpAssembler(program.Image, block.Address, block.Address + block.Size, stm);
                        continue;
                    }

                    ImageMapVectorTable table = i as ImageMapVectorTable;
                    if (table != null)
                    {
                        stm.WriteLine("{0} table at {1} ({2} bytes)",
                                      table.IsCallTable?"Call":"Jump",
                                      table.Address, table.Size);
                        foreach (Address addr in table.Addresses)
                        {
                            stm.WriteLine("\t{0}", addr != null ? addr.ToString() : "-- null --");
                        }
                        DumpData(program.Image, i.Address, i.Size, stm);
                    }
                    else
                    {
                        var segLast = segment.Address + segment.ContentSize;
                        var size    = segLast - i.Address;
                        size = Math.Min(i.Size, size);
                        DumpData(program.Image, i.Address, size, stm);
                    }
                }
            }
        }