public override IEnumerable <MachineInstruction> CreateDisassembler(EndianImageReader rdr) { var bytes = rdr.Bytes; ulong uAddr = rdr.Address.ToLinear(); var hBytes = GCHandle.Alloc(bytes, GCHandleType.Pinned); INativeDisassembler ndasm = null; try { ndasm = native.CreateDisassembler(hBytes.AddrOfPinnedObject(), bytes.Length, (int)rdr.Offset, uAddr); for (;;) { INativeInstruction nInstr = ndasm.NextInstruction(); if (nInstr == null) { yield break; } else { yield return(new Arm64Instruction(nInstr)); } } } finally { if (ndasm != null) { ndasm = null; } if (hBytes != null && hBytes.IsAllocated) { hBytes.Free(); } } }
public Arm32Instruction(INativeInstruction nInstr) { this.nInstr = nInstr; nInstr.GetInfo(out info); this.Address = Address.Ptr32((uint)info.LinearAddress); this.Length = (int)info.Length; }