"Cast"地址Luatable到Luatable
"Cast" the address of a Lua table to a Lua table
假设我有一个 table 的地址 - 我如何 "cast" 一个 table 变量给它?我不担心 "bad practice" 或崩溃,因为这只是个别问题。
我想做类似的事情
lua_table tab = *(lua_table*)0xaddr
...但在 Lua 全球环境中。
我知道这有多糟糕,但我真的需要知道这是否可能。这可能不是做我想做的事情的最好方法,但我很确定这是最简单的,如果可能的话它会起作用。我正在使用 Lua 5.1.4.
为了完成您的尝试,您必须:
获取指向 Lua table 的数据结构的指针。我相信您相信您已经有了这样的指针。但是 Lua 中没有任何东西可以保证您(通过某种方式)获得的指针实际上是指向 table 数据结构的指针。它可能是指向其他东西的指针。因此,您需要仔细研究 Lua 的内部结构,以确保无论您从何处获取此指针,都会为您提供指向实际对象的指针。
找到正确的类型,在 Lua 的内部声明。 Lua 使用一些 C 类型(Lua 是用 C 编写的,而不是 C++)来表示主要的 table 数据结构。您将必须找到这个结构定义并使用它。
对 Lua 库的粗略检查表明主要的 table 数据结构在 lobject.h
中定义,名称为 Table
.
找到 Lua 用来 操纵 这个 table 的内部 APIs 。它显然是某种散列 table,但您需要使用 Lua 的函数才能对其进行实际操作。
粗略检查 Lua 的内部结构表明可以在 ltable.h
中找到此代码。但是,可能还有更多 API 。另外,请注意,其中许多 API 都采用 lua_State
,因此它们可能会进行一些堆栈调整。
您还需要通读 Lua 的 API,这样您就可以在不 破坏 的情况下学习如何使用它们 table. Lua 可能对某些函数何时被调用或它们之间的顺序或其他有某些期望。打破这些后果自负。
即便如此,这:
Table tab = *(Table*)0xaddr
永远不会工作。或者至少,不是你想要的那样。 Lua 是用 C 编写的。这意味着 Table
不会像 C++ 值类型那样工作。复制它只会进行按位复制。所以修改 tab
只会修改这些值的本地副本。如果这些是指向其他数据结构的指针,那可能没问题,因为您的指针和原始指针指向相同的数据结构。但是如果你在table上执行一些改变Table::flags
字段的操作,比如Lua中存储的table不会受到影响,只会影响你本地的[=17] =] 复制将是。
您必须将对象作为指针来操作,而不是原始对象的副本。
Table *tab = reinterpret_cast<Table*>(0xaddr);
Lua 没有公开 API 这样做。
修复您的设计而不是试图强制它工作会更容易,更强大。
假设我有一个 table 的地址 - 我如何 "cast" 一个 table 变量给它?我不担心 "bad practice" 或崩溃,因为这只是个别问题。
我想做类似的事情
lua_table tab = *(lua_table*)0xaddr
...但在 Lua 全球环境中。
我知道这有多糟糕,但我真的需要知道这是否可能。这可能不是做我想做的事情的最好方法,但我很确定这是最简单的,如果可能的话它会起作用。我正在使用 Lua 5.1.4.
为了完成您的尝试,您必须:
获取指向 Lua table 的数据结构的指针。我相信您相信您已经有了这样的指针。但是 Lua 中没有任何东西可以保证您(通过某种方式)获得的指针实际上是指向 table 数据结构的指针。它可能是指向其他东西的指针。因此,您需要仔细研究 Lua 的内部结构,以确保无论您从何处获取此指针,都会为您提供指向实际对象的指针。
找到正确的类型,在 Lua 的内部声明。 Lua 使用一些 C 类型(Lua 是用 C 编写的,而不是 C++)来表示主要的 table 数据结构。您将必须找到这个结构定义并使用它。
对 Lua 库的粗略检查表明主要的 table 数据结构在
lobject.h
中定义,名称为Table
.找到 Lua 用来 操纵 这个 table 的内部 APIs 。它显然是某种散列 table,但您需要使用 Lua 的函数才能对其进行实际操作。
粗略检查 Lua 的内部结构表明可以在
ltable.h
中找到此代码。但是,可能还有更多 API 。另外,请注意,其中许多 API 都采用lua_State
,因此它们可能会进行一些堆栈调整。您还需要通读 Lua 的 API,这样您就可以在不 破坏 的情况下学习如何使用它们 table. Lua 可能对某些函数何时被调用或它们之间的顺序或其他有某些期望。打破这些后果自负。
即便如此,这:
Table tab = *(Table*)0xaddr
永远不会工作。或者至少,不是你想要的那样。 Lua 是用 C 编写的。这意味着 Table
不会像 C++ 值类型那样工作。复制它只会进行按位复制。所以修改 tab
只会修改这些值的本地副本。如果这些是指向其他数据结构的指针,那可能没问题,因为您的指针和原始指针指向相同的数据结构。但是如果你在table上执行一些改变Table::flags
字段的操作,比如Lua中存储的table不会受到影响,只会影响你本地的[=17] =] 复制将是。
您必须将对象作为指针来操作,而不是原始对象的副本。
Table *tab = reinterpret_cast<Table*>(0xaddr);
Lua 没有公开 API 这样做。
修复您的设计而不是试图强制它工作会更容易,更强大。