/// <summary> /// Disassemble Binary Code. /// </summary> /// <param name="handle"> /// A Capstone handle. Should not be a null reference. /// </param> /// <param name="code"> /// A collection of bytes representing the binary code to disassemble. Should not be a null reference. /// </param> /// <param name="count"> /// The number of instructions to disassemble. A 0 indicates all instructions should be disassembled. /// </param> /// <param name="startingAddress"> /// The address of the first instruction in the collection of bytes to disassemble. /// </param> /// <returns> /// A native instruction handle. /// </returns> /// <exception cref="System.InvalidOperationException"> /// Thrown if the binary code could not be disassembled. /// </exception> public static SafeNativeInstructionHandle Disassemble(SafeCapstoneHandle handle, byte[] code, int count, ulong startingAddress) { // Copy Code to Unmanaged Memory. // // ... var pCode = MarshalExtension.AllocHGlobal <byte>(code.Length); Marshal.Copy(code, 0, pCode, code.Length); var pCount = (UIntPtr)count; var pHandle = handle.DangerousGetHandle(); var pInstructions = IntPtr.Zero; var pSize = (UIntPtr)code.Length; // var uStartingAddress = (ulong) startingAddress; // Disassemble Binary Code. // // ... var pResultCode = CapstoneImport.Disassemble(unchecked ((UIntPtr)(ulong)(ulong)handle.DangerousGetHandle()), pCode, pSize, startingAddress, pCount, ref pInstructions); if (pResultCode == UIntPtr.Zero) { throw new InvalidOperationException("Unable to disassemble binary code."); } var iResultCode = (int)pResultCode; var instructions = MarshalExtension.PtrToStructure <NativeInstruction>(pInstructions, iResultCode); // Free Unmanaged Memory. // // Avoid a memory leak. Marshal.FreeHGlobal(pCode); var instructionHandle = new SafeNativeInstructionHandle(instructions, pInstructions, pResultCode); return(instructionHandle); }
/// <summary> /// Disassemble Binary Code. /// </summary> /// <param name="handle"> /// A Capstone handle. Should not be a null reference. /// </param> /// <param name="code"> /// A collection of bytes representing the binary code to disassemble. Should not be a null reference. /// </param> /// <param name="count"> /// The number of instructions to disassemble. A 0 indicates all instructions should be disassembled. /// </param> /// <param name="startingAddress"> /// The address of the first instruction in the collection of bytes to disassemble. /// </param> /// <returns> /// A native instruction handle. /// </returns> /// <exception cref="System.InvalidOperationException"> /// Thrown if the binary code could not be disassembled. /// </exception> public static SafeNativeInstructionHandle Disassemble(SafeCapstoneHandle handle, byte[] code, int count, long startingAddress) { // Copy Code to Unmanaged Memory. // // ... var pCode = MarshalExtension.AllocHGlobal<byte>(code.Length); Marshal.Copy(code, 0, pCode, code.Length); var pCount = (IntPtr) count; var pHandle = handle.DangerousGetHandle(); var pInstructions = IntPtr.Zero; var pSize = (IntPtr) code.Length; var uStartingAddress = (ulong) startingAddress; // Disassemble Binary Code. // // ... var pResultCode = CapstoneImport.Disassemble(pHandle, pCode, pSize, uStartingAddress, pCount, ref pInstructions); if (pResultCode == IntPtr.Zero) { throw new InvalidOperationException("Unable to disassemble binary code."); } var iResultCode = (int) pResultCode; var instructions = MarshalExtension.PtrToStructure<NativeInstruction>(pInstructions, iResultCode); // Free Unmanaged Memory. // // Avoid a memory leak. Marshal.FreeHGlobal(pCode); var instructionHandle = new SafeNativeInstructionHandle(instructions, pInstructions, pResultCode); return instructionHandle; }