LuaStack returning null values menu

User Tag List

Results 1 to 6 of 6
  1. #1
    miceiken's Avatar Contributor Authenticator enabled
    Reputation
    209
    Join Date
    Dec 2007
    Posts
    401
    Thanks G/R
    7/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    LuaStack returning null values

    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!

    LuaStack returning null values
  2. #2
    JuJuBoSc's Avatar Banned for scamming CoreCoins Purchaser
    Reputation
    1019
    Join Date
    May 2007
    Posts
    922
    Thanks G/R
    1/3
    Trade Feedback
    1 (100%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    DoString don't put return value on the stack, you need to register your own callback and get result from here.

    Look at BabBot source code as I remember they managed to use this way.

  3. #3
    miceiken's Avatar Contributor Authenticator enabled
    Reputation
    209
    Join Date
    Dec 2007
    Posts
    401
    Thanks G/R
    7/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I don't use DoString for this. I use LuaLoad and LuaPCall

  4. #4
    miceiken's Avatar Contributor Authenticator enabled
    Reputation
    209
    Join Date
    Dec 2007
    Posts
    401
    Thanks G/R
    7/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    No suggestions?

  5. #5
    berserk85's Avatar Member
    Reputation
    8
    Join Date
    Apr 2008
    Posts
    35
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    1) Is RunStatus.Ok == 0 ??
    2) Are you sure that all return are String ? (if i can remember well LUA auto cast it but i'm not sure)
    3)You should push Function name and function Parameter.
    4) LuaPCallHandler(pState, 0, -1, -2) ... I think you should add more Lua function parameter ... LuaPCallHandler(pState, numOfFunctionParam, -1, 0)

    A code snip from my project (there is QTlist but is simple linked list)

    Code:
    QList<QVariant> LuaAdaptor::ExecuteFunction(QString FunctionName,QList<QVariant> in )
    {
    	CINJ_INMAINLOOP
    	QList<QVariant> ret;
    	void *L;
    	L = GetLuaState();
    
    	int level = Lua_gettop(L);
    	std::cerr << "level pre : " << level << std::endl;
    	Lua_Getglobal(L, FunctionName.toLatin1().data());  /* get function */
    
    	QVariant Element;
    	foreach(Element , in)
    	{
    		switch (Element.type())
    		{
    			case 1:
    				Lua_pushboolean(L,Element.toBool());
    				break;
    
    			case 2:
    				Lua_pushinteger(L,Element.toInt());
    				break;
    
    			case 10:
    				Lua_pushstring(L,Element.toString().toLatin1().data(),Element.toString().length());
    				break;
    
    			case 6:
    				Lua_pushnumber(L,Element.toDouble());
    				break;
    
    			default:
    				std::cerr << "Parsing Error" << std::endl;
    		}
    	}
    
    	
    	if (Lua_pcall(L, in.length(), LUA_MULTRET, 0) != 0)  /* do the call */
    		std::cerr << "CinJ::LuaAdaptor Error running pfunction " << FunctionName.toLatin1().data() << " ( " << Lua_tostring(L, -1,0) << " )" << std::endl ;
    
    	
    	int num_of_result = Lua_gettop(L) - level;
    
    	for(int i = Lua_gettop(L) ; i > level ; i--)
    	{
    
    		switch (Lua_type(L,i))
    		{
    			case LUA_TBOOLEAN:
    				//ret.prepend()
    				ret.prepend(QVariant(Lua_toboolean(L,i)));
    				break;
    			case LUA_TNUMBER:
    				ret.prepend(QVariant(Lua_tonumber(L,i)));
    				break;
    			case LUA_TSTRING:
    				ret.prepend(QVariant(Lua_tostring(L,i,0)));
    				break;
    			case LUA_TNIL:
    				ret.prepend(QVariant("nil"));
    				break;
    			default:
    				std::cerr << "CinJ::LuaAdaptor::FixMe Returned an unmanaged type" << Lua_type(L,i) << std::endl;
    		}
    
    	}
    	Lua_settop(L, level);
    	return ret;
    }
    Last edited by berserk85; 06-24-2010 at 02:14 AM.

  6. #6
    miceiken's Avatar Contributor Authenticator enabled
    Reputation
    209
    Join Date
    Dec 2007
    Posts
    401
    Thanks G/R
    7/9
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thanks for showing me that the problem lies in what I pass on with LuaPCall, before I implemented the function name and functionparams thing, I wanted to check if it actually would return anything, so I tested:
    Code:
    // pState, nargs, nresults, errfunc 
    // 1 argument in UnitName
    status = LuaPCallHandler(pState, 1, -1, 0);
    Code:
     13:23:06  Lua.GetReturnVal(UnitName("player");)
     13:23:06  LuaPCall failed: ErrRun

Similar Threads

  1. FrameScript_RegisterFunction callback return strange value
    By Wildbreath in forum WoW Memory Editing
    Replies: 5
    Last Post: 03-03-2014, 03:29 AM
  2. How to make Checksum return the correct Value
    By Xaser in forum Programming
    Replies: 2
    Last Post: 02-12-2009, 06:30 PM
  3. Getting the return value of Lua_DoString()
    By Nesox in forum WoW Memory Editing
    Replies: 43
    Last Post: 01-15-2009, 06:06 AM
  4. GetObjectByGUID return always NULL
    By goderion in forum WoW Memory Editing
    Replies: 22
    Last Post: 12-02-2008, 12:40 PM
All times are GMT -5. The time now is 03:48 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Google Authenticator verification provided by Two-Factor Authentication (Free) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search