"演员#34; Lua表的地址到Lua表

时间:2016-01-04 19:01:41

标签: c++ lua lua-table

说我有一张桌子的地址 - 我将如何"演员"一个表变量呢?我并不关心"糟糕的做法"或崩溃,因为这只是个别问题。

我想做点什么 lua_table tab = *(lua_table*)0xaddr ......但在Lua全球环境中。

我知道这有多糟糕,但我真的需要知道这是否可行。这可能不是我尝试做的最佳方式,但我确信它是最简单的,并且如果可能的话它会起作用。我正在使用Lua 5.1.4。

2 个答案:

答案 0 :(得分:3)

Lua没有公开任何API。

修复设计会更容易,更多更强大,而不是试图强制它发挥作用。

答案 1 :(得分:1)

为了做你正在尝试的事情,你必须:

  1. 获取指向Lua表数据结构的指针。我确定你相信你已经有了这样的指针。但是Lua中没有任何东西可以保证你获得的指针(通过某种方式)实际上是指向表数据结构的指针。它可能是指向其他东西的指针。所以你需要通过Lua的内部进行搜索,以确保无论你从哪里得到这个指针,都会给你一个指向实际对象的指针。

  2. 找到在Lua内部声明的正确类型。 Lua使用一些C类型(Lua用C编写,而不是C ++)来表示主表数据结构。您必须跟踪此结构定义并使用它。

    粗略检查Lua库表明主表数据结构在lobject.h中定义,名称为Table

  3. 找到Lua用于操作此表正确的内部API。它显然是某种哈希表,但是您需要使用Lua的函数来实际执行任何操作。

    对Lua内部的粗略检查表明,此代码可以在ltable.h中找到。但是,可能有更多的API。另外,请注意,其中许多API都使用lua_State,因此他们可能会进行一些堆栈调整。

    您还需要查看Lua的API,以便您可以在不打破表的情况下学习如何使用它们。 Lua可能对何时调用某些函数或它们之间的顺序或其他什么有一定的期望。打破这些是你自己的危险。

  4. 即便如此,这个:

    Table tab = *(Table*)0xaddr
    

    永远不会工作。或者至少,不是你的意思。 Lua是用C语言编写的。这意味着Table不会像C ++值类型一样工作。复制它只会执行按位复制。因此,修改tab只会修改这些值的本地副本。如果那些是指向其他数据结构的指针,那可能没问题,因为你的指针和原始指针指向相同的数据结构。但是,如果您执行某些操作会更改表格中的Table::flags字段,例如,存储在Lua中的表格不会受到影响,只会显示您的本地tab副本。

    您必须将对象操作为指针,而不是原始文件的副本。

    Table *tab = reinterpret_cast<Table*>(0xaddr);