diff --git a/test/DNFTOOL.cpp b/test/DNFTOOL.cpp new file mode 100644 index 0000000..2183eda --- /dev/null +++ b/test/DNFTOOL.cpp @@ -0,0 +1,278 @@ +#include "pch.h" +#include "DNFTOOL.h" + +int DNFTOOL::GetExeNutWrtNum(int Pos) +{ + int num = *(int*)(0x40079F + (Pos * 4)); + return num; +} + +void DNFTOOL::SetExeNutWrtNum(int Pos, int num) +{ + int* p = (int*)(0x40079F + (Pos * 4)); + *p = num; +} + +int DNFTOOL::GetNutArrNum(int Nut头地址, int Pos) +{ + int num = *(int*)(Nut头地址 + (Pos * 8)); + return num; +} + +void DNFTOOL::SetNutArrNum(int Nut头地址, int Pos, int num) +{ + int* p = (int*)(Nut头地址 + (Pos * 8)); + *p = num; +} + +int DNFTOOL::GetHook(int Addr, std::string 地址) +{ + size_t pos = 地址.find("+"); + size_t size = 地址.size(); + int GetHookArr[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; + int i = 0; + + while (pos != std::string::npos) + { + std::string x = 地址.substr(0, pos); + GetHookArr[i] = stoi(x, 0, 16); + i++; + 地址 = 地址.substr(pos + 1, size); + pos = 地址.find("+"); + } + + int num; + num = *(int*)(Addr); + + if (num != 0) + { + for (int z = 0; z < i; z++) + { + num = *(int*)(num + GetHookArr[z]); + } + } + return num; +} + +int DNFTOOL::DNFDeCode(int Address) +{ + DWORD nEax, nEcx8, nEsi, nEdx, nTmp; + nEax = *(int*)(Address); + if (nEax == -1) + return nEax; + nEcx8 = *(int*)(Address + 8); + if (nEcx8 == -1) + return nEcx8; + nEsi = *(int*)(0x1AF8D78); + nEdx = nEax >> 16; + nTmp = (nEdx << 2) + nEsi + 36; + nEdx = *(int*)(nTmp); + if (nEdx == -1) + return nEdx; + nEax = nEax & 65535; + nTmp = (nEax << 2) + nEdx + 8468; + nEax = *(int*)(nTmp); + if (nEax == -1) + return nEax; + _asm + { + mov eax, nEax + movzx edx, ax + mov nEdx, edx + } + nEsi = nEdx << 16; + nEsi = nEsi | nEdx; + nEax = nEsi ^ nEcx8; + return nEax; + return 0; +} + +void DNFTOOL::DNFEnCode(int AddreSs, int Data) +{ + long JEdi, JEcx, JEax, JEsi, JEdx, JSs; + JEcx = AddreSs; + JEax = *(int*)(0x1AF8DB8); + JEax = JEax + 1; + *(int*)(0x1AF8DB8) = JEax; + JEdx = JEax; + JEdx = JEdx >> 8; + JEdx = JEdx << 24; + JEdx = JEdx >> 24; + JEdx = *(int*)(JEdx * 2 + 0x1843F58); + JEdx = JEdx & 0xFFFF; + JEax = JEax << 24; + JEax = JEax >> 24; + JSs = *(int*)(JEax * 2 + 0x1844158); + JSs = JSs & 0xFFFF; + JEdx = JEdx ^ JSs; + JEax = JEdx; + JEax = JEax & 0xFFFF; + JEsi = Data; + JEdx = JEsi >> 16; + Sleep(10); + JSs = JEsi & 0xFFFF; + JEdx = JEdx + JSs; + JEdx = JEdx ^ JEax; + JEdi = JEdx; + JEdx = JEax; + JEax = JEax << 16; + JEax = JEax + JEdx; + JEsi = Data; + JEax = JEax ^ JEsi; + JEsi = AddreSs + 8; + *(int*)(JEsi) = JEax; + JEax = *(int*)(AddreSs); + JEsi = *(int*)(0x1AF8D78); + + JEcx = JEdi; + JEcx = JEcx << 16; + JEcx = JEcx + JEdx; + JEdx = JEax; + JEdx = JEdx >> 16; + JEdx = *(int*)(JEsi + JEdx * 4 + 36); + JEax = JEax & 0xFFFF; + *(int*)(JEdx + JEax * 4 + 8468) = JEcx; +} + +int DNFTOOL::GetEquAddr(int addr) +{ + switch (addr) + { + case 1: + return 0x3038; + break; + case 2: + return 0x304C; + break; + case 3: + return 0x3048; + break; + case 4: + return 0x3050; + break; + case 5: + return 0x3044; + break; + case 6: + return 0x3040; + break; + case 7: + return 0x3058; + break; + case 8: + return 0x305C; + break; + case 9: + return 0x3054; + break; + case 10: + return 0x3060; + break; + case 11: + return 0x3064; + break; + case 12: + return 0x3038; + break; + + + case 13: + return 0x3008; + break; + case 14: + return 0x300C; + break; + case 15: + return 0x3010; + break; + case 16: + return 0x3014; + break; + case 17: + return 0x3018; + break; + case 18: + return 0x301C; + break; + case 19: + return 0x3020; + break; + case 20: + return 0x3024; + break; + case 21: + return 0x3028; + break; + case 22: + return 0x302C; + break; + case 23: + return 0x3030; + break; + case 24: + return 0x3068; + break; + case 25: + return 0x306C; + break; + case 26: + return 0x3070; + break; + case 27: + return 0x3074; + break; + } + return -1; +} + +char* DNFTOOL::UnicodeToAnsi(const wchar_t* szStr, char* pResult, int maxLen) +{ + if (NULL == pResult) + return NULL; + int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL); + if (0 == nLen) + { + return NULL; + } + if (nLen >= maxLen) + nLen = maxLen; + WideCharToMultiByte(CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL); + return pResult; +} + +wchar_t* DNFTOOL::AnsiToUnicode(const char* szStr, wchar_t* pResult, int maxLen) +{ + if (NULL == pResult) + return NULL; + int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0); + if (0 == nLen) + { + return NULL; + } + if (nLen >= maxLen) + nLen = maxLen; + + nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen); + if (0 == nLen) + { + return NULL; + } + return pResult; +} + +void DNFTOOL::WindowsNotice(char* str, int type, int b) +{ + DWORD thisc = 0x1A5FB20; + thisc = *(DWORD*)thisc; + _NoticeTcall(thisc, 0, type, str, b); +} + +void DNFTOOL::GMNotice(char* str, int type, int color) +{ + if (type == NULL)type = 14; + if (color == NULL)color = 0x65535; + DWORD thisc = 0x1A5FB20; + thisc = *(DWORD*)thisc; + thisc = *(DWORD*)(thisc + 0x40); + _Noticecall(thisc, 0, str, color, type, 0, 0, 0); +} diff --git a/test/DNFTOOL.h b/test/DNFTOOL.h new file mode 100644 index 0000000..31d8e3a --- /dev/null +++ b/test/DNFTOOL.h @@ -0,0 +1,80 @@ +#pragma once + + + + +//发包函数 地址 +typedef DWORD SendPacks(); +static SendPacks* _SendPacks = (SendPacks*)0x1127EC0; + +//发包Class this地址 +typedef DWORD SendClass; +static SendClass* _SendClass = (SendClass*)0x1AEB6E4; + +//发包类型 地址 +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; + + +//公告Class this地址 +typedef DWORD NoticeClass; +static NoticeClass* _NoticeClass = (NoticeClass*)0x1A5FB20; +//公告CALL +typedef void(__fastcall* NoticeCall)(DWORD thisc, int Seat, char* a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6); +static NoticeCall _Noticecall = (NoticeCall)0x9536C0; + +//窗口CALL +typedef void(__fastcall* NoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3); +static NoticeTCall _NoticeTcall = (NoticeTCall)0xE6E070; + +//绘制?//TODO +typedef int(DrawTe)(DWORD thisc, int a2, int a3, int a4, int a5, int a6, __int64 a7, float a8, float a9, float a10, int a11, int a12); +//static NoticeTCall _NoticeTcall = (NoticeTCall)0xE6E070; + + +class DNFTOOL +{ +private: + + +public: + + //获取EXE使用头 号位数据 + static int GetExeNutWrtNum(int Pos); + //写EXE使用头 号位数据 + static void SetExeNutWrtNum(int Pos, int num); + //获取Nut头 号位数据 + static int GetNutArrNum(int Nut头地址, int Pos); + //写Nut头 号位数据 + static void SetNutArrNum(int Nut头地址, int Pos, int num); + //读内存偏移地址 + static int GetHook(int Addr, std::string 地址); + //解密读取 + static int DNFDeCode(int Address); + //加密写入 + static void DNFEnCode(int AddreSs, int Data); + + //获取装备偏移地址 + static int GetEquAddr(int addr); + + static char* UnicodeToAnsi(const wchar_t* szStr, char* pResult, int maxLen); + static wchar_t* AnsiToUnicode(const char* szStr, wchar_t* pResult, int maxLen); + + //窗口公告 0x10d + static void WindowsNotice(char* str, int type = 0x10d, int b = 0x0); + //GM公告 + static void GMNotice(char* str, int type, int color); +}; + diff --git a/test/dllmain.cpp b/test/dllmain.cpp index a95f905..d0e6726 100644 --- a/test/dllmain.cpp +++ b/test/dllmain.cpp @@ -8,101 +8,11 @@ -static realSqNewClosure* MLnewclosure = NULL; - -uint32_t NewClosure(uint32_t v, void* f, int freeVarsCnt) -{ - std::cout << std::endl; - - wchar_t* funcName; - SQGetString(v, -1 - freeVarsCnt, &funcName); - //if (funcName == L"sq_CreateAICharacter") - //{ - //wprintf(L"Funaddr:%s\t", f); - //std::cout << f << std::endl; - //} - wprintf(L"Funname:%s\tAbli:%d\tFunAddr:0x%p", funcName, freeVarsCnt, f); - - - return MLnewclosure(v, f, freeVarsCnt); -} - -static SqPushStringFunc* MLSqPushString = NULL; - -uint32_t NewPushString(uint32_t v, wchar_t* f, int freeVarsCnt) -{ - std::cout << std::endl; - - wprintf(L"Funname:%s\tAbli:%d\tFunAddr:0x%p", f, freeVarsCnt, f); - - return MLSqPushString(v, f, freeVarsCnt); -} - - - - -RecvPacks Cbuffer; -void Tihuan(int a1,int a2, int a3 ,int a4 ,int a5 , unsigned int a6) -{ - - std::cout << a1 << std::endl; - std::cout << a2 << std::endl; - std::cout << a3 << std::endl; - std::cout << a4 << std::endl; - std::cout << a5 << std::endl; - std::cout << a6 << std::endl; - - -} - - - -int HOOK() -{ - std::cout << u8"寮濮媓ook" << std::endl; - - if (MH_Initialize() != MH_OK)//鍒濆鍖朒ook - { - return 1; - } - - if (MH_CreateHook((void*)0x1128910, &Tihuan, - reinterpret_cast(&Cbuffer)) != MH_OK) - { - return 2; - } - - // Enable the hook for MessageBoxW. - if (MH_EnableHook((void*)0x1128910) != MH_OK) - { - return 3; - } - - - /* - if (MH_CreateHook((void*)0x1358A60, &NewClosure, - reinterpret_cast(&MLnewclosure)) != MH_OK) - { - return 2; - } - - // Enable the hook for MessageBoxW. - if (MH_EnableHook((void*)0x1358A60) != MH_OK) - { - return 3; - } - */ - - - return 0; -} - - void testcall() { - + } void LenheartThread(void) @@ -112,28 +22,23 @@ void LenheartThread(void) static int 灞炴уご鍦板潃; static int 鍙紑濮嬫墽琛屽垽鏂; - while (true) { Sleep(10); - - if (GetHook(0x1A5FB4C, "0x14+0x28+") == 6)鍙紑濮嬫墽琛屽垽鏂 = 1; + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6)鍙紑濮嬫墽琛屽垽鏂 = 1; if (鍙紑濮嬫墽琛屽垽鏂 == 1) { - RegisterNut(); - while (true) { Sleep(10); - - if (GetExeNutWrtNum(61) != 0 && Nut澶村湴鍧 == 0)Nut澶村湴鍧 = GetExeNutWrtNum(61); + if (DNFTOOL::GetExeNutWrtNum(61) != 0 && Nut澶村湴鍧 == 0)Nut澶村湴鍧 = DNFTOOL::GetExeNutWrtNum(61); //if (GetExeNutWrtNum(61 != 0))灞炴уご鍦板潃 = GetExeNutWrtNum(61); - if (GetExeNutWrtNum(0) == 666) + if (DNFTOOL::GetExeNutWrtNum(0) == 666) { std::cout << u8"鍐欐垚鍔" << std::endl;; testcall(); - SetExeNutWrtNum(0, 0); - SetNutArrNum(Nut澶村湴鍧 , 20, 0); + DNFTOOL::SetExeNutWrtNum(0, 0); + DNFTOOL::SetNutArrNum(Nut澶村湴鍧 , 20, 0); } } } @@ -142,104 +47,11 @@ void LenheartThread(void) - - -#include "inlinehook.h" - -inlinehook* TEA = nullptr; -inlinehook* TEB = nullptr; - - -void JMPre(int address) -{ - _asm - { - pop ebp - add esp, 0x00000004 - ret - } -} - -void qubb(int a1,int a2,int a3) -{ - _asm - { - push esi - push edi - pushfd - cld - mov ecx, dword ptr[ebp + 0x10] - mov esi, dword ptr[ebp + 0x0c] - mov edi, dword ptr[ebp + 0x08] - rep movsb - popfd - pop edi - pop esi - } -} - -void datec() -{ - int ptrd; - int packtype; - int packlen; - - ptrd = 0; - _asm - { - mov dword ptr[ebp - 0x04], ebx - } - //packtype = *(int*)(ptrd + 1); - qubb(packtype,ptrd + 1, 2); - qubb(packlen,ptrd + 3, 2); - //packlen = *(int*)(ptrd + 3); - -} - - -void hookadd() -{ - _asm - { - pushad - pushfd - } - - datec(); - - _asm - { - popfd - popad - } - - _asm - { - mov ecx, dword ptr[ebp - 0x0000012c] - } - - JMPre(7333970); -} - -DWORD WINAPI MyThreadProc2(LPVOID pParam) -{ - std::cout << u8"寮濮婬OOK" << std::endl; - TEA = new inlinehook(0x6FE84C, (int)hookadd); - //淇敼鍦板潃 - TEA->Motify_address(); - - - return 0; -} - - __declspec(dllexport) void Lenheart() { DWORD threadID; CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LenheartThread, NULL, 0, &threadID); - DWORD dwThreadId; - HANDLE myThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadProc2, NULL, 0, &dwThreadId); } @@ -252,7 +64,9 @@ BOOL APIENTRY DllMain( HMODULE hModule, switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: - //HOOK(); + //Sleep(5000); + //std::cout << HOOK() << std::endl; + hook::RegisterHook(); Lenheart(); break; case DLL_THREAD_ATTACH: diff --git a/test/framework.h b/test/framework.h index c165ae5..99e5944 100644 --- a/test/framework.h +++ b/test/framework.h @@ -7,8 +7,8 @@ #include #include #include +#include - -#include "squirrel.h" -#include "MinHook.h" -#pragma comment(lib, "libMinHook.x86.lib") +//#include "squirrel.h" +#include "hook.h" +#include "DNFTOOL.h" \ No newline at end of file diff --git a/test/hook.cpp b/test/hook.cpp new file mode 100644 index 0000000..2fa053e --- /dev/null +++ b/test/hook.cpp @@ -0,0 +1,45 @@ +#include "pch.h" +#include "hook.h" + +#include "sock.h" +#include "MinHook.h" +#include "squirrel.h" + +#pragma comment(lib, "libMinHook.x86.lib") + + + + +uint32_t hook::H_Register_Nut(uint32_t v, void* f, int freeVarsCnt) +{ + + static int build = 0; + if (build == 0 && f == (void*)0x005C5980) + { + squirrel::R_Register_Nut(); + } + return MLnewclosure(v, f, freeVarsCnt); +} + + +void hook::H_Register_Pack(void* Ecx) +{ + Lpfn_Init(Ecx); + sock::R_Register_Pack(); +} + + + +int hook::RegisterHook() +{ + MH_Initialize(); + MH_CreateHook((void*)INIT_PACK_ADDRESS, &H_Register_Pack, reinterpret_cast(&Lpfn_Init)); + + MH_CreateHook((void*)INIT_NUT_ADDRESS, &H_Register_Nut, reinterpret_cast(&MLnewclosure)); + + MH_EnableHook((void*)INIT_PACK_ADDRESS); + MH_EnableHook((void*)INIT_NUT_ADDRESS); + + + return 0; +} diff --git a/test/hook.h b/test/hook.h new file mode 100644 index 0000000..546fa34 --- /dev/null +++ b/test/hook.h @@ -0,0 +1,19 @@ +#pragma once + +class hook +{ +private: + + +public: + + //HOOK_NUT的替换函数 + static uint32_t H_Register_Nut(uint32_t v, void* f, int freeVarsCnt); + //HOOK_收包的替换函数 + static void H_Register_Pack(void* Ecx); + //总HOOK + static int RegisterHook(); + + +}; + diff --git a/test/inlinehook.h b/test/inlinehook.h index 81f6e39..badfb64 100644 --- a/test/inlinehook.h +++ b/test/inlinehook.h @@ -1,6 +1,6 @@ #pragma once -constexpr int Byte_Length = 5; +constexpr int Byte_Length = 6; class inlinehook { @@ -30,8 +30,9 @@ public: int offset = self_address - (original_address + Byte_Length); //构造跳转到我们的函数BYTE - memcpy(&m_self_byte[1], &offset, Byte_Length - 1); + memcpy(&m_self_byte[1], &offset, Byte_Length - 2); + m_self_byte[5] = '\x90'; //修改内存属性 DWORD attributes = Motify_memory_attributes(original_address); diff --git a/test/pch.h b/test/pch.h index dc1f8a9..9660927 100644 --- a/test/pch.h +++ b/test/pch.h @@ -9,280 +9,5 @@ // 娣诲姞瑕佸湪姝ゅ棰勭紪璇戠殑鏍囧ご #include "framework.h" -#include "RSAC.h" - - - - - - - - - - - - - - - - -//-------------------------------------------------------------------------------------------Squirrel - -// PushRoot -typedef int(SqPushRootFunc)(uint32_t v); -static SqPushRootFunc* SQPushRootTable = (SqPushRootFunc*)0x1358C50; -// Push 鍑芥暟缁戝畾闂寘 -typedef int(realSqNewClosure)(uint32_t v, void* funcAddr, int a); -static realSqNewClosure* RealSqNewClosure = (realSqNewClosure*)0x135B850; -// New妲 -typedef int(SqNewSlot)(uint32_t v, int a, bool b); -static SqNewSlot* SQNewSlot = (SqNewSlot*)0x135AA80; -// 骞虫爤 -typedef int(SqPopTop)(uint32_t v); -static SqPopTop* SQPopTop = (SqPopTop*)0x1358FF0; -// 骞虫爤 -typedef int(SqPop)(uint32_t v, int n); -static SqPop* SQPop = (SqPop*)0x1358FD0; -//SQ_Get -typedef int(Sq_Get)(uint32_t v, int n); -static Sq_Get* SQ_Get = (Sq_Get*)0x135AE30; -//SQ_Rawget -typedef int(Sq_Rawget)(uint32_t v, int n); -static Sq_Rawget* SQ_Rawget = (Sq_Rawget*)0x135AEA0; -//SQ*Getlocal -typedef wchar_t* (SqGetlocal)(uint32_t v, int n, int idx); -static SqGetlocal* SQGetlocal = (SqGetlocal*)0x135AFD0; -//SQ_Wakeupvm -typedef int (Sq_Wakeupvm)(uint32_t v, int n, int retval, int raiseerror); -static Sq_Wakeupvm* SQ_Wakeupvm = (Sq_Wakeupvm*)0x135B0D0; -//SQ_Call -typedef int (Sq_CallFunc)(uint32_t v, int params, int retval, int raiseerror); -static Sq_CallFunc* SQ_Call = (Sq_CallFunc*)0x1359280; -//SQ_Remove -typedef int (SQ_RemoveFunc)(uint32_t v, int idx); -static SQ_RemoveFunc* SQ_Remove = (SQ_RemoveFunc*)0x1359000; -//GetInt -typedef int(SqGetIntFunc)(uint32_t v, uint32_t stackIndex, int* sint); -static SqGetIntFunc* SQGetInt = (SqGetIntFunc*)0x1358D70; -//GetFloat -typedef int(SqGetFloatFunc)(uint32_t v, uint32_t stackIndex, float* sfloat); -static SqGetFloatFunc* SQGetFloat = (SqGetFloatFunc*)0x1358DD0; -//GetBool -typedef int(SqGetBoolFunc)(uint32_t v, uint32_t stackIndex, bool* sbool); -static SqGetBoolFunc* SQGetBool = (SqGetBoolFunc*)0x1358E30; -//GetString -typedef int(SqGetStringFunc)(uint32_t v, uint32_t stackIndex, wchar_t** sstring); -static SqGetStringFunc* SQGetString = (SqGetStringFunc*)0x1358E70; -typedef int(SqGetStringCFunc)(uint32_t v, uint32_t stackIndex, char** sstring); -static SqGetStringCFunc* SQGetStringc = (SqGetStringCFunc*)0x1358E70; -//GetUserdata -typedef int(SqGetUserdataFunc)(uint32_t v, uint32_t stackIndex, DWORD* up, DWORD* up1); -static SqGetUserdataFunc* SQGetUserdata = (SqGetUserdataFunc*)0x1358EC0; -//GetObjtypetag -typedef int(SqGetObjtypetagFunc)(uint32_t v, DWORD* up); -static SqGetObjtypetagFunc* SQGetObjtypetag = (SqGetObjtypetagFunc*)0x1358F20; -//GetUserpointer -typedef int(SqGetUserpointerFunc)(uint32_t v, uint32_t idx ,DWORD* up); -static SqGetUserpointerFunc* SQGetUserpointer = (SqGetUserpointerFunc*)0x1358F80; -//GetTop -typedef int(SqGetTopFunc)(uint32_t v); -static SqGetTopFunc* SQGetTop = (SqGetTopFunc*)0x1358FC0; -//Push -typedef int(SqPushFunc)(uint32_t v, int idx); -static SqPushFunc* SQPush = (SqPushFunc*)0x1358C90; -//PushString -typedef int(SqPushStringFunc)(uint32_t v, const wchar_t* s, int len); -static SqPushStringFunc* SQPushString = (SqPushStringFunc*)0x1358A60; -//PushInt -typedef int(SqPushIntFunc)(uint32_t v, int sint); -static SqPushIntFunc* SQPushInt = (SqPushIntFunc*)0x1358AD0; -//PushBool -typedef int(SqPushBoolFunc)(uint32_t v, bool sbool); -static SqPushBoolFunc* SQPushBool = (SqPushBoolFunc*)0x1358B10; -//PushFloat -typedef int(SqPushFloatFunc)(uint32_t v, float sfloat); -static SqPushFloatFunc* SQPushFloat = (SqPushFloatFunc*)0x1358B60; - - - -//SQLOADFILE -typedef void* (SQLOADFILEFunc)(uint32_t v, const wchar_t* filename, bool printerror); -static SQLOADFILEFunc* SQLOADFILEF = (SQLOADFILEFunc*)0x13560E0; -//SQDOFILE -typedef void* (SQDOFILEFunc)(uint32_t v, const wchar_t* filename, bool retval, bool printerror); -static SQDOFILEFunc* SQDOFILE = (SQDOFILEFunc*)0x1356240; - - -typedef void*(*SQFILE)(); -//SQ_io_file_lexfeed_缂栫爜 -//typedef int(LSQLEXREADFUNC)(int n); -typedef int(*LSQLEXREADFUNC)(int n); -static LSQLEXREADFUNC SQ_io_file_lexfeed_ASCII = (LSQLEXREADFUNC)0x1355F60; -static LSQLEXREADFUNC SQ_io_file_lexfeed_UCS2_BE = (LSQLEXREADFUNC)0x1356050; -static LSQLEXREADFUNC SQ_io_file_lexfeed_UCS2_LE = (LSQLEXREADFUNC)0x1356020; -static LSQLEXREADFUNC SQ_io_file_lexfeed_UTF8 = (LSQLEXREADFUNC)0x1355F90; -//SQfopen -typedef SQFILE* (SQfopenFunc)(const wchar_t* filename, const wchar_t* type); -static SQfopenFunc* SQfopen = (SQfopenFunc*)0x1355DC0; -//SQfread -typedef int(SQfreadFunc)(void* buffer, int a, int b, void* file); -static SQfreadFunc* SQfread = (SQfreadFunc*)0x1355DD0; -//SQwrite -typedef int(SQwriteFunc)(void* buffer, int a, int b, void* file); -static SQwriteFunc* SQwrite = (SQwriteFunc*)0x1355DE0; -//SQfseek -typedef int(SQfseekFunc)(void* buffer, int a, int b); -static SQfseekFunc* SQfseek = (SQfseekFunc*)0x1355DF0; -//SQftell -typedef int(SQftellFunc)(void* file); -static SQftellFunc* SQftell = (SQftellFunc*)0x1355E50; -//SQ_File_read -typedef int(SQ_File_readFunc)(void* file, void* afile, int a); -static SQ_File_readFunc* SQ_File_read = (SQ_File_readFunc*)0x1356090; -//SQ_Readclosure -typedef int(SQ_ReadclosureFunc)(uint32_t v, SQ_File_readFunc a, void* file); -static SQ_ReadclosureFunc* SQ_Readclosure = (SQ_ReadclosureFunc*)0x1359460; -//SQ_Fclose -typedef int(SQ__FcloseFunc)(void* file); -static SQ__FcloseFunc* SQ__Fclose = (SQ__FcloseFunc*)0x1355E70; -//SQ_Compile -typedef int(SQ_CompileFunc)(uint32_t v, LSQLEXREADFUNC FUNC, void* file, const wchar_t* filename, bool printerror); -static SQ_CompileFunc* SQ_Compile = (SQ_CompileFunc*)0x135A390; -//SQ_Throwerror -typedef int(SQ_ThrowerrorFunc)(uint32_t v, const wchar_t* error); -static SQ_ThrowerrorFunc* SQ_Throwerror = (SQ_ThrowerrorFunc*)0x13591A0; - -//鑾峰彇Squirrel v 鍩哄潃 -inline uint32_t GetSqVm(); - -//鏂板nut鎺ュ彛funcName缁戝畾C璇█鍑芥暟funcAddr -void RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t v = NULL); - -//娉ㄥ唽Nut鍑芥暟 -void RegisterNut(); - -//鏂板Nut鎺ュ彛缁戝畾C鍑芥暟 -// 绀轰緥濡備笅 -/* -static int GoDungeon(uint32_t v) -{ - int n1 = 0; - int n2 = 0; - int n3 = 0; - int n4 = 0; - - int num; - num = SQGetTop(v); - - if (num == 2) - { - SQGetInt(v, 2, &n1); - } - else if (num == 5) - { - SQGetInt(v, 2, &n1); - SQGetInt(v, 3, &n2); - SQGetInt(v, 4, &n3); - SQGetInt(v, 5, &n4); - } - else - { - SQPushBool(v, false); - return 1; - } - - _SendpacksType(*_SendClass, 0, 15); - _SendPacks(); - - _SendpacksType(*_SendClass, 0, 16); - _SendPacksWord(*_SendClass, 0, n1); - _SendPacksByte(*_SendClass, 0, n2); - _SendPacksByte(*_SendClass, 0, n3); - _SendPacksByte(*_SendClass, 0, n4); - _SendPacks(); - - SQPushBool(v, true); - //return 1 琛ㄧず璇ュ嚱鏁版湁杩斿洖鍊间紶缁檔ut鑴氭湰 0鍒欐棤 - return 1; -} -*/ -//鏂板C++璋冪敤 nut -// 绀轰緥濡備笅 -/* - uint32_t v = GetSqVm(); - SQPushRootTable(v); - SQPushString(v, L"dofile", -1); - SQ_Get(v, -2); - SQPushRootTable(v); - SQPushString(v, L"1.cpp", -1); - SQ_Call(v, 2, 1, 0); - SQPop(v, 2); -*/ -//-------------------------------------------------------------------------------------------Squirrel - - - - - - -//鑾峰彇EXE浣跨敤澶 鍙蜂綅鏁版嵁 -int GetExeNutWrtNum(int Pos); - -//鍐橢XE浣跨敤澶 鍙蜂綅鏁版嵁 -void SetExeNutWrtNum(int Pos, int num); - -//鑾峰彇Nut澶 鍙蜂綅鏁版嵁 -int GetNutArrNum(int Nut澶村湴鍧, int Pos); - -//鍐橬ut澶 鍙蜂綅鏁版嵁 -void SetNutArrNum(int Nut澶村湴鍧, int Pos, int num); - -//璇诲唴瀛樺亸绉诲湴鍧 -int GetHook(int Addr, std::string 鍦板潃); - - -//鍙戝寘鍑芥暟 鍦板潃 -typedef DWORD SendPacks(); -static SendPacks* _SendPacks = (SendPacks*)0x1127EC0; - -//鍙戝寘Class this鍦板潃 -typedef DWORD SendClass; -static SendClass* _SendClass = (SendClass*)0x1AEB6E4; - -//鍙戝寘绫诲瀷 鍦板潃 -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; - -//鏀跺寘鍑芥暟 鍦板潃 -typedef DWORD(__fastcall* RecvPacks)(DWORD* a1 , DWORD a2 ); -//static SendPacks* _SendPacks = (SendPacks*)0x11F98D0; - - -//鍏憡Class this鍦板潃 -typedef DWORD NoticeClass; -static NoticeClass* _NoticeClass = (NoticeClass*)0x1A5FB20; -//鍏憡CALL -typedef void(__fastcall* NoticeCall)(DWORD thisc, int Seat , char* a1, DWORD a2, DWORD a3, DWORD a4, DWORD a5, DWORD a6); -static NoticeCall _Noticecall = (NoticeCall)0x9536C0; - -//绐楀彛CALL -typedef void(__fastcall* NoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, char* a2, DWORD a3); -static NoticeTCall _NoticeTcall = (NoticeTCall)0xE6E070; - -//缁樺埗锛//TODO -typedef int( DrawTe)(DWORD thisc, int a2, int a3, int a4, int a5, int a6, __int64 a7, float a8, float a9, float a10, int a11, int a12); -//static NoticeTCall _NoticeTcall = (NoticeTCall)0xE6E070; #endif //PCH_H diff --git a/test/sock.cpp b/test/sock.cpp new file mode 100644 index 0000000..9fb6f16 --- /dev/null +++ b/test/sock.cpp @@ -0,0 +1,44 @@ +#include "pch.h" +#include "sock.h" + +void sock::Pack_130_抽奖(int idx, int code, void* p3, void* p4) +{ + std::cout << 666 << std::endl; +} + +void sock::R_Register_Pack() +{ + auto Registerfunc = reinterpret_cast(0x7186D0); + + Registerfunc(130, Pack_130_抽奖, 0); +} + +bool sock::net_get8(std::int8_t& v) +{ + typedef bool(__cdecl* func_t)(std::int8_t*); + return reinterpret_cast(0x011AEA00)(&v); +} + +bool sock::net_get16(std::int16_t& v) +{ + typedef bool(__cdecl* func_t)(std::int16_t*); + return reinterpret_cast(0x011AEA30)(&v); +} + +bool sock::net_get32(std::int32_t& v) +{ + typedef bool(__cdecl* func_t)(std::int32_t*); + return reinterpret_cast(0x011AEA60)(&v); +} + +bool sock::net_getS(char* v, int sz) +{ + typedef bool(__cdecl* func_t)(char*, int); + return reinterpret_cast(0x011AEA90)(v, sz); +} +/* +bool sock::HookRegistPackHandler(int idx, pack_handler_t handler) +{ + return handleTable.emplace(idx, handler).second; +} +*/ \ No newline at end of file diff --git a/test/sock.h b/test/sock.h new file mode 100644 index 0000000..59893d5 --- /dev/null +++ b/test/sock.h @@ -0,0 +1,33 @@ +#pragma once + + +#define INIT_PACK_ADDRESS 0x721EA0 +//收包 +typedef void(__fastcall* init_pack_handler_t)(void* Ecx); +static init_pack_handler_t Lpfn_Init = nullptr; +typedef void(__cdecl* pack_handler_t)(int idx, int err, void*, void*); +typedef void(__cdecl* register_pack_handler_t)(int idx, pack_handler_t handler, int zero); + + +class sock +{ +private: + + + + +public: + static void Pack_130_抽奖(int idx, int code, void* p3, void* p4); + +public: + + + + static void R_Register_Pack(); + + static bool net_get8(std::int8_t& v); + static bool net_get16(std::int16_t& v); + static bool net_get32(std::int32_t& v); + static bool net_getS(char* v, int sz); +}; + diff --git a/test/鍑芥暟鍧.cpp b/test/squirrel.cpp similarity index 63% rename from test/鍑芥暟鍧.cpp rename to test/squirrel.cpp index b2efe08..5ba5e72 100644 --- a/test/鍑芥暟鍧.cpp +++ b/test/squirrel.cpp @@ -1,386 +1,7 @@ #include "pch.h" - - - - - - -//获取EXE使用头 号位数据 -int GetExeNutWrtNum(int Pos) -{ - int num = *(int*)(0x40079F + (Pos * 4)); - return num; -} - -//写EXE使用头 号位数据 -void SetExeNutWrtNum(int Pos, int num) -{ - int* p = (int*)(0x40079F + (Pos * 4)); - *p = num; -} - -//获取Nut头 号位数据 -int GetNutArrNum(int Nut头地址, int Pos ) -{ - int num = *(int*)(Nut头地址 + (Pos * 8)); - return num; -} - -//写Nut头 号位数据 -void SetNutArrNum(int Nut头地址, int Pos, int num) -{ - int* p = (int*)(Nut头地址 + (Pos * 8)); - *p = num; -} - -//读内存偏移地址 -int GetHook(int Addr, std::string 地址) -{ - size_t pos = 地址.find("+"); - size_t size = 地址.size(); - int GetHookArr[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - int i = 0; - - while (pos != std::string::npos) - { - std::string x = 地址.substr(0, pos); - GetHookArr[i] = stoi(x, 0, 16); - i++; - 地址 = 地址.substr(pos + 1, size); - pos = 地址.find("+"); - } - - int num; - num = *(int*)(Addr); - - if (num != 0) - { - for (int z = 0; z < i; z++) - { - num = *(int*)(num + GetHookArr[z]); - } - } - return num; -} - - - -//解密读取 句柄 地址 -int DNFDeCode(int Address) -{ - DWORD nEax, nEcx8, nEsi, nEdx, nTmp; - nEax = *(int*)(Address); - if (nEax == -1) - return nEax; - nEcx8 = *(int*)(Address + 8); - if (nEcx8 == -1) - return nEcx8; - nEsi = *(int*)(0x1AF8D78); - nEdx = nEax >> 16; - nTmp = (nEdx << 2) + nEsi + 36; - nEdx = *(int*)(nTmp); - if (nEdx == -1) - return nEdx; - nEax = nEax & 65535; - nTmp = (nEax << 2) + nEdx + 8468; - nEax = *(int*)(nTmp); - if (nEax == -1) - return nEax; - _asm - { - mov eax, nEax - movzx edx, ax - mov nEdx, edx - } - nEsi = nEdx << 16; - nEsi = nEsi | nEdx; - nEax = nEsi ^ nEcx8; - return nEax; - return 0; -} -//加密写入 -void DNFEnCode(int AddreSs, int Data) -{ - long JEdi, JEcx, JEax, JEsi, JEdx, JSs; - JEcx = AddreSs; - JEax = *(int*)(0x1AF8DB8); - JEax = JEax + 1; - *(int*)(0x1AF8DB8) = JEax; - JEdx = JEax; - JEdx = JEdx >> 8; - JEdx = JEdx << 24; - JEdx = JEdx >> 24; - JEdx = *(int*)(JEdx * 2 + 0x1843F58); - JEdx = JEdx & 0xFFFF; - JEax = JEax << 24; - JEax = JEax >> 24; - JSs = *(int*)(JEax * 2 + 0x1844158); - JSs = JSs & 0xFFFF; - JEdx = JEdx ^ JSs; - JEax = JEdx; - JEax = JEax & 0xFFFF; - JEsi = Data; - JEdx = JEsi >> 16; - Sleep(10); - JSs = JEsi & 0xFFFF; - JEdx = JEdx + JSs; - JEdx = JEdx ^ JEax; - JEdi = JEdx; - JEdx = JEax; - JEax = JEax << 16; - JEax = JEax + JEdx; - JEsi = Data; - JEax = JEax ^ JEsi; - JEsi = AddreSs + 8; - *(int*)(JEsi) = JEax; - JEax = *(int*)(AddreSs); - JEsi = *(int*)(0x1AF8D78); - - JEcx = JEdi; - JEcx = JEcx << 16; - JEcx = JEcx + JEdx; - JEdx = JEax; - JEdx = JEdx >> 16; - JEdx = *(int*)(JEsi + JEdx * 4 + 36); - JEax = JEax & 0xFFFF; - *(int*)(JEdx + JEax * 4 + 8468) = JEcx; -} - - -int GetEquAddr(int addr) -{ - switch (addr) - { - case 1: - return 0x3038; - break; - case 2: - return 0x304C; - break; - case 3: - return 0x3048; - break; - case 4: - return 0x3050; - break; - case 5: - return 0x3044; - break; - case 6: - return 0x3040; - break; - case 7: - return 0x3058; - break; - case 8: - return 0x305C; - break; - case 9: - return 0x3054; - break; - case 10: - return 0x3060; - break; - case 11: - return 0x3064; - break; - case 12: - return 0x3038; - break; - - - case 13: - return 0x3008; - break; - case 14: - return 0x300C; - break; - case 15: - return 0x3010; - break; - case 16: - return 0x3014; - break; - case 17: - return 0x3018; - break; - case 18: - return 0x301C; - break; - case 19: - return 0x3020; - break; - case 20: - return 0x3024; - break; - case 21: - return 0x3028; - break; - case 22: - return 0x302C; - break; - case 23: - return 0x3030; - break; - case 24: - return 0x3068; - break; - case 25: - return 0x306C; - break; - case 26: - return 0x3070; - break; - case 27: - return 0x3074; - break; - } - return -1; -} -char* UnicodeToAnsi(const wchar_t* szStr, char* pResult, int maxLen) -{ - if (NULL == pResult) - return NULL; - int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL); - if (0 == nLen) - { - return NULL; - } - if (nLen >= maxLen) - nLen = maxLen; - WideCharToMultiByte(CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL); - return pResult; -} -wchar_t* AnsiToUnicode(const char* szStr, wchar_t* pResult, int maxLen) -{ - if (NULL == pResult) - return NULL; - int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0); - if (0 == nLen) - { - return NULL; - } - if (nLen >= maxLen) - nLen = maxLen; - - nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen); - if (0 == nLen) - { - return NULL; - } - return pResult; -} - -//加载 -static int SQloadfile(uint32_t v, const wchar_t* filename, bool printerror) -{ - //wchar_t* 转 char* - int size = wcslen(filename); - char* fname = (char*)new char[size]; - UnicodeToAnsi(filename, fname, size); - - FILE* file; - file = fopen(fname, "rb+"); - LSQLEXREADFUNC func = SQ_io_file_lexfeed_ASCII; - if (file) - { - //求得文件的大小 - fseek(file, 0, SEEK_END); - int size = ftell(file); - rewind(file); - - //申请一块能装下整个文件的空间 - char* ar = (char*)malloc(sizeof(char) * size); - //读文件,每次读一个,共读size次 - fread(ar, 1, size, file); - - int skey[] = { 5,2,3,5,0 };//定义解密数组 - - Cutecode(ar, skey);//解密 - - FILE* outfile; - outfile = fopen("ImagePacks2/sprite_interface_teart_zero.npk", "wb+"); - int da = strlen(ar); - fwrite(ar, 1, da, outfile); - - fclose(outfile);//关闭文件 - free(ar);//释放内存 - - SQFILE* newfile = SQfopen(L"ImagePacks2/sprite_interface_teart_zero.npk", L"rb+");//定义新的文件流 - - SQfseek(newfile, 0, 2);//定位到头 - if (SQ_Compile(v, func, newfile, filename, printerror) >= 0) - { - fclose(file);//关闭文件 - SQ__Fclose(newfile);//关闭文件 - remove("ImagePacks2/sprite_interface_teart_zero.npk");//删除文件 - return 0; - } - - fclose(file);//关闭文件 - return -1; - } - return -1; -} - -static int SQdofile(uint32_t v, const wchar_t* filename, bool retval, bool printerror) -{ - if (SQloadfile(v, filename, printerror) >= 0) - { - SQPush(v, -2); - if ((int)SQ_Call(v, 1, retval, 1) >= 0) - { - SQ_Remove(v, -(retval != 0) - 1); - return 1; - } - SQPop(v, 1); - } - return -1; -} - - - - - - - -//窗口公告 0x10d -void WindowsNotice(char* str ,int type = 0x10d ,int b = 0x0) -{ - DWORD thisc = 0x1A5FB20; - thisc = *(DWORD*)thisc; - _NoticeTcall(thisc, 0, type, str, b); -} -//GM公告 -void GMNotice(char* str, int type,int color) -{ - if (type == NULL)type = 14; - if (color == NULL)color = 0x65535; - DWORD thisc = 0x1A5FB20; - thisc = *(DWORD*)thisc; - thisc = *(DWORD*)(thisc + 0x40); - _Noticecall(thisc, 0, str, color, type, 0, 0, 0); -} - - - -//-------------------------------------------------------------------------------------------Squirrel -//获取Squirrel v 基址 -inline uint32_t GetSqVm() -{ - return *(uint32_t*)0x1AF3544; -} -//新增nut接口funcName绑定C语言函数funcAddr -void RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t v) -{ - if (!v) - v = GetSqVm(); - SQPushRootTable(v); - SQPushString(v, funcName, -1); - RealSqNewClosure(v, funcAddr, 0); - SQNewSlot(v, -3, false); - SQPopTop(v); -} +#include "squirrel.h" +#include "DNFTOOL.h" +#include "RSAC.h" //Test static int sq_Test(uint32_t v) { @@ -395,7 +16,7 @@ static int sq_Test(uint32_t v) //读人物 或 装备属性 static int GetCharacterAttribute(uint32_t v) { - int n1 ,n2 ; + int n1, n2; int num = SQGetTop(v); int CharAddr = *(int*)(0x1AB7CDC); @@ -403,10 +24,10 @@ static int GetCharacterAttribute(uint32_t v) { SQGetInt(v, 2, &n1); SQGetInt(v, 3, &n2); - int TValue = *(int*)(CharAddr + GetEquAddr(n2)); + int TValue = *(int*)(CharAddr + DNFTOOL::GetEquAddr(n2)); int SValue = (TValue + n1); if (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4) - SQPushInt(v, (DNFDeCode(SValue))); + SQPushInt(v, (DNFTOOL::DNFDeCode(SValue))); else SQPushInt(v, (*(int*)(SValue))); } @@ -415,11 +36,11 @@ static int GetCharacterAttribute(uint32_t v) SQGetInt(v, 2, &n1); int Value = (CharAddr + n1); - SQPushInt(v, (DNFDeCode(Value))); + SQPushInt(v, (DNFTOOL::DNFDeCode(Value))); } else { - SQPushString(v, L"parameter error",-1); + SQPushString(v, L"parameter error", -1); } return 1; } @@ -437,10 +58,10 @@ static int SetCharacterAttribute(uint32_t v) SQGetInt(v, 3, &n2); SQGetInt(v, 4, &n3); - int TValue = *(int*)(CharAddr + GetEquAddr(n2)); + int TValue = *(int*)(CharAddr + DNFTOOL::GetEquAddr(n2)); int SValue = (TValue + n1); if (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4) - DNFEnCode(SValue, n3); + DNFTOOL::DNFEnCode(SValue, n3); else *(int*)SValue = n3; SQPushBool(v, true); @@ -451,7 +72,7 @@ static int SetCharacterAttribute(uint32_t v) SQGetInt(v, 3, &n2); int Value = (CharAddr + n1); - DNFEnCode(Value, n2); + DNFTOOL::DNFEnCode(Value, n2); SQPushBool(v, true); } else @@ -464,25 +85,25 @@ static int SetCharacterAttribute(uint32_t v) //获取城镇编号 static int GetTownIndex(uint32_t v) { - SQPushInt(v, GetHook(0x1A5E258, "0xAC+0xD4+")); + SQPushInt(v, DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD4+")); return 1; } //获取城镇区域编号 static int GetRegionIndex(uint32_t v) { - SQPushInt(v, *(int*)(GetHook(0x1A5E258, "0xAC+0xD8+"))); + SQPushInt(v, *(int*)(DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD8+"))); return 1; } //获取城镇X坐标 static int GetTownXpos(uint32_t v) { - SQPushInt(v, GetHook(0x1AB7CE0, "0x2BC+")); + SQPushInt(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2BC+")); return 1; } //获取城镇Y坐标 static int GetTownYpos(uint32_t v) { - SQPushInt(v, GetHook(0x1AB7CE0, "0x2C0+")); + SQPushInt(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2C0+")); return 1; } @@ -541,7 +162,7 @@ static int SendPack(uint32_t v) //发物品给玩家 static int GivePlayerItem(uint32_t v) { - int n1,n2; + int n1, n2; int num = SQGetTop(v); @@ -639,7 +260,7 @@ static int GoDungeon(uint32_t v) static int LDofile(uint32_t v) { wchar_t* n1; - + int num = SQGetTop(v); if (num == 2) @@ -654,14 +275,14 @@ static int LDofile(uint32_t v) wcstombs_s(&converted, CStr, len, n1, _TRUNCATE); */ - SQdofile(v, n1, false, false); + squirrel::SQdofile(v, n1, false, false); SQPushBool(v, true); } else { SQPushBool(v, false); } - + return 1; } @@ -693,8 +314,8 @@ static int Lcout(uint32_t v) SQPopTop(v); - GMNotice(str, type, color); - + DNFTOOL::GMNotice(str, type, color); + SQPushBool(v, true); } else @@ -732,8 +353,8 @@ static int NewWindows(uint32_t v) } SQPopTop(v); - - WindowsNotice(str, type, color); + + DNFTOOL::WindowsNotice(str, type, color); SQPushBool(v, true); } @@ -853,7 +474,90 @@ static int SetSlot(uint32_t v) return 1; } -void RegisterNut() +int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, bool printerror) +{ + //wchar_t* 转 char* + int size = wcslen(filename); + char* fname = (char*)new char[size]; + DNFTOOL::UnicodeToAnsi(filename, fname, size); + + FILE* file; + file = fopen(fname, "rb+"); + LSQLEXREADFUNC func = SQ_io_file_lexfeed_ASCII; + if (file) + { + //求得文件的大小 + fseek(file, 0, SEEK_END); + int size = ftell(file); + rewind(file); + + //申请一块能装下整个文件的空间 + char* ar = (char*)malloc(sizeof(char) * size); + //读文件,每次读一个,共读size次 + fread(ar, 1, size, file); + + int skey[] = { 5,2,3,5,0 };//定义解密数组 + + Cutecode(ar, skey);//解密 + + FILE* outfile; + outfile = fopen("ImagePacks2/sprite_interface_teart_zero.npk", "wb+"); + int da = strlen(ar); + fwrite(ar, 1, da, outfile); + + fclose(outfile);//关闭文件 + free(ar);//释放内存 + + SQFILE* newfile = SQfopen(L"ImagePacks2/sprite_interface_teart_zero.npk", L"rb+");//定义新的文件流 + + SQfseek(newfile, 0, 2);//定位到头 + if (SQ_Compile(v, func, newfile, filename, printerror) >= 0) + { + fclose(file);//关闭文件 + SQ__Fclose(newfile);//关闭文件 + remove("ImagePacks2/sprite_interface_teart_zero.npk");//删除文件 + return 0; + } + + fclose(file);//关闭文件 + return -1; + } + return -1; +} + +int squirrel::SQdofile(uint32_t v, const wchar_t* filename, bool retval, bool printerror) +{ + if (SQloadfile(v, filename, printerror) >= 0) + { + SQPush(v, -2); + if ((int)SQ_Call(v, 1, retval, 1) >= 0) + { + SQ_Remove(v, -(retval != 0) - 1); + return 1; + } + SQPop(v, 1); + } + return -1; +} + +//获取Squirrel v 基址 +inline uint32_t GetSqVm() +{ + return *(uint32_t*)0x1AF3544; +} + +void squirrel::RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t v = NULL) +{ + if (v == NULL) + v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, funcName, -1); + RealSqNewClosure(v, funcAddr, 0); + SQNewSlot(v, -3, false); + SQPopTop(v); +} + +void squirrel::R_Register_Nut() { RegisterNutApi(L"L_sq_Test", sq_Test); RegisterNutApi(L"L_sq_GetCharacterAttribute", GetCharacterAttribute); @@ -875,8 +579,3 @@ void RegisterNut() RegisterNutApi(L"L_NewWindows", NewWindows); RegisterNutApi(L"L_SetSlot", SetSlot); } - - - - - diff --git a/test/squirrel.h b/test/squirrel.h index f5d64d3..1c5455b 100644 --- a/test/squirrel.h +++ b/test/squirrel.h @@ -1,420 +1,217 @@ +#pragma once + + +//-------------------------------------------------------------------------------------------Squirrel +// PushRoot +typedef int(SqPushRootFunc)(uint32_t v); +static SqPushRootFunc* SQPushRootTable = (SqPushRootFunc*)0x1358C50; +// Push 函数绑定闭包 +typedef int(realSqNewClosure)(uint32_t v, void* funcAddr, int a); +static realSqNewClosure* RealSqNewClosure = (realSqNewClosure*)0x135B850; +#define INIT_NUT_ADDRESS 0x135B850 +static realSqNewClosure* MLnewclosure = nullptr; +// New槽 +typedef int(SqNewSlot)(uint32_t v, int a, bool b); +static SqNewSlot* SQNewSlot = (SqNewSlot*)0x135AA80; +// 平栈 +typedef int(SqPopTop)(uint32_t v); +static SqPopTop* SQPopTop = (SqPopTop*)0x1358FF0; +// 平栈 +typedef int(SqPop)(uint32_t v, int n); +static SqPop* SQPop = (SqPop*)0x1358FD0; +//SQ_Get +typedef int(Sq_Get)(uint32_t v, int n); +static Sq_Get* SQ_Get = (Sq_Get*)0x135AE30; +//SQ_Rawget +typedef int(Sq_Rawget)(uint32_t v, int n); +static Sq_Rawget* SQ_Rawget = (Sq_Rawget*)0x135AEA0; +//SQ*Getlocal +typedef wchar_t* (SqGetlocal)(uint32_t v, int n, int idx); +static SqGetlocal* SQGetlocal = (SqGetlocal*)0x135AFD0; +//SQ_Wakeupvm +typedef int (Sq_Wakeupvm)(uint32_t v, int n, int retval, int raiseerror); +static Sq_Wakeupvm* SQ_Wakeupvm = (Sq_Wakeupvm*)0x135B0D0; +//SQ_Call +typedef int (Sq_CallFunc)(uint32_t v, int params, int retval, int raiseerror); +static Sq_CallFunc* SQ_Call = (Sq_CallFunc*)0x1359280; +//SQ_Remove +typedef int (SQ_RemoveFunc)(uint32_t v, int idx); +static SQ_RemoveFunc* SQ_Remove = (SQ_RemoveFunc*)0x1359000; +//GetInt +typedef int(SqGetIntFunc)(uint32_t v, uint32_t stackIndex, int* sint); +static SqGetIntFunc* SQGetInt = (SqGetIntFunc*)0x1358D70; +//GetFloat +typedef int(SqGetFloatFunc)(uint32_t v, uint32_t stackIndex, float* sfloat); +static SqGetFloatFunc* SQGetFloat = (SqGetFloatFunc*)0x1358DD0; +//GetBool +typedef int(SqGetBoolFunc)(uint32_t v, uint32_t stackIndex, bool* sbool); +static SqGetBoolFunc* SQGetBool = (SqGetBoolFunc*)0x1358E30; +//GetString +typedef int(SqGetStringFunc)(uint32_t v, uint32_t stackIndex, wchar_t** sstring); +static SqGetStringFunc* SQGetString = (SqGetStringFunc*)0x1358E70; +typedef int(SqGetStringCFunc)(uint32_t v, uint32_t stackIndex, char** sstring); +static SqGetStringCFunc* SQGetStringc = (SqGetStringCFunc*)0x1358E70; +//GetUserdata +typedef int(SqGetUserdataFunc)(uint32_t v, uint32_t stackIndex, DWORD* up, DWORD* up1); +static SqGetUserdataFunc* SQGetUserdata = (SqGetUserdataFunc*)0x1358EC0; +//GetObjtypetag +typedef int(SqGetObjtypetagFunc)(uint32_t v, DWORD* up); +static SqGetObjtypetagFunc* SQGetObjtypetag = (SqGetObjtypetagFunc*)0x1358F20; +//GetUserpointer +typedef int(SqGetUserpointerFunc)(uint32_t v, uint32_t idx, DWORD* up); +static SqGetUserpointerFunc* SQGetUserpointer = (SqGetUserpointerFunc*)0x1358F80; +//GetTop +typedef int(SqGetTopFunc)(uint32_t v); +static SqGetTopFunc* SQGetTop = (SqGetTopFunc*)0x1358FC0; +//Push +typedef int(SqPushFunc)(uint32_t v, int idx); +static SqPushFunc* SQPush = (SqPushFunc*)0x1358C90; +//PushString +typedef int(SqPushStringFunc)(uint32_t v, const wchar_t* s, int len); +static SqPushStringFunc* SQPushString = (SqPushStringFunc*)0x1358A60; +//PushInt +typedef int(SqPushIntFunc)(uint32_t v, int sint); +static SqPushIntFunc* SQPushInt = (SqPushIntFunc*)0x1358AD0; +//PushBool +typedef int(SqPushBoolFunc)(uint32_t v, bool sbool); +static SqPushBoolFunc* SQPushBool = (SqPushBoolFunc*)0x1358B10; +//PushFloat +typedef int(SqPushFloatFunc)(uint32_t v, float sfloat); +static SqPushFloatFunc* SQPushFloat = (SqPushFloatFunc*)0x1358B60; + + + +//SQLOADFILE +typedef void* (SQLOADFILEFunc)(uint32_t v, const wchar_t* filename, bool printerror); +static SQLOADFILEFunc* SQLOADFILEF = (SQLOADFILEFunc*)0x13560E0; +//SQDOFILE +typedef void* (SQDOFILEFunc)(uint32_t v, const wchar_t* filename, bool retval, bool printerror); +static SQDOFILEFunc* SQDOFILE = (SQDOFILEFunc*)0x1356240; + + +typedef void* (*SQFILE)(); +//SQ_io_file_lexfeed_编码 +//typedef int(LSQLEXREADFUNC)(int n); +typedef int(*LSQLEXREADFUNC)(int n); +static LSQLEXREADFUNC SQ_io_file_lexfeed_ASCII = (LSQLEXREADFUNC)0x1355F60; +static LSQLEXREADFUNC SQ_io_file_lexfeed_UCS2_BE = (LSQLEXREADFUNC)0x1356050; +static LSQLEXREADFUNC SQ_io_file_lexfeed_UCS2_LE = (LSQLEXREADFUNC)0x1356020; +static LSQLEXREADFUNC SQ_io_file_lexfeed_UTF8 = (LSQLEXREADFUNC)0x1355F90; +//SQfopen +typedef SQFILE* (SQfopenFunc)(const wchar_t* filename, const wchar_t* type); +static SQfopenFunc* SQfopen = (SQfopenFunc*)0x1355DC0; +//SQfread +typedef int(SQfreadFunc)(void* buffer, int a, int b, void* file); +static SQfreadFunc* SQfread = (SQfreadFunc*)0x1355DD0; +//SQwrite +typedef int(SQwriteFunc)(void* buffer, int a, int b, void* file); +static SQwriteFunc* SQwrite = (SQwriteFunc*)0x1355DE0; +//SQfseek +typedef int(SQfseekFunc)(void* buffer, int a, int b); +static SQfseekFunc* SQfseek = (SQfseekFunc*)0x1355DF0; +//SQftell +typedef int(SQftellFunc)(void* file); +static SQftellFunc* SQftell = (SQftellFunc*)0x1355E50; +//SQ_File_read +typedef int(SQ_File_readFunc)(void* file, void* afile, int a); +static SQ_File_readFunc* SQ_File_read = (SQ_File_readFunc*)0x1356090; +//SQ_Readclosure +typedef int(SQ_ReadclosureFunc)(uint32_t v, SQ_File_readFunc a, void* file); +static SQ_ReadclosureFunc* SQ_Readclosure = (SQ_ReadclosureFunc*)0x1359460; +//SQ_Fclose +typedef int(SQ__FcloseFunc)(void* file); +static SQ__FcloseFunc* SQ__Fclose = (SQ__FcloseFunc*)0x1355E70; +//SQ_Compile +typedef int(SQ_CompileFunc)(uint32_t v, LSQLEXREADFUNC FUNC, void* file, const wchar_t* filename, bool printerror); +static SQ_CompileFunc* SQ_Compile = (SQ_CompileFunc*)0x135A390; +//SQ_Throwerror +typedef int(SQ_ThrowerrorFunc)(uint32_t v, const wchar_t* error); +static SQ_ThrowerrorFunc* SQ_Throwerror = (SQ_ThrowerrorFunc*)0x13591A0; + +//获取Squirrel v 基址 +inline uint32_t GetSqVm(); + +//新增nut接口funcName绑定C语言函数funcAddr +void RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t v = NULL); + +//注册Nut函数 +void RegisterNut(); + +class squirrel +{ +private: + + +public: + //加载 + static int SQloadfile(uint32_t v, const wchar_t* filename, bool printerror); + static int SQdofile(uint32_t v, const wchar_t* filename, bool retval, bool printerror); + + +public: + + //新增nut接口funcName绑定C语言函数funcAddr + static void RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t v); + //注册接口 + static void R_Register_Nut(); +}; + + + +//新增Nut接口绑定C函数 +// 示例如下 /* -Copyright (c) 2003-2006 Alberto Demichelis +static int GoDungeon(uint32_t v) +{ + int n1 = 0; + int n2 = 0; + int n3 = 0; + int n4 = 0; -This software is provided 'as-is', without any -express or implied warranty. In no event will the -authors be held liable for any damages arising from -the use of this software. + int num; + num = SQGetTop(v); -Permission is granted to anyone to use this software -for any purpose, including commercial applications, -and to alter it and redistribute it freely, subject -to the following restrictions: + if (num == 2) + { + SQGetInt(v, 2, &n1); + } + else if (num == 5) + { + SQGetInt(v, 2, &n1); + SQGetInt(v, 3, &n2); + SQGetInt(v, 4, &n3); + SQGetInt(v, 5, &n4); + } + else + { + SQPushBool(v, false); + return 1; + } - 1. The origin of this software must not be - misrepresented; you must not claim that - you wrote the original software. If you - use this software in a product, an - acknowledgment in the product - documentation would be appreciated but is - not required. + _SendpacksType(*_SendClass, 0, 15); + _SendPacks(); - 2. Altered source versions must be plainly - marked as such, and must not be - misrepresented as being the original - software. - - 3. This notice may not be removed or - altered from any source distribution. + _SendpacksType(*_SendClass, 0, 16); + _SendPacksWord(*_SendClass, 0, n1); + _SendPacksByte(*_SendClass, 0, n2); + _SendPacksByte(*_SendClass, 0, n3); + _SendPacksByte(*_SendClass, 0, n4); + _SendPacks(); + SQPushBool(v, true); + //return 1 表示该函数有返回值传给nut脚本 0则无 + return 1; +} */ -#ifndef _SQUIRREL_H_ -#define _SQUIRREL_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SQUIRREL_API -#define SQUIRREL_API extern -#endif - -#ifdef _SQ64 -#ifdef _MSC_VER -typedef __int64 SQInteger; -typedef unsigned __int64 SQUnsignedInteger; -typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/ -#else -typedef long SQInteger; -typedef unsigned long SQUnsignedInteger; -typedef unsigned long SQHash; /*should be the same size of a pointer*/ -#endif -typedef int SQInt32; -#else -typedef int SQInteger; -typedef int SQInt32; /*must be 32 bits(also on 64bits processors)*/ -typedef unsigned int SQUnsignedInteger; -typedef unsigned int SQHash; /*should be the same size of a pointer*/ -#endif - -typedef float SQFloat; -typedef void* SQUserPointer; -typedef SQUnsignedInteger SQBool; -typedef SQInteger SQRESULT; - -#define SQTrue (1) -#define SQFalse (0) - - -struct SQVM; -struct SQTable; -struct SQArray; -struct SQString; -struct SQClosure; -struct SQGenerator; -struct SQNativeClosure; -struct SQUserData; -struct SQFunctionProto; -struct SQRefCounted; -struct SQClass; -struct SQInstance; -struct SQDelegable; - -#ifdef _UNICODE -#define SQUNICODE -#endif - -#ifdef SQUNICODE -#if (defined(_MSC_VER) && _MSC_VER >= 1400) // 1400 = VS8 - -#if defined(wchar_t) //this is if the compiler considers wchar_t as native type -#define wchar_t unsigned short -#endif - -#else -typedef unsigned short wchar_t; -#endif - -typedef wchar_t SQChar; -#define _SC(a) L##a -#define scstrcmp wcscmp -#define scsprintf swprintf -#define scstrlen wcslen -#define scstrtod wcstod -#define scstrtol wcstol -#define scatoi _wtoi -#define scstrtoul wcstoul -#define scvsprintf vswprintf -#define scstrstr wcsstr -#define scisspace iswspace -#define scisdigit iswdigit -#define scisxdigit iswxdigit -#define scisalpha iswalpha -#define sciscntrl iswcntrl -#define scisalnum iswalnum -#define scprintf wprintf -#define MAX_CHAR 0xFFFF -#else -typedef char SQChar; -#define _SC(a) a -#define scstrcmp strcmp -#define scsprintf sprintf -#define scstrlen strlen -#define scstrtod strtod -#define scstrtol strtol -#define scatoi atoi -#define scstrtoul strtoul -#define scvsprintf vsprintf -#define scstrstr strstr -#define scisspace isspace -#define scisdigit isdigit -#define scisxdigit isxdigit -#define sciscntrl iscntrl -#define scisalpha isalpha -#define scisalnum isalnum -#define scprintf printf -#define MAX_CHAR 0xFF -#endif - -#define SQUIRREL_VERSION _SC("Squirrel 2.1.1 stable") -#define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2006 Alberto Demichelis") -#define SQUIRREL_AUTHOR _SC("Alberto Demichelis") - -#define SQ_VMSTATE_IDLE 0 -#define SQ_VMSTATE_RUNNING 1 -#define SQ_VMSTATE_SUSPENDED 2 - -#define SQUIRREL_EOB 0 -#define SQ_BYTECODE_STREAM_TAG 0xFAFA - -#define SQOBJECT_REF_COUNTED 0x08000000 -#define SQOBJECT_NUMERIC 0x04000000 -#define SQOBJECT_DELEGABLE 0x02000000 -#define SQOBJECT_CANBEFALSE 0x01000000 - -#define SQ_MATCHTYPEMASKSTRING (-99999) - -#define _RT_MASK 0x00FFFFFF -#define _RAW_TYPE(type) (type&_RT_MASK) - -#define _RT_NULL 0x00000001 -#define _RT_INTEGER 0x00000002 -#define _RT_FLOAT 0x00000004 -#define _RT_BOOL 0x00000008 -#define _RT_STRING 0x00000010 -#define _RT_TABLE 0x00000020 -#define _RT_ARRAY 0x00000040 -#define _RT_USERDATA 0x00000080 -#define _RT_CLOSURE 0x00000100 -#define _RT_NATIVECLOSURE 0x00000200 -#define _RT_GENERATOR 0x00000400 -#define _RT_USERPOINTER 0x00000800 -#define _RT_THREAD 0x00001000 -#define _RT_FUNCPROTO 0x00002000 -#define _RT_CLASS 0x00004000 -#define _RT_INSTANCE 0x00008000 -#define _RT_WEAKREF 0x00010000 - -typedef enum tagSQObjectType{ - OT_NULL = (_RT_NULL|SQOBJECT_CANBEFALSE), - OT_INTEGER = (_RT_INTEGER|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE), - OT_FLOAT = (_RT_FLOAT|SQOBJECT_NUMERIC|SQOBJECT_CANBEFALSE), - OT_BOOL = (_RT_BOOL|SQOBJECT_CANBEFALSE), - OT_STRING = (_RT_STRING|SQOBJECT_REF_COUNTED), - OT_TABLE = (_RT_TABLE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE), - OT_ARRAY = (_RT_ARRAY|SQOBJECT_REF_COUNTED), - OT_USERDATA = (_RT_USERDATA|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE), - OT_CLOSURE = (_RT_CLOSURE|SQOBJECT_REF_COUNTED), - OT_NATIVECLOSURE = (_RT_NATIVECLOSURE|SQOBJECT_REF_COUNTED), - OT_GENERATOR = (_RT_GENERATOR|SQOBJECT_REF_COUNTED), - OT_USERPOINTER = _RT_USERPOINTER, - OT_THREAD = (_RT_THREAD|SQOBJECT_REF_COUNTED) , - OT_FUNCPROTO = (_RT_FUNCPROTO|SQOBJECT_REF_COUNTED), //internal usage only - OT_CLASS = (_RT_CLASS|SQOBJECT_REF_COUNTED), - OT_INSTANCE = (_RT_INSTANCE|SQOBJECT_REF_COUNTED|SQOBJECT_DELEGABLE), - OT_WEAKREF = (_RT_WEAKREF|SQOBJECT_REF_COUNTED) -}SQObjectType; - -#define ISREFCOUNTED(t) (t&SQOBJECT_REF_COUNTED) - - -typedef union tagSQObjectValue -{ - struct SQTable *pTable; - struct SQArray *pArray; - struct SQClosure *pClosure; - struct SQGenerator *pGenerator; - struct SQNativeClosure *pNativeClosure; - struct SQString *pString; - struct SQUserData *pUserData; - SQInteger nInteger; - SQFloat fFloat; - SQUserPointer pUserPointer; - struct SQFunctionProto *pFunctionProto; - struct SQRefCounted *pRefCounted; - struct SQDelegable *pDelegable; - struct SQVM *pThread; - struct SQClass *pClass; - struct SQInstance *pInstance; - struct SQWeakRef *pWeakRef; -}SQObjectValue; - - -typedef struct tagSQObject -{ - SQObjectType _type; - SQObjectValue _unVal; -}SQObject; - -typedef struct tagSQStackInfos{ - const SQChar* funcname; - const SQChar* source; - SQInteger line; -}SQStackInfos; - -typedef struct SQVM* HSQUIRRELVM; -typedef SQObject HSQOBJECT; -typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM); -typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size); -typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/); -typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...); - -typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger); -typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger); - -typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer); - -typedef struct tagSQRegFunction{ - const SQChar *name; - SQFUNCTION f; - SQInteger nparamscheck; - const SQChar *typemask; -}SQRegFunction; - -/*vm*/ -SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize); -SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize); -SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v); -SQUIRREL_API void sq_close(HSQUIRRELVM v); -SQUIRREL_API void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p); -SQUIRREL_API SQUserPointer sq_getforeignptr(HSQUIRRELVM v); -SQUIRREL_API void sq_setprintfunc(HSQUIRRELVM v, SQPRINTFUNCTION printfunc); -SQUIRREL_API SQPRINTFUNCTION sq_getprintfunc(HSQUIRRELVM v); -SQUIRREL_API SQRESULT sq_suspendvm(HSQUIRRELVM v); -SQUIRREL_API SQRESULT sq_wakeupvm(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror); -SQUIRREL_API SQInteger sq_getvmstate(HSQUIRRELVM v); - -/*compiler*/ -SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror); -SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror); -SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable); -SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable); -SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f); - -/*stack operations*/ -SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop); -SQUIRREL_API void sq_poptop(HSQUIRRELVM v); -SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQInteger sq_gettop(HSQUIRRELVM v); -SQUIRREL_API void sq_settop(HSQUIRRELVM v,SQInteger newtop); -SQUIRREL_API void sq_reservestack(HSQUIRRELVM v,SQInteger nsize); -SQUIRREL_API SQInteger sq_cmp(HSQUIRRELVM v); -SQUIRREL_API void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx); - -/*object creation handling*/ -SQUIRREL_API SQUserPointer sq_newuserdata(HSQUIRRELVM v,SQUnsignedInteger size); -SQUIRREL_API void sq_newtable(HSQUIRRELVM v); -SQUIRREL_API void sq_newarray(HSQUIRRELVM v,SQInteger size); -SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars); -SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask); -SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len); -SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f); -SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n); -SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b); -SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p); -SQUIRREL_API void sq_pushnull(HSQUIRRELVM v); -SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQInteger sq_getsize(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQBool sq_instanceof(HSQUIRRELVM v); -SQUIRREL_API void sq_tostring(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API void sq_tobool(HSQUIRRELVM v, SQInteger idx, SQBool *b); -SQUIRREL_API SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c); -SQUIRREL_API SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i); -SQUIRREL_API SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f); -SQUIRREL_API SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b); -SQUIRREL_API SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread); -SQUIRREL_API SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p); -SQUIRREL_API SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag); -SQUIRREL_API SQRESULT sq_settypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag); -SQUIRREL_API SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag); -SQUIRREL_API void sq_setreleasehook(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook); -SQUIRREL_API SQChar *sq_getscratchpad(HSQUIRRELVM v,SQInteger minsize); -SQUIRREL_API SQRESULT sq_getclosureinfo(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars); -SQUIRREL_API SQRESULT sq_setnativeclosurename(HSQUIRRELVM v,SQInteger idx,const SQChar *name); -SQUIRREL_API SQRESULT sq_setinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer p); -SQUIRREL_API SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag); -SQUIRREL_API SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase); -SQUIRREL_API SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API void sq_weakref(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_getdefaultdelegate(HSQUIRRELVM v,SQObjectType t); - -/*object manipulation*/ -SQUIRREL_API void sq_pushroottable(HSQUIRRELVM v); -SQUIRREL_API void sq_pushregistrytable(HSQUIRRELVM v); -SQUIRREL_API SQRESULT sq_setroottable(HSQUIRRELVM v); -SQUIRREL_API SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic); -SQUIRREL_API SQRESULT sq_deleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval); -SQUIRREL_API SQRESULT sq_set(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_get(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_rawget(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_rawset(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_rawdeleteslot(HSQUIRRELVM v,SQInteger idx,SQBool pushval); -SQUIRREL_API SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval); -SQUIRREL_API SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize); -SQUIRREL_API SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_getdelegate(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_clone(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); -SQUIRREL_API SQRESULT sq_next(HSQUIRRELVM v,SQInteger idx); -SQUIRREL_API SQRESULT sq_getweakrefval(HSQUIRRELVM v,SQInteger idx); - -/*calls*/ -SQUIRREL_API SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror); -SQUIRREL_API SQRESULT sq_resume(HSQUIRRELVM v,SQBool retval,SQBool raiseerror); -SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx); -SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval); -SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err); -SQUIRREL_API void sq_reseterror(HSQUIRRELVM v); -SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v); - -/*raw object handling*/ -SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po); -SQUIRREL_API void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj); -SQUIRREL_API void sq_addref(HSQUIRRELVM v,HSQOBJECT *po); -SQUIRREL_API SQBool sq_release(HSQUIRRELVM v,HSQOBJECT *po); -SQUIRREL_API void sq_resetobject(HSQOBJECT *po); -SQUIRREL_API const SQChar *sq_objtostring(HSQOBJECT *o); -SQUIRREL_API SQBool sq_objtobool(HSQOBJECT *o); -SQUIRREL_API SQInteger sq_objtointeger(HSQOBJECT *o); -SQUIRREL_API SQFloat sq_objtofloat(HSQOBJECT *o); -SQUIRREL_API SQRESULT sq_getobjtypetag(HSQOBJECT *o,SQUserPointer * typetag); - -/*GC*/ -SQUIRREL_API SQInteger sq_collectgarbage(HSQUIRRELVM v); - -/*serialization*/ -SQUIRREL_API SQRESULT sq_writeclosure(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up); -SQUIRREL_API SQRESULT sq_readclosure(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up); - -/*mem allocation*/ -SQUIRREL_API void *sq_malloc(SQUnsignedInteger size); -SQUIRREL_API void *sq_realloc(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize); -SQUIRREL_API void sq_free(void *p,SQUnsignedInteger size); - -/*debug*/ -SQUIRREL_API SQRESULT sq_stackinfos(HSQUIRRELVM v,SQInteger level,SQStackInfos *si); -SQUIRREL_API void sq_setdebughook(HSQUIRRELVM v); - -/*UTILITY MACRO*/ -#define sq_isnumeric(o) ((o)._type&SQOBJECT_NUMERIC) -#define sq_istable(o) ((o)._type==OT_TABLE) -#define sq_isarray(o) ((o)._type==OT_ARRAY) -#define sq_isfunction(o) ((o)._type==OT_FUNCPROTO) -#define sq_isclosure(o) ((o)._type==OT_CLOSURE) -#define sq_isgenerator(o) ((o)._type==OT_GENERATOR) -#define sq_isnativeclosure(o) ((o)._type==OT_NATIVECLOSURE) -#define sq_isstring(o) ((o)._type==OT_STRING) -#define sq_isinteger(o) ((o)._type==OT_INTEGER) -#define sq_isfloat(o) ((o)._type==OT_FLOAT) -#define sq_isuserpointer(o) ((o)._type==OT_USERPOINTER) -#define sq_isuserdata(o) ((o)._type==OT_USERDATA) -#define sq_isthread(o) ((o)._type==OT_THREAD) -#define sq_isnull(o) ((o)._type==OT_NULL) -#define sq_isclass(o) ((o)._type==OT_CLASS) -#define sq_isinstance(o) ((o)._type==OT_INSTANCE) -#define sq_isbool(o) ((o)._type==OT_BOOL) -#define sq_isweakref(o) ((o)._type==OT_WEAKREF) -#define sq_type(o) ((o)._type) - -/* deprecated */ -#define sq_createslot(v,n) sq_newslot(v,n,SQFalse) - -#define SQ_OK (0) -#define SQ_ERROR (-1) - -#define SQ_FAILED(res) (res<0) -#define SQ_SUCCEEDED(res) (res>=0) - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*_SQUIRREL_H_*/ +//新增C++调用 nut +// 示例如下 +/* + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"dofile", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, L"1.cpp", -1); + SQ_Call(v, 2, 1, 0); + SQPop(v, 2); +*/ \ No newline at end of file diff --git a/test/test.vcxproj b/test/test.vcxproj index adc24e6..7f30e2b 100644 --- a/test/test.vcxproj +++ b/test/test.vcxproj @@ -170,13 +170,19 @@ + + + + + + Create @@ -185,7 +191,8 @@ Create - + + diff --git a/test/test.vcxproj.filters b/test/test.vcxproj.filters index 1f9f069..2d365db 100644 --- a/test/test.vcxproj.filters +++ b/test/test.vcxproj.filters @@ -27,6 +27,18 @@ 澶存枃浠 + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + @@ -35,14 +47,23 @@ 婧愭枃浠 - - 婧愭枃浠 - 婧愭枃浠 婧愭枃浠 + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + \ No newline at end of file