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(); } } }
/// <summary> /// Creates a new managed disassembler /// </summary> /// <param name="compilationData">The compilation data</param> /// <param name="createDisassembler">Function to create the disassembler</param> /// <param name="options">The options</param> public Disassembler( AbstractCompilationData compilationData, Func <AbstractCompilationData, INativeDisassembler> createDisassembler, DisassemblerOptions options = DisassemblerOptions.None) { this.compilationData = compilationData; this.nativeDisassembler = createDisassembler(compilationData); this.options = options; }
/// <summary> /// Creates a new managed disassembler /// </summary> /// <param name="compilationData">The compilation data</param> /// <param name="createDisassembler">Function to create the disassembler</param> /// <param name="options">The options</param> public Disassembler( AbstractCompilationData compilationData, Func<AbstractCompilationData, INativeDisassembler> createDisassembler, DisassemblerOptions options = DisassemblerOptions.None) { this.compilationData = compilationData; this.nativeDisassembler = createDisassembler(compilationData); this.options = options; }