So this function is a part of RegisterInputHandler function.
I can't figure out what is PatchOffset aka "Lua callback offset".
How can i find it?
Code:
public static int SetFunctionPtr(IntPtr pointer)
{
Log("SetFunctionPtr() - Starting ...");
bool ReturnVal;
uint p = (uint)pointer - PatchOffset - 5;
var buf = new byte[4];
var buf2 = new byte[1];
buf2[0] = 0xE9;
buf[3] = (byte) ((p & 0xFF000000) >> 24);
buf[2] = (byte) ((p & 0xFF0000) >> 16);
buf[1] = (byte) ((p & 0xFF00) >> 8);
buf[0] = (byte) ((p & 0xFF));
IntPtr hProcess = Kernel32.GetCurrentProcess();
// OpenProcess(ProcessAccessFlags.All, false, (UInt32)proc[0].Id);
Log(string.Format("SetFunctionPtr() - hProcess = {0:X}", (uint) hProcess));
ReturnVal = Kernel32.WriteProcessMemory(hProcess,
(IntPtr)PatchOffset, buf2, 1, out BytesWritten);
if (!ReturnVal)
{
Log(string.Format("SetFunctionPtr() - Error during first WriteProcessMemory"));
}
Log(string.Format("SetFunctionPtr() - Written {0:d} bytes", BytesWritten));
ReturnVal = Kernel32.WriteProcessMemory(hProcess, (IntPtr)(PatchOffset + 1), buf, 4,
out BytesWritten);
if (!ReturnVal)
{
Log(string.Format("SetFunctionPtr() - Error during second WriteProcessMemory"));
}
Log(string.Format("SetFunctionPtr() - Written {0:d} bytes", BytesWritten));
Log("SetFunctionPtr() - Done");
return BytesWritten;
}