111
This commit is contained in:
@@ -210,6 +210,18 @@ static SQInteger L_ReadAddress(HSQUIRRELVM v)
|
||||
sq_pushinteger(v, *(int *)Address);
|
||||
return 1;
|
||||
}
|
||||
// 读内存
|
||||
static SQInteger L_ReadPoint(HSQUIRRELVM v)
|
||||
{
|
||||
// 内存地址 int型
|
||||
SQUserPointer Address;
|
||||
// 获取地址
|
||||
sq_getuserpointer(v, 2, &Address);
|
||||
int *ptr = reinterpret_cast<int *>(Address);
|
||||
int value = *ptr;
|
||||
sq_pushuserpointer(v, (void *)(value));
|
||||
return 1;
|
||||
}
|
||||
// 读内存字符串
|
||||
static SQInteger L_ReadAddressString(HSQUIRRELVM v)
|
||||
{
|
||||
@@ -594,6 +606,17 @@ static SQInteger L_Str_Ptr(HSQUIRRELVM v)
|
||||
sq_pushuserpointer(v, (void *)str);
|
||||
return 1;
|
||||
}
|
||||
static SQInteger L_Ptr_Operation_A2S(HSQUIRRELVM v)
|
||||
{
|
||||
// 内存地址 int型
|
||||
SQUserPointer Address;
|
||||
// 获取地址
|
||||
sq_getuserpointer(v, 2, &Address);
|
||||
SQInteger Offset;
|
||||
sq_getinteger(v, 3, &Offset);
|
||||
sq_pushuserpointer(v, (void *)(Address + Offset));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static SQInteger New_Point(HSQUIRRELVM v)
|
||||
{
|
||||
@@ -611,6 +634,25 @@ static SQInteger Delete_Point(HSQUIRRELVM v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SQInteger Sq_getExportByName(HSQUIRRELVM v)
|
||||
{
|
||||
const SQChar *MoudleName;
|
||||
const SQChar *FuncName;
|
||||
|
||||
sq_getstring(v, 2, &MoudleName);
|
||||
sq_getstring(v, 3, &FuncName);
|
||||
|
||||
void *handle = dlopen(nullptr, RTLD_LAZY);
|
||||
if (!handle)
|
||||
return 0;
|
||||
|
||||
void *targetFunctionPtr = dlsym(handle, FuncName);
|
||||
if (!targetFunctionPtr)
|
||||
return 0;
|
||||
|
||||
sq_pushuserpointer(v, targetFunctionPtr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void RegisterGame(HSQUIRRELVM v)
|
||||
{
|
||||
@@ -622,6 +664,8 @@ static void RegisterGame(HSQUIRRELVM v)
|
||||
register_World_func(v, L_S_Ptr, _SC("S_Ptr"));
|
||||
register_World_func(v, L_Str_Ptr, _SC("Str_Ptr"));
|
||||
|
||||
register_World_func(v, L_Ptr_Operation_A2S, _SC("Ptr_Operation_A2S"));
|
||||
|
||||
// new一个指针
|
||||
register_World_func(v, New_Point, _SC("Sq_New_Point"));
|
||||
// 销毁一个指针
|
||||
@@ -633,6 +677,8 @@ static void RegisterGame(HSQUIRRELVM v)
|
||||
register_World_func(v, L_WriteAddress, _SC("Sq_WriteAddress"));
|
||||
// 读地址int
|
||||
register_World_func(v, L_ReadAddress, _SC("Sq_ReadAddress"));
|
||||
// 读地址Point
|
||||
register_World_func(v, L_ReadPoint, _SC("Sq_ReadPoint"));
|
||||
// 读地址字符串
|
||||
register_World_func(v, L_ReadAddressString, _SC("Sq_ReadAddressString"));
|
||||
// 读取Byte
|
||||
@@ -656,4 +702,5 @@ static void RegisterGame(HSQUIRRELVM v)
|
||||
|
||||
register_World_func(v, L_CallFunc, _SC("Sq_CallFunc"));
|
||||
|
||||
register_World_func(v, Sq_getExportByName, _SC("Sq_getExportByName"));
|
||||
}
|
||||
|
||||
118
include/SqrReg_Memory.hpp
Normal file
118
include/SqrReg_Memory.hpp
Normal file
@@ -0,0 +1,118 @@
|
||||
#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 <iostream>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <ffi.h>
|
||||
|
||||
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");
|
||||
}
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "SqrReg_Inven.hpp" //背包类
|
||||
#include "SqrReg_Battle_Field.hpp" //战斗对象类
|
||||
#include "SqrReg_Dungeon.hpp" //副本类
|
||||
#include "SqrReg_Memory.hpp" //内存类
|
||||
#include <iostream>
|
||||
#include <stdarg.h>
|
||||
|
||||
@@ -29,4 +30,5 @@ static void GlobaRegisterSquirrel(HSQUIRRELVM v)
|
||||
RegisterWorld(v); // 世界类
|
||||
RegisterPacket(v); // 发包类
|
||||
RegisterUser(v); // 用户类
|
||||
RegisterMemory(v); // 内存类
|
||||
}
|
||||
Reference in New Issue
Block a user