主修改整合基本完成
This commit is contained in:
parent
0b2e30605a
commit
5ffa76fdef
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
};
|
||||
|
||||
202
test/dllmain.cpp
202
test/dllmain.cpp
|
|
@ -8,96 +8,6 @@
|
|||
|
||||
|
||||
|
||||
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"开始hook" << std::endl;
|
||||
|
||||
if (MH_Initialize() != MH_OK)//初始化Hook
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (MH_CreateHook((void*)0x1128910, &Tihuan,
|
||||
reinterpret_cast<void**>(&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<void**>(&MLnewclosure)) != MH_OK)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
// Enable the hook for MessageBoxW.
|
||||
if (MH_EnableHook((void*)0x1358A60) != MH_OK)
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void testcall()
|
||||
|
|
@ -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"开始HOOK" << 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:
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@
|
|||
#include <string>
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include <map>
|
||||
|
||||
|
||||
#include "squirrel.h"
|
||||
#include "MinHook.h"
|
||||
#pragma comment(lib, "libMinHook.x86.lib")
|
||||
//#include "squirrel.h"
|
||||
#include "hook.h"
|
||||
#include "DNFTOOL.h"
|
||||
|
|
@ -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<void**>(&Lpfn_Init));
|
||||
|
||||
MH_CreateHook((void*)INIT_NUT_ADDRESS, &H_Register_Nut, reinterpret_cast<void**>(&MLnewclosure));
|
||||
|
||||
MH_EnableHook((void*)INIT_PACK_ADDRESS);
|
||||
MH_EnableHook((void*)INIT_NUT_ADDRESS);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
275
test/pch.h
275
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 表示该函数有返回值传给nut脚本 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);
|
||||
|
||||
//写EXE使用头 号位数据
|
||||
void SetExeNutWrtNum(int Pos, int num);
|
||||
|
||||
//获取Nut头 号位数据
|
||||
int GetNutArrNum(int Nut头地址, int Pos);
|
||||
|
||||
//写Nut头 号位数据
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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<register_pack_handler_t>(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<func_t>(0x011AEA00)(&v);
|
||||
}
|
||||
|
||||
bool sock::net_get16(std::int16_t& v)
|
||||
{
|
||||
typedef bool(__cdecl* func_t)(std::int16_t*);
|
||||
return reinterpret_cast<func_t>(0x011AEA30)(&v);
|
||||
}
|
||||
|
||||
bool sock::net_get32(std::int32_t& v)
|
||||
{
|
||||
typedef bool(__cdecl* func_t)(std::int32_t*);
|
||||
return reinterpret_cast<func_t>(0x011AEA60)(&v);
|
||||
}
|
||||
|
||||
bool sock::net_getS(char* v, int sz)
|
||||
{
|
||||
typedef bool(__cdecl* func_t)(char*, int);
|
||||
return reinterpret_cast<func_t>(0x011AEA90)(v, sz);
|
||||
}
|
||||
/*
|
||||
bool sock::HookRegistPackHandler(int idx, pack_handler_t handler)
|
||||
{
|
||||
return handleTable.emplace(idx, handler).second;
|
||||
}
|
||||
*/
|
||||
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
@ -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)
|
||||
{
|
||||
|
|
@ -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,7 +36,7 @@ static int GetCharacterAttribute(uint32_t v)
|
|||
SQGetInt(v, 2, &n1);
|
||||
int Value = (CharAddr + n1);
|
||||
|
||||
SQPushInt(v, (DNFDeCode(Value)));
|
||||
SQPushInt(v, (DNFTOOL::DNFDeCode(Value)));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -654,7 +275,7 @@ 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
|
||||
|
|
@ -693,7 +314,7 @@ static int Lcout(uint32_t v)
|
|||
|
||||
SQPopTop(v);
|
||||
|
||||
GMNotice(str, type, color);
|
||||
DNFTOOL::GMNotice(str, type, color);
|
||||
|
||||
SQPushBool(v, true);
|
||||
}
|
||||
|
|
@ -733,7 +354,7 @@ 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
623
test/squirrel.h
623
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;
|
||||
}
|
||||
*/
|
||||
//新增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);
|
||||
*/
|
||||
#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_*/
|
||||
|
|
|
|||
|
|
@ -170,13 +170,19 @@
|
|||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="DNFTOOL.h" />
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="hook.h" />
|
||||
<ClInclude Include="inlinehook.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="RSAC.h" />
|
||||
<ClInclude Include="sock.h" />
|
||||
<ClInclude Include="squirrel.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp" />
|
||||
<ClCompile Include="DNFTOOL.cpp" />
|
||||
<ClCompile Include="hook.cpp" />
|
||||
<ClCompile Include="inlinehook.cpp" />
|
||||
<ClCompile Include="pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
|
|
@ -185,7 +191,8 @@
|
|||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RSAC.cpp" />
|
||||
<ClCompile Include="函数块.cpp" />
|
||||
<ClCompile Include="sock.cpp" />
|
||||
<ClCompile Include="squirrel.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
|
|
|||
|
|
@ -27,6 +27,18 @@
|
|||
<ClInclude Include="inlinehook.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sock.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="hook.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="squirrel.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="DNFTOOL.h">
|
||||
<Filter>头文件</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp">
|
||||
|
|
@ -35,14 +47,23 @@
|
|||
<ClCompile Include="pch.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="函数块.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RSAC.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="inlinehook.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sock.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hook.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="squirrel.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="DNFTOOL.cpp">
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Loading…
Reference in New Issue