¿Por qué L-> l_G -> _ defaultmeta.value.gc siempre es NULL?

Actualmente estoy tratando de hackear la implementación Lua de un juego para extender los métodos incorporados para los modders del juego.

Para hacerlo, trato de secuestrar un puntero a un válidolua_State estructura y registra nuevas bibliotecas con él.

Ahora he probado varios lugares / etapas del juego objetivo para interceptar el programa y robarlua_State de eso. Mi primer intento fue llamarluaL_openlib() al final debase_open(). Esta fue la primera vez que recibí esta excepción de puntero nulo:

Exception thrown: read access violation.

L->l_G->_defaultmeta.value.gc was nullptr.

De los comentarios que puedes ver, queEgor Sktiptunoff me sugirió mover el punto de entrada de mi hack a una función de nivel de usuario. Como sé, una de las primeras funciones que se llama esdofile()Robé ellua_State struct desde allí y se lo pasé a mi DLL.

Lo que ves aquí es el código real de mi DLL inyectado que intenté ejecutar al final debase_open() ydofile() (nivel de usuario):

EXTERN_DLL_EXPORT void initialize(lua_State *L)
{
    if (initialized == true) {
        return;
    }

    initialized = true;

    lua_pushvalue(L, LUA_GLOBALSINDEX);          // Works
    luaL_openlib(L, "ext", extension_funcs, 0);  // Crashes with "L->l_G->_defaultmeta.value.gc was nullptr"
}

A continuación puede encontrar la captura de pantalla de una sesión de depuración y la ubicación donde se produce la excepción. loslua_State objeto es el que robé y se pasó a p. ej.dofile. Como puede ser queL->l_G->_defaultmeta.value.gc esNULL ¿en este punto en el tiempo? ¿Hay algo que pueda hacer aquí o hay alguna explicación para esto?

Sé que el juego que intento hackear aquí usa un "versión ligeramente diferente de Lua 5.0", pero ¿podría ser que cambiaron la forma en que funciona la recolección de basura o algo así? Porque hay ...

Una cosa más a tener en cuenta:

El juego tiene a Lua compilado. La DLL que creé tienesu propia compilación de Lua 5.0.1. Por supuesto, existe la posibilidad de que los desarrolladores de juegos en ese entonces decidieran no solo "ligeramente"cambia Lua, pero en cambio cámbialomucho. Siempre estoy asumiendo que todo lo que hicieron los desarrolladores fue eliminar algunas bibliotecas predeterminadas y agregar algunas otras funciones integradas comoLOG(), WARN(), etc. Sería extraño si cambiaran el código en el núcleo de Lua, pero les digo que alguien que tenga una idea sobre Lua podría considerar esto como una explicación de la excepción que estoy recibiendo aquí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta