You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.9 KiB
67 lines
2.9 KiB
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Keystone
|
|
{
|
|
/// <summary>
|
|
/// Imported symbols for interop with keystone.dll.
|
|
/// </summary>
|
|
internal class NativeInterop
|
|
{
|
|
// This shouldn't be needed, even on Windows
|
|
// /// <summary>
|
|
// /// Taken from: http://stackoverflow.com/questions/10852634/using-a-32bit-or-64bit-dll-in-c-sharp-dllimport
|
|
// /// </summary>
|
|
// static NativeInterop()
|
|
// {
|
|
// var myPath = new Uri(typeof(NativeInterop).Assembly.CodeBase).LocalPath;
|
|
// var myFolder = Path.GetDirectoryName(myPath);
|
|
|
|
// var is64 = IntPtr.Size == 8;
|
|
// var subfolder = is64 ? "\\win64\\" : "\\win32\\";
|
|
|
|
// string dllPosition = myFolder + subfolder + "keystone.dll";
|
|
|
|
// // If this file exist, load it.
|
|
// // Otherwise let the marshaller load the appropriate file.
|
|
// if (File.Exists(dllPosition))
|
|
// LoadLibrary(dllPosition);
|
|
// }
|
|
|
|
// [DllImport("kernel32.dll")]
|
|
// private static extern IntPtr LoadLibrary(string dllToLoad);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_version" )]
|
|
internal static extern uint Version(ref uint major, ref uint minor);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_open")]
|
|
internal static extern KeystoneError Open(Architecture arch, int mode, ref IntPtr ks);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_close")]
|
|
internal static extern KeystoneError Close(IntPtr ks);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_free")]
|
|
internal static extern void Free(IntPtr buffer);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_strerror")]
|
|
internal static extern IntPtr ErrorToString(KeystoneError code);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_errno")]
|
|
internal static extern KeystoneError GetLastKeystoneError(IntPtr ks);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_arch_supported")]
|
|
internal static extern bool IsArchitectureSupported(Architecture arch);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_option")]
|
|
internal static extern KeystoneError SetOption(IntPtr ks, int type, IntPtr value);
|
|
|
|
[DllImport("keystone", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ks_asm")]
|
|
internal static extern int Assemble(IntPtr ks,
|
|
[MarshalAs(UnmanagedType.LPStr)] string toEncode,
|
|
ulong baseAddress,
|
|
out IntPtr encoding,
|
|
out uint size,
|
|
out uint statements);
|
|
}
|
|
}
|