11111
This commit is contained in:
@@ -1,11 +1,4 @@
|
||||
#pragma once
|
||||
#include "squirrel.h"
|
||||
#include "sqstdaux.h"
|
||||
#include "sqstdblob.h"
|
||||
#include "sqstdio.h"
|
||||
#include "sqstdmath.h"
|
||||
#include "sqstdstring.h"
|
||||
#include "sqstdsystem.h"
|
||||
|
||||
#include "DNFTOOL.hpp"
|
||||
|
||||
@@ -13,110 +6,18 @@
|
||||
#include <ctime>
|
||||
#include <sstream>
|
||||
#include <chrono>
|
||||
typedef struct SQVM* HSQUIRRELVM;
|
||||
//注册 Nut API
|
||||
// PushRoot
|
||||
typedef int(SqPushRootFunc)(HSQUIRRELVM v);
|
||||
static SqPushRootFunc* Sq_pushroottable = (SqPushRootFunc*)0x1358C50;
|
||||
// // New槽
|
||||
typedef int(SqNewSlot)(HSQUIRRELVM v, int a, BOOL b);
|
||||
static SqNewSlot* SQNewSlot = (SqNewSlot*)0x135AA80;
|
||||
// 平栈
|
||||
typedef int(SqPopTop)(HSQUIRRELVM v);
|
||||
static SqPopTop* SQPopTop = (SqPopTop*)0x1358FF0;
|
||||
// Push 函数绑定闭包
|
||||
typedef int(realSqNewClosure)(HSQUIRRELVM v, void* funcAddr, int a);
|
||||
static realSqNewClosure* RealSqNewClosure = (realSqNewClosure*)0x135B850;
|
||||
//SQ_Call
|
||||
typedef int (Sq_CallFunc)(HSQUIRRELVM v, int params, int retval, int raiseerror);
|
||||
static Sq_CallFunc* Sq_call = (Sq_CallFunc*)0x1359280;
|
||||
// 平栈
|
||||
typedef int(SqPop)(HSQUIRRELVM v, int n);
|
||||
static SqPop* Sq_pop = (SqPop*)0x1358FD0;
|
||||
// 设置栈
|
||||
typedef int(SqSetTop)(HSQUIRRELVM v, int n);
|
||||
static SqSetTop* Sq_settop = (SqSetTop*)0x135AA40;
|
||||
//SQ_Get
|
||||
typedef int(Sq_Get)(HSQUIRRELVM v, int n);
|
||||
static Sq_Get* Sq_get = (Sq_Get*)0x135AE30;
|
||||
//GetTop
|
||||
typedef int(SqGetTopFunc)(HSQUIRRELVM v);
|
||||
static SqGetTopFunc* Sq_gettop = (SqGetTopFunc*)0x1358FC0;
|
||||
//GetInt
|
||||
typedef int(SqGetIntFunc)(HSQUIRRELVM v, int stackIndex, int* sint);
|
||||
static SqGetIntFunc* Sq_getinteger = (SqGetIntFunc*)0x1358D70;
|
||||
//GetString
|
||||
typedef int(SqGetStringFunc)(HSQUIRRELVM v, uint32_t stackIndex, const SQChar** sstring);
|
||||
static SqGetStringFunc* Sq_getstring = (SqGetStringFunc*)0x1358E70;
|
||||
//GetFloat
|
||||
typedef int(SqGetFloatFunc)(HSQUIRRELVM v, uint32_t stackIndex, FLOAT* sfloat);
|
||||
static SqGetFloatFunc* Sq_getfloat = (SqGetFloatFunc*)0x1358DD0;
|
||||
//GetBool
|
||||
typedef int(SqGetBoolFunc)(HSQUIRRELVM v, uint32_t stackIndex, SQBool* sbool);
|
||||
static SqGetBoolFunc* Sq_getbool = (SqGetBoolFunc*)0x1358E30;
|
||||
//GetUserdata
|
||||
typedef int(SqGetUserdataFunc)(HSQUIRRELVM v, uint32_t stackIndex, DWORD* up, DWORD* up1);
|
||||
static SqGetUserdataFunc* Sq_getuserdata = (SqGetUserdataFunc*)0x1358EC0;
|
||||
//GetObjtypetag
|
||||
typedef int(SqGetObjtypetagFunc)(HSQUIRRELVM v, DWORD* up);
|
||||
static SqGetObjtypetagFunc* Sq_getobjtypetag = (SqGetObjtypetagFunc*)0x1358F20;
|
||||
//GetUserpointer
|
||||
typedef int(SqGetUserpointerFunc)(HSQUIRRELVM v, uint32_t idx, DWORD* up);
|
||||
static SqGetUserpointerFunc* Sq_getuserpointer = (SqGetUserpointerFunc*)0x1358F80;
|
||||
#include "json.hpp"
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
|
||||
//Push
|
||||
typedef int(SqPushFunc)(HSQUIRRELVM v, int idx);
|
||||
static SqPushFunc* Sq_push = (SqPushFunc*)0x1358C90;
|
||||
//PushString
|
||||
typedef int(SqPushStringFunc)(HSQUIRRELVM v, const SQChar* s, int len);
|
||||
static SqPushStringFunc* Sq_pushstring = (SqPushStringFunc*)0x1358A60;
|
||||
//PushInt
|
||||
typedef int(SqPushIntFunc)(HSQUIRRELVM v, int sint);
|
||||
static SqPushIntFunc* Sq_pushinteger = (SqPushIntFunc*)0x1358AD0;
|
||||
//PushBool
|
||||
typedef int(SqPushBoolFunc)(HSQUIRRELVM v, SQBool sbool);
|
||||
static SqPushBoolFunc* Sq_pushbool = (SqPushBoolFunc*)0x1358B10;
|
||||
//PushFloat
|
||||
typedef int(SqPushFloatFunc)(HSQUIRRELVM v, FLOAT sfloat);
|
||||
static SqPushFloatFunc* Sq_pushfloat = (SqPushFloatFunc*)0x1358B60;
|
||||
//PushUserpointer
|
||||
typedef int(SqPushUserpointerFunc)(HSQUIRRELVM v, void* sfloat);
|
||||
static SqPushUserpointerFunc* Sq_pushuserpointer = (SqPushUserpointerFunc*)0x1358BA0;
|
||||
|
||||
//特殊操作
|
||||
typedef DWORD(_1359130)(void* thisc, DWORD a2, DWORD a3);
|
||||
static _1359130* Old1359130 = (_1359130*)0x1359130;
|
||||
|
||||
|
||||
//键盘按键是否按下
|
||||
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
|
||||
|
||||
//发包类型 地址
|
||||
typedef int(__fastcall* SendPacksType)(DWORD thisc, int Seat, int Parm);
|
||||
static SendPacksType _SendpacksType = (SendPacksType)0x1127D60;
|
||||
|
||||
//发包参数 BYTE
|
||||
typedef int(__fastcall* SendPacksByte)(DWORD thisc, int Seat, int Parm);
|
||||
static SendPacksByte _SendPacksByte = (SendPacksByte)0x1128550;
|
||||
|
||||
//发包参数 WORD
|
||||
typedef int(__fastcall* SendPacksWORD)(DWORD thisc, int Seat, int Parm);
|
||||
static SendPacksWORD _SendPacksWord = (SendPacksWORD)0x1128580;
|
||||
|
||||
//发包参数 DWORD
|
||||
typedef int(__fastcall* SendPacksDWORD)(DWORD thisc, int Seat, int Parm);
|
||||
static SendPacksDWORD _SendPacksDWord = (SendPacksDWORD)0x11285B0;
|
||||
|
||||
//发包参数 char
|
||||
typedef int(__fastcall* SendPacksChar)(DWORD thisc, int Seat, char* Parm, int Size);
|
||||
static SendPacksChar _SendPacksChar = (SendPacksChar)0x11285E0;
|
||||
|
||||
//发包函数 地址
|
||||
typedef DWORD SendPacks();
|
||||
static SendPacks* _SendPacks = (SendPacks*)0x1127EC0;
|
||||
#include "ffi.h"
|
||||
#include "ActiveHook.hpp"
|
||||
|
||||
|
||||
//StringBin文件缓存
|
||||
static std::vector<std::string> StringBin;
|
||||
|
||||
|
||||
|
||||
@@ -157,50 +58,21 @@ int RegisterItemColor_STL(HSQUIRRELVM v)
|
||||
|
||||
|
||||
|
||||
static SQInteger sq_GetLocalConfig(HSQUIRRELVM v)
|
||||
static SQInteger sq_StringBinById(HSQUIRRELVM v)
|
||||
{
|
||||
std::ifstream inFile;
|
||||
inFile.open("Rindro_Config.cfg"); // 默认当方式打开文件
|
||||
//没有打开文件
|
||||
if (!inFile.is_open()) {
|
||||
sq_pushnull(v);
|
||||
return 1;
|
||||
}
|
||||
SQInteger Idx;
|
||||
Sq_getinteger(v, 2, &Idx);
|
||||
|
||||
std::stringstream buffer;
|
||||
buffer << inFile.rdbuf();
|
||||
std::string Str = buffer.str();
|
||||
char* uncode = (char*)(StringBin[Idx]).c_str();
|
||||
|
||||
char* uncode = (char*)Str.c_str();
|
||||
//char* ss = DNFTOOL::GBKTOUTF8(std::string(uncode));
|
||||
wchar_t* cfg = DNFTOOL::charTowchar_t(uncode);
|
||||
|
||||
//int skey[] = DFCSkey;//定义解密数组
|
||||
//Cutecode(uncode, skey);//解密
|
||||
char* ss = DNFTOOL::GBKTOUTF8(std::string(uncode));
|
||||
wchar_t* cfg = DNFTOOL::charTowchar_t(ss);
|
||||
Sq_pushstring(v, cfg, -1);
|
||||
delete[]cfg;
|
||||
|
||||
return 1;
|
||||
}
|
||||
static SQInteger sq_SetLocalConfig(HSQUIRRELVM v)
|
||||
{
|
||||
const SQChar* valuebuf1;
|
||||
Sq_getstring(v, 2, &valuebuf1);
|
||||
char* OutPutText = DNFTOOL::SquirrelU2W(valuebuf1);
|
||||
|
||||
std::ofstream outFile;
|
||||
outFile.open("Rindro_Config.cfg", std::ios::trunc); // 默认当方式打开文件
|
||||
if (outFile.is_open()) {
|
||||
outFile << OutPutText;
|
||||
outFile.close();
|
||||
}
|
||||
else {
|
||||
std::cerr << "Unable to open file.";
|
||||
}
|
||||
|
||||
delete[]OutPutText;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static SQInteger sq_LongLongOperation(HSQUIRRELVM v)
|
||||
{
|
||||
@@ -481,18 +353,22 @@ static SQInteger sq_DrawNumber(HSQUIRRELVM v)
|
||||
Sq_getfloat(v, 6, (FLOAT*)&Yf);
|
||||
int Type;
|
||||
Sq_getinteger(v, 7, &Type);
|
||||
int Interval;
|
||||
Sq_getinteger(v, 8, &Interval);
|
||||
int OneOffset;
|
||||
Sq_getinteger(v, 9, &OneOffset);
|
||||
int Number;
|
||||
Sq_getinteger(v, 10, &Number);
|
||||
Sq_getinteger(v, 8, &Number);
|
||||
std::string Value = std::to_string(Number);
|
||||
|
||||
float fValue;
|
||||
// 通过指针类型转换
|
||||
reinterpret_cast<unsigned int*>(&fValue)[0] = Xf;
|
||||
|
||||
|
||||
int mathoffset = 0;
|
||||
for (size_t i = 0; i < Value.size(); i++)
|
||||
{
|
||||
int Idx = Value[i] - 48;
|
||||
if (Idx == 1)Ex_Draw_Img(*(int*)0x1B45B94, 0, X + (i * Interval) + OneOffset, Y, MyFont.Type[Type][Idx], Xf, Yf, 0, rgba, 0, 0);
|
||||
else Ex_Draw_Img(*(int*)0x1B45B94, 0, X + (i * Interval), Y, MyFont.Type[Type][Idx], Xf, Yf, 0, rgba, 0, 0);
|
||||
Ex_Draw_Img(*(int*)0x1B45B94, 0, X + mathoffset, Y, MyFont.Type[Type][Idx], Xf, Yf, 0, rgba, 0, 0);
|
||||
|
||||
mathoffset += (((*(short*)(MyFont.Type[Type][Idx] + 0x1C)) * fValue) - 5);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -2338,91 +2214,37 @@ static SQInteger LWriteAddress(HSQUIRRELVM v)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//Int转指针
|
||||
static SQInteger sq_I2P(HSQUIRRELVM v)
|
||||
{
|
||||
//内存地址 int型
|
||||
int Address;
|
||||
Sq_getinteger(v, 2, &Address);
|
||||
Sq_pushuserpointer(v, (void*)Address);
|
||||
return 1;
|
||||
}
|
||||
//指针转Int
|
||||
static SQInteger sq_P2I(HSQUIRRELVM v)
|
||||
{
|
||||
//内存地址 int型
|
||||
SQUserPointer Address;
|
||||
Sq_getuserpointer(v, 2, &Address);
|
||||
Sq_pushinteger(v, (int)Address);
|
||||
return 1;
|
||||
}
|
||||
//输出
|
||||
static SQInteger Sout(HSQUIRRELVM v)
|
||||
{
|
||||
int Top = Sq_gettop(v);
|
||||
if (Top <= 0)
|
||||
{
|
||||
sq_throwerror(v, L"Incorrect function argument");
|
||||
return 0;
|
||||
}
|
||||
const SQChar* Str;
|
||||
Sq_getstring(v, 2, &Str);
|
||||
|
||||
const SQChar* OutPutBuffer;
|
||||
Sq_getstring(v, 2, &OutPutBuffer);
|
||||
char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer);
|
||||
char* OutPutText = DNFTOOL::SquirrelU2WOut(Str);
|
||||
|
||||
std::vector<std::string> Data;
|
||||
DNFTOOL::Split(OutPutText, Data, "%L");
|
||||
delete[]OutPutText;
|
||||
std::cout << OutPutText << std::endl;
|
||||
|
||||
delete[] OutPutText;
|
||||
|
||||
if (Top != Data.size() + 1)
|
||||
{
|
||||
sq_throwerror(v, L"Incorrect function argument");
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t Fnum = Data.size();
|
||||
if (Fnum > 1)Fnum -= 1;
|
||||
std::string Text = "";
|
||||
for (size_t i = 0; i < Fnum; i++)
|
||||
{
|
||||
std::string Parameter;
|
||||
//获取值的类型
|
||||
int ValueType = sq_gettype(v, 3 + i);
|
||||
//判断值类型
|
||||
switch (ValueType)
|
||||
{
|
||||
case OT_INTEGER://int类型
|
||||
{
|
||||
int Value;
|
||||
Sq_getinteger(v, 3 + i, &Value);
|
||||
Parameter = std::to_string(Value);
|
||||
break;
|
||||
}
|
||||
case OT_FLOAT://float类型
|
||||
{
|
||||
FLOAT Value;
|
||||
Sq_getfloat(v, 3 + i, &Value);
|
||||
std::ostringstream oss;
|
||||
oss << Value;
|
||||
std::string str(oss.str());
|
||||
Parameter = str;
|
||||
break;
|
||||
}
|
||||
case OT_BOOL://bool类型
|
||||
{
|
||||
SQBool Value;
|
||||
Sq_getbool(v, 3 + i, &Value);
|
||||
switch (Value)
|
||||
{
|
||||
case true:
|
||||
Parameter = "true";
|
||||
break;
|
||||
case false:
|
||||
Parameter = "false";
|
||||
break;
|
||||
}
|
||||
//Parameter = std::to_string(Value);
|
||||
break;
|
||||
}
|
||||
case OT_STRING://string类型
|
||||
{
|
||||
const SQChar* Value;
|
||||
Sq_getstring(v, 3 + i, &Value);
|
||||
char* str = DNFTOOL::SquirrelU2W(Value);
|
||||
Parameter = str;
|
||||
delete[]str;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Parameter = " ";
|
||||
break;
|
||||
}
|
||||
Text += Data[i];
|
||||
Text += Parameter;
|
||||
}
|
||||
std::cout << Text << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2440,6 +2262,13 @@ static SQInteger Getmicroseconds(HSQUIRRELVM v)
|
||||
Sq_pushfloat(v, microseconds / 1000);
|
||||
return 1;
|
||||
}
|
||||
static SQInteger SQTime(HSQUIRRELVM v)
|
||||
{
|
||||
time_t t;
|
||||
time(&t);
|
||||
sq_pushinteger(v, *((SQInteger*)&t));
|
||||
return 1;
|
||||
}
|
||||
//新建窗口
|
||||
//窗口CALL
|
||||
typedef void(__fastcall* NoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3);
|
||||
@@ -2869,24 +2698,256 @@ static SQInteger sq_MouseClick(HSQUIRRELVM v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef int(_fastcall _112AF50)(DWORD thisc,DWORD Seat,int Idx , unsigned int NK);
|
||||
static _112AF50* GetItem112AF50 = (_112AF50*)0x112AF50;
|
||||
static _112AF50* Chanage112AF50 = (_112AF50*)0x8265A0;
|
||||
|
||||
int __declspec(naked)Get_Item(int ItemId) {
|
||||
__asm {
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
sub esp, 0xD0
|
||||
push ebx
|
||||
mov eax, ItemId
|
||||
mov dword ptr ss : [ebp - 0x04] , eax
|
||||
lea ecx, dword ptr ss : [ebp - 0xD0]
|
||||
mov eax, 0x65DE50
|
||||
call eax
|
||||
mov ecx, dword ptr ss : [ebp - 0x04]
|
||||
mov ebx, 0x01
|
||||
push ebx
|
||||
push eax
|
||||
push ecx
|
||||
mov eax, 0x972220
|
||||
call eax
|
||||
add esp, 0x0C
|
||||
pop ebx
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
ret 0x4
|
||||
}
|
||||
}
|
||||
static SQInteger sq_GetItem(HSQUIRRELVM v)
|
||||
{
|
||||
int Idx;
|
||||
Sq_getinteger(v, 2, &Idx);
|
||||
int A = Get_Item(Idx);
|
||||
Sq_pushinteger(v, A);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
typedef int(_fastcall _11A2030)(int thisc, void*, int a2, int a3, int a4, int a5);
|
||||
static _11A2030* SUB_11A2030 = (_11A2030*)0x11A2030;
|
||||
static SQInteger sq_Test(HSQUIRRELVM v)
|
||||
{
|
||||
int ObjectAddress = *(int*)0x1ab7cdc;
|
||||
for (int i = 0; i < 0x1000; i+= 0x4) {
|
||||
if (*(int*)(ObjectAddress + i)) {
|
||||
int Buffer = DNFTOOL::DNFDeCode(ObjectAddress + i);
|
||||
if (Buffer == 1073741824) std::cout << std::hex << (i) << std::endl;;
|
||||
}
|
||||
}
|
||||
//Sq_pushinteger(v, Ret);
|
||||
const SQChar* Path;
|
||||
sq_getstring(v, 2, &Path);
|
||||
char* a = new char[1024];
|
||||
//wchar_t* path = L"region/region.lst";
|
||||
SUB_11A2030(0x1D17638,0, (int)Path,(int)a, 0x100000, 0x19DAF4);
|
||||
|
||||
//std::cout << a << std::endl;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static SQInteger Sq_ActiveCallFunc(HSQUIRRELVM v)
|
||||
{
|
||||
// 得到参数个数
|
||||
SQInteger Count = sq_gettop(v);
|
||||
|
||||
// 得到函数地址
|
||||
SQInteger FuncAddressbuf;
|
||||
Sq_getinteger(v, 2, &FuncAddressbuf);
|
||||
|
||||
void* FuncAddress = (void*)FuncAddressbuf;
|
||||
|
||||
// 得到返回值类型
|
||||
const SQChar* RetTypebuf;
|
||||
Sq_getstring(v, 3, &RetTypebuf);
|
||||
char* OutPutText2 = DNFTOOL::SquirrelU2W(RetTypebuf);
|
||||
std::string RetType(OutPutText2);
|
||||
delete[]OutPutText2;
|
||||
|
||||
// 得到调用类型
|
||||
SQInteger CallType;
|
||||
Sq_getinteger(v, 4, &CallType);
|
||||
|
||||
std::vector<std::string> ParameterType;
|
||||
// 遍历参数类型数组
|
||||
sq_pushnull(v); // null iterator
|
||||
while (SQ_SUCCEEDED(sq_next(v, 5)))
|
||||
{
|
||||
const SQChar* path;
|
||||
Sq_getstring(v, -1, &path);
|
||||
char* OutPutText = DNFTOOL::SquirrelU2W(path);
|
||||
ParameterType.push_back(OutPutText);
|
||||
delete[]OutPutText;
|
||||
Sq_pop(v, 2);
|
||||
}
|
||||
Sq_pop(v, 1);
|
||||
|
||||
// 头部信息个数
|
||||
int HeaderCount = 5;
|
||||
|
||||
// 计算valist内存
|
||||
int AdrSize = 0;
|
||||
for (std::string Type : ParameterType)
|
||||
{
|
||||
if (CONTAINS_STRING(Type, "int"))
|
||||
AdrSize += sizeof(int);
|
||||
else if (CONTAINS_STRING(Type, "bool"))
|
||||
AdrSize += sizeof(bool);
|
||||
else if (CONTAINS_STRING(Type, "string"))
|
||||
AdrSize += sizeof(char*);
|
||||
else if (CONTAINS_STRING(Type, "float"))
|
||||
AdrSize += sizeof(float);
|
||||
else if (CONTAINS_STRING(Type, "pointer"))
|
||||
AdrSize += sizeof(void*);
|
||||
else if (CONTAINS_STRING(Type, "short"))
|
||||
AdrSize += sizeof(short);
|
||||
else if (CONTAINS_STRING(Type, "char"))
|
||||
AdrSize += sizeof(char);
|
||||
}
|
||||
|
||||
char* m = (char*)malloc(AdrSize);
|
||||
void* bm = m;
|
||||
// 定义函数签名
|
||||
ffi_cif cif;
|
||||
ffi_type** args = (ffi_type**)malloc(ParameterType.size() * sizeof(ffi_type*)); // 动态分配参数类型数组
|
||||
void** values = (void**)malloc(ParameterType.size() * sizeof(void*)); // 动态分配参数值数组
|
||||
ffi_arg result;
|
||||
|
||||
int CFlag = 0;
|
||||
for (int i = (HeaderCount + 1); i < (Count + 1); i++)
|
||||
{
|
||||
if (CONTAINS_STRING(ParameterType[0], "int"))
|
||||
{
|
||||
Sq_getinteger(v, i, (SQInteger*)m);
|
||||
args[CFlag] = &ffi_type_sint;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(int);
|
||||
}
|
||||
else if (CONTAINS_STRING(ParameterType[0], "float"))
|
||||
{
|
||||
Sq_getfloat(v, i, (SQFloat*)m);
|
||||
args[CFlag] = &ffi_type_float;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(float);
|
||||
}
|
||||
else if (CONTAINS_STRING(ParameterType[0], "bool"))
|
||||
{
|
||||
Sq_getbool(v, i, (SQBool*)m);
|
||||
args[CFlag] = &ffi_type_sint8;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(bool);
|
||||
}
|
||||
else if (CONTAINS_STRING(ParameterType[0], "string"))
|
||||
{
|
||||
|
||||
Sq_getstring(v, i, (const SQChar**)m);
|
||||
args[CFlag] = &ffi_type_pointer;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(void*);
|
||||
}
|
||||
else if (CONTAINS_STRING(ParameterType[0], "pointer"))
|
||||
{
|
||||
Sq_getuserpointer(v, i, (SQUserPointer*)m);
|
||||
args[CFlag] = &ffi_type_sint;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(int);
|
||||
}
|
||||
else if (CONTAINS_STRING(ParameterType[0], "short"))
|
||||
{
|
||||
Sq_getinteger(v, i, (SQInteger*)m);
|
||||
args[CFlag] = &ffi_type_sint16;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(short);
|
||||
}
|
||||
else if (CONTAINS_STRING(ParameterType[0], "char"))
|
||||
{
|
||||
Sq_getinteger(v, i, (SQInteger*)m);
|
||||
args[CFlag] = &ffi_type_schar;
|
||||
values[CFlag] = m;
|
||||
m += sizeof(char);
|
||||
}
|
||||
|
||||
ParameterType.erase(ParameterType.begin());
|
||||
CFlag++;
|
||||
}
|
||||
|
||||
ffi_type* RetTypeFlag = &ffi_type_void;
|
||||
|
||||
std::string RetTypeString = RetType;
|
||||
if (CONTAINS_STRING(RetTypeString, "int"))
|
||||
RetTypeFlag = &ffi_type_sint;
|
||||
else if (CONTAINS_STRING(RetTypeString, "float"))
|
||||
RetTypeFlag = &ffi_type_float;
|
||||
else if (CONTAINS_STRING(RetTypeString, "bool"))
|
||||
RetTypeFlag = &ffi_type_sint8;
|
||||
else if (CONTAINS_STRING(RetTypeString, "string"))
|
||||
RetTypeFlag = &ffi_type_pointer;
|
||||
else if (CONTAINS_STRING(RetTypeString, "pointer"))
|
||||
RetTypeFlag = &ffi_type_pointer;
|
||||
else if (CONTAINS_STRING(RetTypeString, "short"))
|
||||
RetTypeFlag = &ffi_type_sint16;
|
||||
else if (CONTAINS_STRING(RetTypeString, "char"))
|
||||
RetTypeFlag = &ffi_type_schar;
|
||||
|
||||
|
||||
int RetCore = 999;
|
||||
if (RetCore = ffi_prep_cif(&cif, (ffi_abi)CallType, CFlag, RetTypeFlag, args) == FFI_OK)
|
||||
{
|
||||
// 动态调用函数
|
||||
ffi_call(&cif, FFI_FN(FuncAddress), &result, values);
|
||||
}
|
||||
|
||||
free(args);
|
||||
free(values);
|
||||
free(bm);
|
||||
|
||||
if (CONTAINS_STRING(RetTypeString, "int"))
|
||||
Sq_pushinteger(v, (int)result);
|
||||
else if (CONTAINS_STRING(RetTypeString, "float"))
|
||||
Sq_pushfloat(v, (float)result);
|
||||
else if (CONTAINS_STRING(RetTypeString, "bool"))
|
||||
Sq_pushbool(v, (bool)result);
|
||||
else if (CONTAINS_STRING(RetTypeString, "string")) {
|
||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)result);
|
||||
Sq_pushstring(v, ss, -1);
|
||||
delete[]ss;
|
||||
}
|
||||
else if (CONTAINS_STRING(RetTypeString, "pointer"))
|
||||
Sq_pushuserpointer(v, (void*)result);
|
||||
else if (CONTAINS_STRING(RetTypeString, "short"))
|
||||
Sq_pushinteger(v, (int)result);
|
||||
else if (CONTAINS_STRING(RetTypeString, "char"))
|
||||
Sq_pushinteger(v, (int)result);
|
||||
else
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static SQInteger Sq_GetExportByName(HSQUIRRELVM v)
|
||||
{
|
||||
//获取函数符号名
|
||||
const SQChar* FuncNamebuf;
|
||||
Sq_getstring(v, 2, &FuncNamebuf);
|
||||
char* OutPutText2 = DNFTOOL::SquirrelU2W(FuncNamebuf);
|
||||
std::string FuncName(OutPutText2);
|
||||
delete[]OutPutText2;
|
||||
|
||||
HMODULE hModule = GetModuleHandle(NULL);
|
||||
if (!hModule)
|
||||
return 0;
|
||||
|
||||
FARPROC funcPtr = GetProcAddress(hModule, FuncName.c_str());
|
||||
if (!funcPtr)
|
||||
return 0;
|
||||
|
||||
Sq_pushinteger(v, (int)funcPtr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void RegisterMyNutApi(wchar_t* funcName, SQFUNCTION funcAddr)
|
||||
{
|
||||
@@ -2899,12 +2960,234 @@ void RegisterMyNutApi(wchar_t* funcName, SQFUNCTION funcAddr)
|
||||
}
|
||||
|
||||
|
||||
static SQInteger L_Str_Ptr(HSQUIRRELVM v)
|
||||
{
|
||||
const SQChar* str;
|
||||
Sq_getstring(v, 2, &str);
|
||||
Sq_pushuserpointer(v, (void*)str);
|
||||
return 1;
|
||||
}
|
||||
static SQInteger New_Point(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger Len;
|
||||
Sq_getinteger(v, 2, &Len);
|
||||
void* P = malloc(Len);
|
||||
Sq_pushuserpointer(v, P);
|
||||
return 1;
|
||||
}
|
||||
static SQInteger _file_releasehook(SQUserPointer p, SQInteger a)
|
||||
{
|
||||
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 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);
|
||||
*(BYTE*)(Address + Idx) = (BYTE)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);
|
||||
|
||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
|
||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
||||
free(str);
|
||||
Sq_pushstring(v, name, Length);
|
||||
delete[]name;
|
||||
}
|
||||
else
|
||||
{
|
||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
|
||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
||||
free(str);
|
||||
Sq_pushstring(v, name, -1);
|
||||
delete[]name;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
// 读内存字符串
|
||||
static SQInteger Memory_ReadStringByUtf8(HSQUIRRELVM v)
|
||||
{
|
||||
// 内存地址
|
||||
SQUserPointer Address;
|
||||
// 获取地址
|
||||
Sq_getuserpointer(v, 2, &Address);
|
||||
if (Sq_gettop(v) == 3)
|
||||
{
|
||||
SQInteger Length;
|
||||
Sq_getinteger(v, 3, &Length);
|
||||
|
||||
wchar_t* name = DNFTOOL::charTowchar_t((char*)Address);
|
||||
Sq_pushstring(v, name, Length);
|
||||
delete[]name;
|
||||
}
|
||||
else
|
||||
{
|
||||
wchar_t* name = DNFTOOL::charTowchar_t((char*)Address);
|
||||
Sq_pushstring(v, name, -1);
|
||||
delete[]name;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
// 读内存字符串
|
||||
static SQInteger Memory_ReadStringByBig5(HSQUIRRELVM v)
|
||||
{
|
||||
// 内存地址
|
||||
SQUserPointer Address;
|
||||
// 获取地址
|
||||
Sq_getuserpointer(v, 2, &Address);
|
||||
if (Sq_gettop(v) == 3)
|
||||
{
|
||||
SQInteger Length;
|
||||
Sq_getinteger(v, 3, &Length);
|
||||
|
||||
wchar_t* newadd = DNFTOOL::charTowchar_t((char*)Address);
|
||||
char* str = DNFTOOL::Big5ToUtf8(newadd);
|
||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
||||
free(str);
|
||||
Sq_pushstring(v, name, Length);
|
||||
delete[]name;
|
||||
}
|
||||
else
|
||||
{
|
||||
wchar_t* newadd = DNFTOOL::charTowchar_t((char*)Address);
|
||||
char* str = DNFTOOL::Big5ToUtf8(newadd);
|
||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
||||
free(str);
|
||||
Sq_pushstring(v, name, -1);
|
||||
delete[]name;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
// 转换字符串
|
||||
static SQInteger ConvertWideChar(HSQUIRRELVM v)
|
||||
{
|
||||
const SQChar* Str;
|
||||
Sq_getstring(v, 2, &Str);
|
||||
|
||||
const SQChar* olgcodepage;
|
||||
Sq_getstring(v, 3, &olgcodepage);
|
||||
char* OutPutText1 = DNFTOOL::SquirrelU2W(olgcodepage);
|
||||
std::string fromEncoding = OutPutText1;
|
||||
delete[]OutPutText1;
|
||||
|
||||
|
||||
if (CONTAINS_STRING(fromEncoding, "big5")) {
|
||||
|
||||
char* csa = DNFTOOL::wchar_tTochar((wchar_t*) Str);
|
||||
wchar_t* name = DNFTOOL::BIG5ToUnicode(csa);
|
||||
char* str = DNFTOOL::UnicodeToUtf8(name);
|
||||
wchar_t* realname = DNFTOOL::charTowchar_t(str);
|
||||
free(str);
|
||||
|
||||
Sq_pushstring(v, realname, -1);
|
||||
delete[]csa;
|
||||
delete[]name;
|
||||
delete[]realname;
|
||||
}
|
||||
else if (CONTAINS_STRING(fromEncoding, "unicode")) {
|
||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Str);
|
||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
||||
free(str);
|
||||
Sq_pushstring(v, name, -1);
|
||||
delete[]name;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 指针转Blob
|
||||
static SQInteger L_Point2Blob(HSQUIRRELVM v)
|
||||
{
|
||||
SQInteger P;
|
||||
sq_getinteger(v, 2, &P);
|
||||
SQInteger Count;
|
||||
sq_getinteger(v, 3, &Count);
|
||||
|
||||
char* Address = (char*)P;
|
||||
SQUserPointer Blobobj = sqstd_createblob(v, Count);
|
||||
memcpy(Blobobj, Address, Count);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static SQInteger OutPutTable(HSQUIRRELVM v)
|
||||
{
|
||||
const SQChar* Str;
|
||||
sq_getstring(v, 2, &Str);
|
||||
|
||||
char* OutPutText = DNFTOOL::wchar_tTochar((wchar_t*)Str);
|
||||
std::string str = OutPutText;
|
||||
delete[]OutPutText;
|
||||
|
||||
nlohmann::json ex1 = nlohmann::json::parse(str);
|
||||
|
||||
std::cout << std::setw(4) << ex1 << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void R_Register_Nut() {
|
||||
|
||||
RegisterMyNutApi(L"L_sq_Test", sq_Test);//zlib解压
|
||||
|
||||
RegisterMyNutApi(L"L_sq_GetLocalConfig", sq_GetLocalConfig);//获取本地配置
|
||||
RegisterMyNutApi(L"L_sq_SetLocalConfig", sq_SetLocalConfig);//设置本地配置
|
||||
|
||||
RegisterMyNutApi(L"Sq_OutPutTable", OutPutTable);
|
||||
RegisterMyNutApi(L"Sq_HookFunc", L_HookFunc);
|
||||
RegisterMyNutApi(L"Sq_DeHookFunc", L_DeHookFunc);
|
||||
RegisterMyNutApi(L"Str_Ptr", L_Str_Ptr);
|
||||
RegisterMyNutApi(L"Sq_New_Point", New_Point);
|
||||
RegisterMyNutApi(L"Register_Destruction", Register_Destruction);
|
||||
RegisterMyNutApi(L"Sq_Memory_WriteByteArr", Memory_WriteByteArr);
|
||||
RegisterMyNutApi(L"Sq_Memory_ReadString", Memory_ReadString);
|
||||
RegisterMyNutApi(L"Sq_Memory_ReadStringByUtf8", Memory_ReadStringByUtf8);
|
||||
RegisterMyNutApi(L"Sq_Memory_ReadStringByBig5", Memory_ReadStringByBig5);
|
||||
RegisterMyNutApi(L"Sq_ConvertWideChar", ConvertWideChar);
|
||||
RegisterMyNutApi(L"Sq_Point2Blob", L_Point2Blob);
|
||||
RegisterMyNutApi(L"L_Sq_CallFunc", Sq_ActiveCallFunc);//动态Call
|
||||
RegisterMyNutApi(L"L_Sq_GetExportByName", Sq_GetExportByName);//动态Call
|
||||
|
||||
RegisterMyNutApi(L"L_sq_GetItem", sq_GetItem);//获取Item
|
||||
|
||||
RegisterMyNutApi(L"L_sq_StringBinById", sq_StringBinById);//获取字符串在StringBin中
|
||||
RegisterMyNutApi(L"L_sq_LongLongOperation", sq_LongLongOperation);//longlong类型运算
|
||||
RegisterMyNutApi(L"L_sq_Dezlib", sq_Dezlib);//zlib解压
|
||||
RegisterMyNutApi(L"L_sq_DrawImg", sq_DrawImg);//绘制Img
|
||||
@@ -2987,9 +3270,14 @@ void R_Register_Nut() {
|
||||
RegisterMyNutApi(L"L_sq_RAB", LReadAddressB);//读内存
|
||||
RegisterMyNutApi(L"L_sq_WAB", LWriteAddressB);//写内存
|
||||
|
||||
RegisterMyNutApi(L"Sout", Sout);//输出
|
||||
RegisterMyNutApi(L"L_sq_I2P", sq_I2P);//int转指针
|
||||
RegisterMyNutApi(L"L_sq_P2I", sq_P2I);//指针转int
|
||||
|
||||
RegisterMyNutApi(L"printf", Sout);//输出
|
||||
//RegisterMyNutApi(L"L_ReplaceInString", ReplaceInString);//输出
|
||||
RegisterMyNutApi(L"Clock", Clock);//输出
|
||||
RegisterMyNutApi(L"L_Getmicroseconds", Getmicroseconds);//获取微秒级
|
||||
RegisterMyNutApi(L"Sq_Time", SQTime);
|
||||
|
||||
RegisterMyNutApi(L"L_NewWindows", NewWindows);//创建窗口
|
||||
RegisterMyNutApi(L"L_Cmd", sq_Cmd);//执行Cmd命令
|
||||
|
||||
Reference in New Issue
Block a user