| 
									
										
										
										
											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"); | 
					
						
							|  |  |  |  | } |