コード例 #1
0
        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();
                }
            }
        }
コード例 #2
0
 public Arm32Instruction(INativeInstruction nInstr)
 {
     this.nInstr = nInstr;
     nInstr.GetInfo(out info);
     this.Address = Address.Ptr32((uint)info.LinearAddress);
     this.Length  = (int)info.Length;
 }