So, I've started to code a bit on an injection project. Using EasyHook I've successfully managed to inject my DLL and hook EndScene. I've also managed to get DoString (FrameScript__Execute) to work correctly, however, when it comes to reading LUA return values, it seems that when I am trying to read from the LuaStack using GetTop and ToLString it just returns null. Here's some related code:
Code:
public static List<string> GetReturnVal(string lua, string file)
{
Log.Output("Lua.GetReturnVal({0})", lua);
lock (Dostringlock)
{
IntPtr pState = GetLuaStateHandler();
int originalTop = GetTopHandler(pState);
try
{
RunStatus status = LuaLoadHandler(pState, lua, lua.Length, file);
if (status != RunStatus.Ok)
{
Log.Output("LuaLoad Failed!");
ShowLuaStack(pState);
return null;
}
status = LuaPCallHandler(pState, 0, -1, -2);
if (status == RunStatus.Ok)
{
var stack = new List<string>();
int argCount = GetTopHandler(pState);
if (argCount > originalTop)
{
for (int i = originalTop + 1; i <= argCount; i++)
{
stack.Add(LuaTolStringHandler(pState, i, 0));
}
}
Log.Output("GetReturnVal succeeded");
ShowLuaStack(pState);
return stack;
}
Log.Output("LuaPCall failed: {0}", status);
ShowLuaStack(pState);
return null;
}
catch (Exception e)
{
Log.Output("Exception GetReturnValue: {0}", e.ToString());
return null;
}
finally
{
LuaSetTopHandler(pState, originalTop);
}
}
}
Code:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int LuaGetTop(IntPtr pLuaState);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void LuaSetTop(IntPtr pState, int data);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate string LuaTolString(IntPtr pLuaState, int index, int lenght);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate IntPtr GetLuaState();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate RunStatus LuaPCall(IntPtr pState, int nargs, int nresults, int errfunc);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate RunStatus LuaLoad(IntPtr pState, string dataToLoad, int dataLength, string chunkName);
Code:
public enum LuaOffsets : uint
{
GetLuaState = 0x004B1E50,
GetTop = 0x00488A80,
ToLString = 0x00488F90,
DoString = 0x004B32B0,
Load = 0x00974F00,
PCall = 0x00489B00,
SetTop = 0x00488AA0,
}
I will be very gratefull for any help!