Use buffered disassembler to get disassembly as string
authorAmy Yu <amycmyu@gmail.com>
Fri, 8 Jun 2018 22:41:01 +0000 (15:41 -0700)
committerAmy Yu <amycmyu@gmail.com>
Fri, 8 Jun 2018 22:41:01 +0000 (15:41 -0700)
src/tools/r2rdump/CoreDisTools.cs
src/tools/r2rdump/R2RDump.cs

index 52cb900..a8d4f07 100644 (file)
@@ -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);
         }
     }
 }
index a6baf3a..bb457ca 100644 (file)
@@ -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
             {