[DllImport("coredistools.dll")]
[return: MarshalAs(UnmanagedType.I8)]
- public static extern long InitDisasm(TargetArch Target);
+ public static extern long InitBufferedDisasm(TargetArch Target);
[DllImport("coredistools.dll")]
public static extern void DumpCodeBlock(long Disasm, ulong Address, IntPtr Bytes, int Size);
[DllImport("coredistools.dll")]
+ [return: MarshalAs(UnmanagedType.I8)]
+ public static extern long GetOutputBuffer();
+
+ [DllImport("coredistools.dll")]
+ public static extern void ClearOutputBuffer();
+
+ [DllImport("coredistools.dll")]
public static extern void FinishDisasm(long Disasm);
- public unsafe static void DumpCodeBlock(long Disasm, int Address, int Offset, byte[] image, int Size)
+ public unsafe static string GetCodeBlock(long Disasm, int Address, int Offset, byte[] image, int Size)
{
fixed (byte* p = image)
{
IntPtr ptr = (IntPtr)(p + Offset);
DumpCodeBlock(Disasm, (ulong)Address, ptr, Size);
}
+ IntPtr pBuffer = (IntPtr)GetOutputBuffer();
+ string buffer = Marshal.PtrToStringAnsi(pBuffer);
+ ClearOutputBuffer();
+ return buffer;
}
public static long GetDisasm(Machine machine)
target = TargetArch.Target_Thumb;
break;
}
- return InitDisasm(target);
+ return InitBufferedDisasm(target);
}
}
}
if (_disasm)
{
_writer.WriteLine($"Id: {rtf.Id}");
- CoreDisTools.DumpCodeBlock(_disassembler, rtf.StartAddress, r2r.GetOffset(rtf.StartAddress), r2r.Image, rtf.Size);
+ _writer.Write(CoreDisTools.GetCodeBlock(_disassembler, rtf.StartAddress, r2r.GetOffset(rtf.StartAddress), r2r.Image, rtf.Size));
}
else
{