118 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| #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");
 | ||
| } |