#pragma once #include "squirrel.h" #include "sqstdaux.h" #include "sqstdblob.h" #include "sqstdio.h" #include "sqstdmath.h" #include "sqstdstring.h" #include "sqstdsystem.h" #include "CConnectPool.h" #include "inline_hook.h" #include #include #include #include static SQInteger _file_releasehook(SQUserPointer p, SQInteger SQ_UNUSED_ARG(size)) { free((void *)p); return 0; } // 注册析构函数 static SQInteger Register_Destruction(HSQUIRRELVM v) { // 析构函数测试 SQUserPointer P; sq_getuserpointer(v, 2, &P); sq_setinstanceup(v, 3, P); sq_setreleasehook(v, 3, _file_releasehook); return 0; } static SQInteger PointerOperation(HSQUIRRELVM v) { SQUserPointer Address; sq_getuserpointer(v, 2, &Address); SQInteger Offset; sq_getinteger(v, 3, &Offset); const SQChar *Type; sq_getstring(v, 4, &Type); if (Type == "+") { sq_pushuserpointer(v, (void *)(Address + Offset)); } else if (Type == "-") { sq_pushuserpointer(v, (void *)(Address - Offset)); } return 1; } // 写字节数组 static SQInteger Memory_WriteByteArr(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); char *Address = (char *)P; size_t Idx = 0; sq_pushnull(v); // null iterator while (SQ_SUCCEEDED(sq_next(v, 3))) { SQInteger Buf; sq_getinteger(v, -1, &Buf); CMem::WriteUChar((Address + Idx), Buf); // 这里-1是值,-2是键 sq_pop(v, 2); // 在下一次迭代之前弹出键和值 Idx++; } sq_pop(v, 1); return 0; } // 读内存字符串 static SQInteger Memory_ReadString(HSQUIRRELVM v) { // 内存地址 SQUserPointer Address; // 获取地址 sq_getuserpointer(v, 2, &Address); if (sq_gettop(v) == 3) { SQInteger Length; sq_getinteger(v, 3, &Length); sq_pushstring(v, (char *)(Address), Length); } else { sq_pushstring(v, (char *)(Address), -1); } return 1; } static SQInteger register_Memory_func(HSQUIRRELVM v, SQFUNCTION f, const char *fname) { sq_pushroottable(v); sq_pushstring(v, fname, -1); sq_newclosure(v, f, 0); // create a new function sq_newslot(v, -3, SQFalse); sq_pop(v, 1); // pops the root table } static void RegisterMemory(HSQUIRRELVM v) { // 析构函数 register_Memory_func(v, Register_Destruction, "Register_Destruction"); // 运算 register_Memory_func(v, PointerOperation, "Sq_PointerOperation"); // 写字节 register_Memory_func(v, Memory_WriteByteArr, "Sq_Memory_WriteByteArr"); // 读字符串 register_Memory_func(v, Memory_ReadString, "Sq_Memory_ReadString"); }