2024-09-17 11:41:25 +08:00
|
|
|
|
#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);
|
|
|
|
|
|
|
2024-09-17 15:38:28 +08:00
|
|
|
|
const SQChar *TypecharBuf;
|
|
|
|
|
|
sq_getstring(v, 4, &TypecharBuf);
|
|
|
|
|
|
std::string Type(TypecharBuf);
|
2024-09-17 11:41:25 +08:00
|
|
|
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
}
|