public void VisitPointer(Pointer ptr) { switch (ptr.Size) { case 2: fmt.WriteKeyword("dw"); fmt.Write("\t"); fmt.Write(string.Format("0x{0:X4}", rdr.ReadByte())); fmt.WriteLine(); return; case 4: fmt.WriteKeyword("dd"); fmt.Write("\t"); fmt.Write(string.Format("0x{0:X8}", rdr.ReadUInt32())); fmt.WriteLine(); return; case 8: fmt.WriteKeyword("dq"); fmt.Write("\t"); fmt.Write(string.Format("0x{0:X16}", rdr.ReadUInt32())); fmt.WriteLine(); return; } }
public static object ReadPointer(Type pointerType, int size, EndianImageReader rdr, ReaderContext ctx) { Debug.Print("Reading pointer at offset {0}, size {1}", rdr.Offset, size); uint newOffset; switch (size) { default: throw new InvalidOperationException("Field size must be > 0."); case 1: newOffset = rdr.ReadByte(); break; case 2: newOffset = rdr.ReadUInt16(); break; case 4: newOffset = rdr.ReadUInt32(); break; } Debug.Print("Structure of type {0} must start at offset {1:X}", pointerType.Name, newOffset); rdr = rdr.Clone(); rdr.Offset = newOffset; var dst = Activator.CreateInstance(pointerType); var sr = new StructureReader(dst); sr.Read(rdr); return(dst); }
public void WriteByteRange(MemoryArea image, Address begin, Address addrEnd, InstrWriter writer) { EndianImageReader rdr = arch.CreateImageReader(image, begin); while (rdr.Address < addrEnd) { writer.Write(string.Format("{0:X2} ", rdr.ReadByte())); } }
public void DumpData(SegmentMap map, Address address, long cbBytes, Formatter stm) { const int BytesPerLine = 16; var linAddr = address.ToLinear(); ulong cSkip = linAddr - BytesPerLine * (linAddr / BytesPerLine); ImageSegment segment; if (!map.TryFindSegment(address, out segment) || segment.MemoryArea == null) { return; } byte[] prevLine = null; bool showEllipsis = true; EndianImageReader rdr = arch.CreateImageReader(segment.MemoryArea, address); while (cbBytes > 0) { StringBuilder sb = new StringBuilder(0x12); var bytes = new List <byte>(); var sbBytes = new StringBuilder(); try { sbBytes.AppendFormat("{0} ", rdr.Address); for (int i = 0; i < BytesPerLine; ++i) { if (cbBytes > 0 && cSkip == 0) { byte b = rdr.ReadByte(); bytes.Add(b); sbBytes.AppendFormat("{0:X2} ", b); sb.Append(0x20 <= b && b < 0x7F ? (char)b : '.'); --cbBytes; } else { sbBytes.Append(" "); if (cSkip > 0) { sb.Append(' '); } --cSkip; } } var ab = bytes.ToArray(); if (!HaveSameZeroBytes(prevLine, ab)) { stm.Write(sbBytes.ToString()); stm.WriteLine(sb.ToString()); showEllipsis = true; } else { if (showEllipsis) { stm.WriteLine("; ..."); showEllipsis = false; } } prevLine = ab; } catch { stm.WriteLine(); stm.WriteLine(";;; ...end of image"); return; } } }