public FunctionPointer(string ModuleName, int Offset, MagicConvention CallingConvention) : base(ModuleName, Offset) { this.CallingConvention = CallingConvention; }
public FunctionPointer(ModulePointer Pointer, MagicConvention CallingConvention) { this.Pointer = Pointer; this.CallingConvention = CallingConvention; }
public void Call(IntPtr Address, MagicConvention CallingConvention, params object[] Arguments) => Call <int>(Address, CallingConvention, Arguments);
public T Call <T>(IntPtr Address, MagicConvention CallingConvention, params object[] Arguments) where T : struct { using (var asm = new ManagedFasm()) { asm.Clear(); switch (CallingConvention) { case MagicConvention.Cdecl: { asm.AddLine("push ebp"); for (var i = Arguments.Length - 1; i >= 0; --i) { asm.AddLine("push {0}", Arguments[i]); } asm.AddLine("mov eax, {0}", Address); asm.AddLine("call eax"); for (var i = 0; i < Arguments.Length; ++i) { asm.AddLine("pop ebp"); } asm.AddLine("pop ebp"); asm.AddLine("retn"); break; } case MagicConvention.StdCall: { for (var i = Arguments.Length - 1; i >= 0; --i) { asm.AddLine("push {0}", Arguments[i]); } asm.AddLine("mov eax, {0}", Address); asm.AddLine("call eax"); asm.AddLine("retn"); break; } case MagicConvention.FastCall: { if (Arguments.Length > 0) { asm.AddLine("mov ecx, {0}", Arguments[0]); } if (Arguments.Length > 1) { asm.AddLine("mov edx, {0}", Arguments[1]); } for (var i = Arguments.Length - 1; i >= 2; --i) { asm.AddLine("push {0}", Arguments[i]); } asm.AddLine("mov eax, {0}", Address); asm.AddLine("call eax"); asm.AddLine("retn"); break; } case MagicConvention.Register: { if (Arguments.Length > 0) { asm.AddLine("mov eax, {0}", Arguments[0]); } if (Arguments.Length > 1) { asm.AddLine("mov edx, {0}", Arguments[1]); } if (Arguments.Length > 2) { asm.AddLine("mov ecx, {0}", Arguments[2]); } for (var i = 3; i < Arguments.Length; ++i) { asm.AddLine("push {0}", Arguments[i]); } asm.AddLine("mov ebx, {0}", Address); asm.AddLine("call ebx"); asm.AddLine("retn"); break; } case MagicConvention.ThisCall: { if (Arguments.Length > 0) { asm.AddLine("mov ecx, {0}", Arguments[0]); } for (var i = Arguments.Length - 1; i >= 1; --i) { asm.AddLine("push {0}", Arguments[i]); } asm.AddLine("mov eax, {0}", Address); asm.AddLine("call eax"); asm.AddLine("retn"); break; } default: { throw new MemoryException("Unhandled calling convention '{0}'", CallingConvention.ToString()); } } return(ExecuteRemoteCode <T>(asm.Assemble())); } }
public void Call(ModulePointer Pointer, MagicConvention CallingConvention, params object[] Arguments) => Call(GetAddress(Pointer), CallingConvention, Arguments);
public T Call <T>(ModulePointer Pointer, MagicConvention CallingConvention, params object[] Arguments) where T : struct => Call <T>(GetAddress(Pointer), CallingConvention, Arguments);
public void Call(ModulePointer offs, MagicConvention cv, params object[] args) { Call(GetAddress(offs), cv, args); }
public T Call <T>(ModulePointer offs, MagicConvention cv, params object[] args) where T : struct { return(Call <T>(GetAddress(offs), cv, args)); }
public void Call(IntPtr addr, MagicConvention cv, params object[] args) { Call <int>(addr, cv, args); }