From 95dcaddc7e754106ab711c09b7c7589502b06a77 Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Fri, 8 Jun 2018 15:41:01 -0700 Subject: [PATCH] Use buffered disassembler to get disassembly as string --- src/tools/r2rdump/CoreDisTools.cs | 17 ++++++++++++++--- src/tools/r2rdump/R2RDump.cs | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/tools/r2rdump/CoreDisTools.cs b/src/tools/r2rdump/CoreDisTools.cs index 52cb900..a8d4f07 100644 --- a/src/tools/r2rdump/CoreDisTools.cs +++ b/src/tools/r2rdump/CoreDisTools.cs @@ -21,21 +21,32 @@ namespace R2RDump [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) @@ -56,7 +67,7 @@ namespace R2RDump target = TargetArch.Target_Thumb; break; } - return InitDisasm(target); + return InitBufferedDisasm(target); } } } diff --git a/src/tools/r2rdump/R2RDump.cs b/src/tools/r2rdump/R2RDump.cs index a6baf3a..bb457ca 100644 --- a/src/tools/r2rdump/R2RDump.cs +++ b/src/tools/r2rdump/R2RDump.cs @@ -181,7 +181,7 @@ namespace R2RDump 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 { -- 2.7.4