添加项目文件。
This commit is contained in:
418
Include/BASE64.cpp
Normal file
418
Include/BASE64.cpp
Normal file
@@ -0,0 +1,418 @@
|
||||
|
||||
#include "pch.h"
|
||||
#include "BASE64.h"
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
|
||||
using namespace LenheartBase;
|
||||
|
||||
|
||||
// 加解密函数签名
|
||||
typedef int (*RSA_encryptOrDecrypt)(int flen, const unsigned char* from, unsigned char* to, RSA* rsa, int padding);
|
||||
|
||||
|
||||
// 编解码转换表
|
||||
unsigned char CBASE64::s_encTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
unsigned char CBASE64::s_decTable[] = {
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F,
|
||||
0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
|
||||
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
|
||||
0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
|
||||
// 执行BASE64编码操作
|
||||
std::string CBASE64::encode(const std::string& str)
|
||||
{
|
||||
std::string strEncode;
|
||||
strEncode.resize((str.size() / 3 + 1) * 4);
|
||||
strEncode.resize(__encode((unsigned char*)strEncode.data(), (const unsigned char*)str.data(), str.size()));
|
||||
return strEncode;
|
||||
}
|
||||
|
||||
// 执行BASE64解码操作
|
||||
std::string CBASE64::decode(const std::string& str)
|
||||
{
|
||||
std::string strDecode;
|
||||
strDecode.resize(str.size());
|
||||
strDecode.resize(__decode((unsigned char*)strDecode.data(), (const unsigned char*)str.data(), str.size()));
|
||||
return strDecode;
|
||||
}
|
||||
|
||||
// 分组编码
|
||||
int CBASE64::__encode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen)
|
||||
{
|
||||
unsigned char* dst = pDest;
|
||||
const unsigned char* src = pSrc;
|
||||
size_t len = nSrcLen;
|
||||
|
||||
unsigned char* odst = dst;
|
||||
unsigned long l = 0, m = 0, n = 0;
|
||||
|
||||
// 循环处理分组
|
||||
size_t off = 0;
|
||||
for (; off + 3 <= len; off += 3)
|
||||
{
|
||||
l = *src++;
|
||||
m = *src++;
|
||||
n = *src++;
|
||||
|
||||
*dst++ = s_encTable[(l >> 2) & 0x3F];
|
||||
*dst++ = s_encTable[((l << 4) & 0x30) | ((m >> 4) & 0x0F)];
|
||||
*dst++ = s_encTable[((m << 2) & 0x3C) | ((n >> 6) & 0x03)];
|
||||
*dst++ = s_encTable[n & 0x3F];
|
||||
}
|
||||
|
||||
// 处理余下的2个字节
|
||||
if (off + 2 <= len)
|
||||
{
|
||||
l = *src++;
|
||||
m = *src++;
|
||||
|
||||
*dst++ = s_encTable[(l >> 2) & 0x3F];
|
||||
*dst++ = s_encTable[((l << 4) & 0x30) | ((m >> 4) & 0x0F)];
|
||||
*dst++ = s_encTable[((m << 2) & 0x3C)];
|
||||
*dst++ = '=';
|
||||
}
|
||||
|
||||
// 处理余下的1个字节
|
||||
else if (off + 1 <= len)
|
||||
{
|
||||
l = *src++;
|
||||
|
||||
*dst++ = s_encTable[(l >> 2) & 0x3F];
|
||||
*dst++ = s_encTable[((l << 4) & 0x30)];
|
||||
*dst++ = '=';
|
||||
*dst++ = '=';
|
||||
}
|
||||
|
||||
return (int)(dst - odst);
|
||||
}
|
||||
|
||||
// 分组解码
|
||||
int CBASE64::__decode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen)
|
||||
{
|
||||
unsigned char* dst = pDest;
|
||||
const unsigned char* src = pSrc;
|
||||
size_t len = nSrcLen;
|
||||
|
||||
unsigned char* odst = dst;
|
||||
unsigned long l = 0, m = 0, n = 0, o = 0;
|
||||
|
||||
// 循环处理分组
|
||||
size_t off = 0;
|
||||
for (; off + 4 <= len; off += 4)
|
||||
{
|
||||
if ((src[0] > 0x7F) || (src[1] > 0x7F) || (src[2] > 0x7F) || (src[3] > 0x7F))
|
||||
return (int)(dst - odst);
|
||||
if ((src[0] == '=') || (src[1] == '=') || (src[2] == '=') || (src[3] == '='))
|
||||
break;
|
||||
|
||||
l = s_decTable[*src++];
|
||||
m = s_decTable[*src++];
|
||||
n = s_decTable[*src++];
|
||||
o = s_decTable[*src++];
|
||||
|
||||
*dst++ = (unsigned char)(((l << 2) & 0xFC) | ((m >> 4) & 0x03));
|
||||
*dst++ = (unsigned char)(((m << 4) & 0xF0) | ((n >> 2) & 0x0F));
|
||||
*dst++ = (unsigned char)(((n << 6) & 0xC0) | (o & 0x3F));
|
||||
}
|
||||
|
||||
// 处理余下的3个字节
|
||||
if (off + 3 <= len)
|
||||
{
|
||||
if ((src[0] != '=') && (src[1] != '='))
|
||||
{
|
||||
l = s_decTable[*src++];
|
||||
m = s_decTable[*src++];
|
||||
|
||||
*dst++ = (unsigned char)(((l << 2) & 0xFC) | ((m >> 4) & 0x03));
|
||||
}
|
||||
|
||||
if ((src[2] != '='))
|
||||
{
|
||||
n = s_decTable[*src++];
|
||||
|
||||
*dst++ = (unsigned char)(((m << 4) & 0xF0) | ((n >> 2) & 0x0F));
|
||||
}
|
||||
}
|
||||
|
||||
// 处理余下的两个字节
|
||||
else if (off + 2 <= len)
|
||||
{
|
||||
if ((src[0] != '=') && (src[1] != '='))
|
||||
{
|
||||
l = s_decTable[*src++];
|
||||
m = s_decTable[*src++];
|
||||
|
||||
*dst++ = (unsigned char)(((l << 2) & 0xFC) | ((m >> 4) & 0x03));
|
||||
}
|
||||
}
|
||||
|
||||
return (int)(dst - odst);
|
||||
}
|
||||
|
||||
std::string CBASE64::RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key)
|
||||
{
|
||||
std::string decrypt_text;
|
||||
RSA* rsa = RSA_new();
|
||||
BIO* keybio;
|
||||
keybio = BIO_new_mem_buf((unsigned char*)pri_key.c_str(), -1);
|
||||
|
||||
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
|
||||
if (rsa == nullptr)
|
||||
{
|
||||
unsigned long err = ERR_get_error(); //获取错误号
|
||||
char err_msg[1024] = { 0 };
|
||||
ERR_error_string(err, err_msg); // 格式:error:errId:库:函数:原因
|
||||
return std::string();
|
||||
}
|
||||
|
||||
// 获取RSA单次处理的最大长度
|
||||
int key_len = RSA_size(rsa);
|
||||
char* sub_text = new char[key_len + 1];
|
||||
memset(sub_text, 0, key_len + 1);
|
||||
int ret = 0;
|
||||
std::string sub_str;
|
||||
unsigned int pos = 0;
|
||||
// 对密文进行分段解密
|
||||
while (pos < cipher_text.length() - 1)
|
||||
{
|
||||
sub_str = cipher_text.substr(pos, key_len);
|
||||
memset(sub_text, 0, key_len + 1);
|
||||
ret = RSA_private_decrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, 1);
|
||||
if (ret >= 0)
|
||||
{
|
||||
decrypt_text.append(std::string(sub_text, ret));
|
||||
// printf("pos:%d, Length: %d ,sub: %s\n", pos, cipher_text.length(),sub_text);
|
||||
pos += key_len;
|
||||
}
|
||||
}
|
||||
// 释放内存
|
||||
delete[] sub_text;
|
||||
BIO_free_all(keybio);
|
||||
RSA_free(rsa);
|
||||
|
||||
return decrypt_text;
|
||||
}
|
||||
|
||||
std::string CBASE64::RsaPriEncrypt(const std::string& clear_text, const std::string& pri_key)
|
||||
{
|
||||
std::string encrypt_text;
|
||||
BIO* keybio = BIO_new_mem_buf((unsigned char*)pri_key.c_str(), -1);
|
||||
RSA* rsa = RSA_new();
|
||||
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
|
||||
if (!rsa)
|
||||
{
|
||||
BIO_free_all(keybio);
|
||||
return std::string("");
|
||||
}
|
||||
|
||||
// 获取RSA单次可以处理的数据块的最大长度
|
||||
int key_len = RSA_size(rsa);
|
||||
int block_len = key_len - 11; // 因为填充方式为RSA_PKCS1_PADDING, 所以要在key_len基础上减去11
|
||||
|
||||
// 申请内存:存贮加密后的密文数据
|
||||
char* sub_text = new char[key_len + 1];
|
||||
memset(sub_text, 0, key_len + 1);
|
||||
int ret = 0;
|
||||
unsigned int pos = 0;
|
||||
std::string sub_str;
|
||||
// 对数据进行分段加密(返回值是加密后数据的长度)
|
||||
while (pos < clear_text.length())
|
||||
{
|
||||
sub_str = clear_text.substr(pos, block_len);
|
||||
memset(sub_text, 0, key_len + 1);
|
||||
ret = RSA_private_encrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING);
|
||||
if (ret >= 0)
|
||||
{
|
||||
encrypt_text.append(std::string(sub_text, ret));
|
||||
}
|
||||
pos += block_len;
|
||||
}
|
||||
|
||||
// 释放内存
|
||||
delete sub_text;
|
||||
BIO_free_all(keybio);
|
||||
RSA_free(rsa);
|
||||
|
||||
return encrypt_text;
|
||||
}
|
||||
|
||||
// 生成RSA密钥结构
|
||||
void* CBASE64::__genKey(int nBits)
|
||||
{
|
||||
RSA* rsa = RSA_new();
|
||||
|
||||
BIGNUM* bne = BN_new();
|
||||
BN_set_word(bne, RSA_F4);
|
||||
|
||||
int ret = RSA_generate_key_ex(rsa, nBits, bne, NULL);
|
||||
|
||||
BN_free(bne);
|
||||
|
||||
if (ret != 1)
|
||||
{
|
||||
RSA_free(rsa);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (void*)rsa;
|
||||
}
|
||||
|
||||
// 生成密钥对,输出为PEM字符串
|
||||
bool CBASE64::genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString)
|
||||
{
|
||||
// 生成RSA
|
||||
RSA* rsa = (RSA*)__genKey(1024);
|
||||
if (rsa == NULL)
|
||||
return false;
|
||||
|
||||
// 输出私钥
|
||||
{
|
||||
BIO* bio = BIO_new(BIO_s_mem());
|
||||
int ret = PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL);
|
||||
if (ret != 1)
|
||||
{
|
||||
BIO_free(bio);
|
||||
RSA_free(rsa);
|
||||
return false;
|
||||
}
|
||||
|
||||
char sBuf[1024] = { 0 };
|
||||
int bytes = BIO_read(bio, sBuf, 1024);
|
||||
if (bytes <= 0)
|
||||
{
|
||||
BIO_free(bio);
|
||||
RSA_free(rsa);
|
||||
return false;
|
||||
}
|
||||
|
||||
BIO_free(bio);
|
||||
strPrivateKeyPEMString.assign(sBuf, bytes);
|
||||
}
|
||||
|
||||
// 输出公钥
|
||||
{
|
||||
BIO* bio = BIO_new(BIO_s_mem());
|
||||
int ret = PEM_write_bio_RSAPublicKey(bio, rsa);
|
||||
if (ret != 1)
|
||||
{
|
||||
BIO_free(bio);
|
||||
RSA_free(rsa);
|
||||
return false;
|
||||
}
|
||||
|
||||
char sBuf[1024] = { 0 };
|
||||
int bytes = BIO_read(bio, sBuf, 1024);
|
||||
if (bytes <= 0)
|
||||
{
|
||||
BIO_free(bio);
|
||||
RSA_free(rsa);
|
||||
return false;
|
||||
}
|
||||
|
||||
BIO_free(bio);
|
||||
strPublicKeyPEMString.assign(sBuf, bytes);
|
||||
}
|
||||
|
||||
RSA_free(rsa);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// 使用PEM私钥字符串加密
|
||||
bool CBASE64::encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString)
|
||||
{
|
||||
// 加载私钥
|
||||
BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size());
|
||||
RSA* rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
|
||||
BIO_free(bio);
|
||||
|
||||
if (rsa == NULL)
|
||||
return false;
|
||||
|
||||
// 使用私钥加密
|
||||
bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_private_encrypt, true);
|
||||
RSA_free(rsa);
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
// 使用RSA执行加密或解密
|
||||
bool CBASE64::__encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt)
|
||||
{
|
||||
const RSA_encryptOrDecrypt encryptOrDecrypt = (const RSA_encryptOrDecrypt)pFunc;
|
||||
|
||||
// 计算加密块大小
|
||||
int nKeySize = RSA_size((RSA*)pRSA);
|
||||
int nBlockSize = bEncrypt ? (nKeySize - RSA_PKCS1_PADDING_SIZE) : nKeySize;
|
||||
|
||||
const unsigned char* pIn = (const unsigned char*)strIn.data();
|
||||
int nInSize = strIn.size();
|
||||
|
||||
unsigned char* pBuf = new unsigned char[nKeySize];
|
||||
|
||||
// 分组迭代加密
|
||||
for (int i = 0; i < nInSize; )
|
||||
{
|
||||
int nBlockLen = (nInSize - i > nBlockSize ? nBlockSize : nInSize - i);
|
||||
|
||||
int ret = encryptOrDecrypt(nBlockLen, pIn + i, pBuf, (RSA*)pRSA, RSA_PKCS1_PADDING);
|
||||
if (ret <= 0)
|
||||
{
|
||||
delete[] pBuf;
|
||||
return false;
|
||||
}
|
||||
|
||||
strOut.append((char*)pBuf, ret);
|
||||
i += nBlockLen;
|
||||
}
|
||||
|
||||
delete[] pBuf;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 使用PEM公钥字符串加密
|
||||
bool CBASE64::encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString)
|
||||
{
|
||||
// 加载公钥
|
||||
BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size());
|
||||
RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);
|
||||
BIO_free(bio);
|
||||
|
||||
if (rsa == NULL)
|
||||
return false;
|
||||
|
||||
// 使用公钥加密
|
||||
bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_public_encrypt, true);
|
||||
RSA_free(rsa);
|
||||
return b;
|
||||
}
|
||||
|
||||
// 使用PEM公钥字符串解密
|
||||
bool CBASE64::decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString)
|
||||
{
|
||||
// 加载公钥
|
||||
BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size());
|
||||
RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);
|
||||
BIO_free(bio);
|
||||
|
||||
if (rsa == NULL)
|
||||
return false;
|
||||
|
||||
// 检查密文大小是否为分组的整数倍
|
||||
int keySize = RSA_size(rsa);
|
||||
int blockSize = keySize;
|
||||
if ((strIn.size() % blockSize) != 0)
|
||||
return false;
|
||||
|
||||
// 使用公钥解密
|
||||
bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_public_decrypt, false);
|
||||
RSA_free(rsa);
|
||||
return b;
|
||||
}
|
||||
54
Include/BASE64.h
Normal file
54
Include/BASE64.h
Normal file
@@ -0,0 +1,54 @@
|
||||
#ifndef __DAKUANG_BASE64_H__
|
||||
#define __DAKUANG_BASE64_H__
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace LenheartBase
|
||||
{
|
||||
class CBASE64
|
||||
{
|
||||
public:
|
||||
// 生成RSA密钥结构
|
||||
static void* __genKey(int nBits);
|
||||
|
||||
// 生成密钥对,输出为PEM字符串
|
||||
static bool genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString);
|
||||
|
||||
// 执行BASE64编码操作
|
||||
static std::string encode(const std::string& str);
|
||||
|
||||
// 执行BASE64解码操作
|
||||
static std::string decode(const std::string& str);
|
||||
|
||||
// 执行RSA私匙解密操作
|
||||
static std::string RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key);
|
||||
// 执行RSA私匙加密操作
|
||||
static std::string RsaPriEncrypt(const std::string& clear_text, const std::string& pri_key);
|
||||
|
||||
// 使用PEM私钥字符串加密
|
||||
static bool encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString);
|
||||
|
||||
// 使用PEM公钥字符串加密
|
||||
static bool encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString);
|
||||
|
||||
// 使用PEM公钥字符串解密
|
||||
static bool decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString);
|
||||
|
||||
// 使用RSA执行加密或解密
|
||||
static bool __encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt);
|
||||
|
||||
private:
|
||||
// 分组编码
|
||||
static int __encode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen);
|
||||
|
||||
// 分组解码
|
||||
static int __decode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen);
|
||||
|
||||
private:
|
||||
// 编解码转换表
|
||||
static unsigned char s_encTable[];
|
||||
static unsigned char s_decTable[];
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
647
Include/DNFTOOL.hpp
Normal file
647
Include/DNFTOOL.hpp
Normal file
@@ -0,0 +1,647 @@
|
||||
#pragma once
|
||||
#include <Windows.h>
|
||||
#include <string>
|
||||
#include <istream>
|
||||
#include <fstream>
|
||||
#include "BASE64.h"
|
||||
|
||||
#define CPPHTTPLIB_OPENSSL_SUPPORT
|
||||
#include "httplib.h"
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
#include "rapidjson/document.h"
|
||||
#include "rapidjson/writer.h"
|
||||
#include "rapidjson/stringbuffer.h"
|
||||
#include "rapidjson/filereadstream.h"
|
||||
#include "rapidjson/filewritestream.h"
|
||||
#include "rapidjson/istreamwrapper.h"
|
||||
|
||||
bool jiaoben = false;
|
||||
std::vector<std::string> BaseData;
|
||||
|
||||
class DNFTOOL
|
||||
{
|
||||
public:
|
||||
DNFTOOL();
|
||||
~DNFTOOL();
|
||||
|
||||
private:
|
||||
|
||||
public:
|
||||
static void DNFTOOL::Wchar_tToString(std::string& szDst, wchar_t* wchar)
|
||||
{
|
||||
wchar_t* wText = wchar;
|
||||
DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, NULL, 0, NULL, FALSE);// WideCharToMultiByte的运用
|
||||
char* psText; // psText为char*的临时数组,作为赋值给std::string的中间变量
|
||||
psText = new char[dwNum];
|
||||
WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, psText, dwNum, NULL, FALSE);// WideCharToMultiByte的再次运用
|
||||
szDst = psText;// std::string赋值
|
||||
delete[]psText;// psText的清除
|
||||
}
|
||||
static wchar_t* DNFTOOL::charTowchar_t(char* wbuffer)
|
||||
{
|
||||
size_t requiredSize = mbstowcs(nullptr, wbuffer, 0);
|
||||
wchar_t* wcString = new wchar_t[requiredSize + 1];
|
||||
mbstowcs(wcString, wbuffer, requiredSize + 1);
|
||||
return wcString;
|
||||
}
|
||||
|
||||
static void DNFTOOL::Split(const std::string& src, std::vector<std::string>& dest, const std::string& separator)
|
||||
{
|
||||
std::string str = src;
|
||||
std::string substring;
|
||||
std::string::size_type start = 0, index;
|
||||
dest.clear();
|
||||
index = str.find_first_of(separator, start);
|
||||
do
|
||||
{
|
||||
if (index != std::string::npos)
|
||||
{
|
||||
substring = str.substr(start, index - start);
|
||||
dest.push_back(substring);
|
||||
start = index + separator.size();
|
||||
index = str.find(separator, start);
|
||||
if (start == std::string::npos) break;
|
||||
}
|
||||
} while (index != std::string::npos);
|
||||
|
||||
//the last part
|
||||
substring = str.substr(start);
|
||||
dest.push_back(substring);
|
||||
}
|
||||
static char* DNFTOOL::U8ToUnicode(const char* szU8)
|
||||
{
|
||||
//UTF8 to Unicode
|
||||
//预转换,得到所需空间的大小
|
||||
int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
|
||||
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
|
||||
wchar_t* wszString = new wchar_t[wcsLen + 1];
|
||||
//转换
|
||||
::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
|
||||
//最后加上'\0'
|
||||
wszString[wcsLen] = '\0';
|
||||
|
||||
char* m_char;
|
||||
int len = WideCharToMultiByte(CP_ACP, 0, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
|
||||
m_char = new char[len + 1];
|
||||
WideCharToMultiByte(CP_ACP, 0, wszString, wcslen(wszString), m_char, len, NULL, NULL);
|
||||
delete[]wszString;
|
||||
m_char[len] = '\0';
|
||||
return m_char;
|
||||
}
|
||||
static char* DNFTOOL::SquirrelU2W(const wchar_t* Str)
|
||||
{
|
||||
size_t len = 0;
|
||||
char* wbuffer = (char*)(Str);
|
||||
while (true)
|
||||
{
|
||||
if (wbuffer[len] == 0 && wbuffer[len - 1] == 0)break;
|
||||
++len;
|
||||
}
|
||||
char* cbuffer = new char[len / 2 + 1];
|
||||
int k = 0;
|
||||
for (size_t i = 0; i < len; i++)
|
||||
{
|
||||
if (i % 2 == 0)
|
||||
{
|
||||
cbuffer[k] = wbuffer[i];
|
||||
++k;
|
||||
}
|
||||
}
|
||||
cbuffer[len / 2] = '\0';
|
||||
char* Text = U8ToUnicode(cbuffer);
|
||||
delete[]cbuffer;
|
||||
return Text;
|
||||
}
|
||||
static char* DNFTOOL::GBKTOUTF8(std::string& strGBK)//转码 GBK编码转成UTF8编码
|
||||
{
|
||||
int len = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
|
||||
wchar_t* wszUtf8 = new wchar_t[len];
|
||||
memset(wszUtf8, 0, len);
|
||||
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUtf8, len);
|
||||
len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
|
||||
char* szUtf8 = new char[len + 1];
|
||||
memset(szUtf8, 0, len + 1);
|
||||
WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);
|
||||
strGBK = szUtf8;
|
||||
delete[] szUtf8;
|
||||
delete[] wszUtf8;
|
||||
return (char*)strGBK.c_str();
|
||||
}
|
||||
static char* DNFTOOL::wchar_tTochar(wchar_t* wbuffer)
|
||||
{
|
||||
size_t requiredSize = wcstombs(nullptr, wbuffer, 0);
|
||||
char* key = new char[requiredSize + 1];
|
||||
wcstombs(key, wbuffer, requiredSize + 1);
|
||||
return key;
|
||||
}
|
||||
static std::string& ReplaceAll(std::string& str, const std::string& src, const std::string& dst) {
|
||||
std::string::size_type pos(0);
|
||||
while (true) {
|
||||
if ((pos = str.find(src)) != std::string::npos) {
|
||||
str.replace(pos, src.length(), dst);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
static char* DNFTOOL::UnicodeToUtf8(const wchar_t* unicode)
|
||||
{
|
||||
int len;
|
||||
len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
|
||||
char* szUtf8 = (char*)malloc(len + 1);
|
||||
memset(szUtf8, 0, len + 1);
|
||||
WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
|
||||
return szUtf8;
|
||||
}
|
||||
static 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;
|
||||
}
|
||||
static 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;
|
||||
}
|
||||
static 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 0x303c;
|
||||
break;
|
||||
|
||||
|
||||
case 13://帽子
|
||||
return 0x3010;
|
||||
break;
|
||||
case 14://头部
|
||||
return 0x3014;
|
||||
break;
|
||||
case 15://脸
|
||||
return 0x3018;
|
||||
break;
|
||||
case 16:
|
||||
return 0x301c;
|
||||
break;
|
||||
case 17:
|
||||
return 0x3020;
|
||||
break;
|
||||
case 18:
|
||||
return 0x3024;
|
||||
break;
|
||||
case 19:
|
||||
return 0x3028;
|
||||
break;
|
||||
case 20:
|
||||
return 0x302c;
|
||||
break;
|
||||
case 21:
|
||||
return 0x3030;
|
||||
break;
|
||||
case 22:
|
||||
return 0x3034;
|
||||
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;
|
||||
}
|
||||
static wchar_t* DNFTOOL::char2wchar(const char* cchar)
|
||||
{
|
||||
wchar_t* m_wchar;
|
||||
int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), NULL, 0);
|
||||
m_wchar = new wchar_t[len + 1];
|
||||
MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), m_wchar, len);
|
||||
m_wchar[len] = '\0';
|
||||
return m_wchar;
|
||||
}
|
||||
|
||||
public:
|
||||
static void DNFTOOL::WriteInt(int addr, int buf)
|
||||
{
|
||||
*(int*)addr = buf;
|
||||
}
|
||||
|
||||
|
||||
static void DNFTOOL::WriteByteArr(int addr, BYTE buf[], int len)
|
||||
{
|
||||
for (size_t i = 0; i < len; i++)
|
||||
{
|
||||
*(BYTE*)(addr + i) = (int)buf[i];
|
||||
}
|
||||
}
|
||||
|
||||
static int DNFTOOL::GetHook(int Addr, std::string 地址, int Type)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
if (num <= 0 && z != i - 1)//可能读取发生了错误
|
||||
{
|
||||
num = 0;
|
||||
return num;
|
||||
}
|
||||
if (z == i - 1)
|
||||
{
|
||||
if (Type == 0)return *(int*)(num + GetHookArr[z]);
|
||||
else return (num + GetHookArr[z]);
|
||||
}
|
||||
else
|
||||
{
|
||||
num = *(int*)(num + GetHookArr[z]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
static std::string DNFTOOL::GetIP()
|
||||
{
|
||||
std::ifstream inFile;
|
||||
inFile.open("DFC180.dll"); // 默认当方式打开文件
|
||||
if (!inFile.is_open()) {
|
||||
int a = 10;
|
||||
int b[2] = { 1,2 };
|
||||
while (true)
|
||||
{
|
||||
b[a] = -999999;
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
std::string Ip;
|
||||
while (1) {
|
||||
// 从文件中读取第一个数据,并将其打印出来
|
||||
inFile >> Ip;
|
||||
if (inFile.eof()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char* uncode = (char*)Ip.c_str();
|
||||
int skey[] = DFCSkey;//定义解密数组
|
||||
|
||||
Cutecode(uncode, skey);//解密
|
||||
|
||||
Ip = uncode;
|
||||
//std::cout << "获取Ip" << std::endl;
|
||||
return Ip;
|
||||
}
|
||||
|
||||
static std::string DNFTOOL::GetUserIp()
|
||||
{
|
||||
std::string ippack;
|
||||
wchar_t* wgameip = (wchar_t*)0x1AE9CEC;
|
||||
DNFTOOL::Wchar_tToString(ippack, wgameip);
|
||||
return ippack;
|
||||
}
|
||||
|
||||
static std::string DNFTOOL::rsaDecrypt(const std::string& encryptedData, const std::string& publicKeyStr) {
|
||||
RSA* rsa = RSA_new();
|
||||
BIO* bio = BIO_new_mem_buf(const_cast<char*>(publicKeyStr.c_str()), -1);
|
||||
PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL);
|
||||
|
||||
int rsaSize = RSA_size(rsa);
|
||||
std::string decryptedData(rsaSize, 0);
|
||||
|
||||
int decryptedSize = RSA_public_decrypt(encryptedData.size(), reinterpret_cast<const unsigned char*>(encryptedData.c_str()), reinterpret_cast<unsigned char*>(&decryptedData[0]), rsa, RSA_PKCS1_PADDING);
|
||||
|
||||
if (decryptedSize == -1) {
|
||||
std::cerr << "Error decrypting data" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
RSA_free(rsa);
|
||||
BIO_free(bio);
|
||||
|
||||
decryptedData.resize(decryptedSize);
|
||||
return decryptedData;
|
||||
}
|
||||
|
||||
static void UnHtRe(std::string ippack, std::string Rqip) {
|
||||
httplib::Client* CliObj = NULL;// http连接主体
|
||||
CliObj = new httplib::Client(Rqip);//初始化 http 对象
|
||||
}
|
||||
|
||||
static void Unski(std::string Body, std::string Ti, std::string APath) {
|
||||
//必须在前面加载 不然会拿不到版本号
|
||||
std::string sustr = "ENUM_TW_GROWTYPE_TI <- " + Ti;
|
||||
BaseData.push_back(sustr);
|
||||
|
||||
std::string apstr = "ENUM_TW_GROWTYPE_PO <- \"" + APath + "\"";
|
||||
BaseData.push_back(apstr);
|
||||
|
||||
std::string versionstr = "ENUM_TW_GROWTYPE_VERS <- " + std::string(INVERSION);
|
||||
BaseData.push_back(versionstr);
|
||||
|
||||
std::vector<std::string> BaseDataBuffer;
|
||||
DNFTOOL::Split(Body, BaseDataBuffer, "$$$$$");
|
||||
|
||||
size_t Ds = BaseDataBuffer.size();
|
||||
|
||||
std::vector<std::string> NNKey;
|
||||
DNFTOOL::Split(APath, NNKey, ",");
|
||||
|
||||
int RealKey[5] = { atoi(NNKey[0].c_str()),atoi(NNKey[1].c_str()) ,atoi(NNKey[2].c_str()) ,atoi(NNKey[3].c_str()) ,atoi(NNKey[4].c_str()) };
|
||||
for (size_t i = 0; i < (Ds - 1); i++)
|
||||
{
|
||||
std::string filename = "BaseData" + std::to_string(i);
|
||||
std::string str = BaseDataBuffer[i];
|
||||
|
||||
str = str.substr(str.find("[") + 1, str.length() - 2);
|
||||
|
||||
std::vector<std::string> Data;
|
||||
DNFTOOL::Split(str, Data, ", ");
|
||||
size_t DDs = Data.size();
|
||||
|
||||
char* nutstr = new char[DDs + 1];
|
||||
|
||||
|
||||
for (size_t s = 0; s < DDs; s++)
|
||||
{
|
||||
nutstr[s] = char(atoi(Data[s].c_str()));
|
||||
}
|
||||
nutstr[DDs] = '\0';
|
||||
|
||||
Cutecode(nutstr, RealKey, DDs);//解密
|
||||
|
||||
//std::cout << nutstr << std::endl << std::flush;;
|
||||
|
||||
BaseData.push_back(std::string(nutstr, DDs));
|
||||
delete[]nutstr;
|
||||
}
|
||||
|
||||
|
||||
jiaoben = true;
|
||||
}
|
||||
|
||||
static bool DNFTOOL::ReqIpLicense(std::string ippack, std::string Rqip, std::string ym)
|
||||
{
|
||||
httplib::Client cli(ym);
|
||||
|
||||
//cli.set_ca_cert_path("./ca-bundle.crt");
|
||||
|
||||
// Disable cert verification
|
||||
cli.enable_server_certificate_verification(false);
|
||||
//cli.set_read_timeout(30); // 读取超时30秒
|
||||
//cli.set_connection_timeout(30);
|
||||
//cli.set_write_timeout(30);
|
||||
|
||||
|
||||
httplib::Params ParamsObj;//新建 Params 对象
|
||||
ParamsObj.emplace("ip", ippack.c_str());//加入账号数据进数据包
|
||||
|
||||
//程序运行时间
|
||||
std::string Ti = std::to_string(clock());
|
||||
|
||||
FILE* file2 = fopen("Script.pvf", "rb");
|
||||
fseek(file2, 60, SEEK_SET);
|
||||
int code1 = fgetc(file2);
|
||||
fseek(file2, 1500, SEEK_SET);
|
||||
int code2 = fgetc(file2);
|
||||
fseek(file2, 4000, SEEK_SET);
|
||||
int code3 = fgetc(file2);
|
||||
fseek(file2, 16008, SEEK_SET);
|
||||
int code4 = fgetc(file2);
|
||||
fseek(file2, 24003, SEEK_SET);
|
||||
int code5 = fgetc(file2);
|
||||
fclose(file2);
|
||||
|
||||
std::string Apath = std::to_string(code1 % 10) + "," + std::to_string(code2 % 10) + "," + std::to_string(code3 % 10) + "," + std::to_string(code4 % 10) + "," + std::to_string(code5 % 10);
|
||||
|
||||
//随机值
|
||||
std::string s = Ti + Apath;
|
||||
|
||||
|
||||
ParamsObj.emplace("s", s.c_str());//随机值
|
||||
ParamsObj.emplace("su", Ti.c_str());//程序运行的时间
|
||||
|
||||
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto now_c = std::chrono::system_clock::to_time_t(now);
|
||||
|
||||
std::string timestamp = std::ctime(&now_c);
|
||||
timestamp.pop_back(); // Remove trailing newline character
|
||||
ParamsObj.emplace("l", timestamp);//时间戳
|
||||
|
||||
//CliObj->set_connection_timeout(0, 1000000); // 300 milliseconds
|
||||
//CliObj->set_read_timeout(5, 0); // 5 seconds
|
||||
//CliObj->set_write_timeout(5, 0); // 5 seconds
|
||||
|
||||
auto res = cli.Post("/c/user2/getproclient", ParamsObj);
|
||||
//auto res = cli.Get("/c/user/getproclient");
|
||||
if (res) {
|
||||
if (res->status == 200)//如果返回包正常
|
||||
{
|
||||
std::string jso = res->body;//取得date
|
||||
std::string pub = R"(-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHXJ0Df2JAAZSAyW9sKmYGBB0S
|
||||
UXh7yFm3sjVe8ybDGXWUZkGCotljJjTB9wysluwgs3WK7x20OUMqj2GkNV/YVb+G
|
||||
z81zykggVT4eQq9d1sCoId5YS5m5AP4SfYIkSKPY0+O3xxN0WiZInEcgqlg0ojrJ
|
||||
xe4DWCUH/DAGq5f6EwIDAQAB
|
||||
-----END PUBLIC KEY-----)";
|
||||
|
||||
|
||||
LenheartBase::CBASE64 bb;
|
||||
std::string decryptedData = DNFTOOL::rsaDecrypt(bb.decode(jso), pub);
|
||||
|
||||
rapidjson::Document Dom;
|
||||
Dom.Parse(decryptedData.c_str());//加载 字符串
|
||||
|
||||
//1级验证
|
||||
if (Dom["ce"].GetString() == s) {
|
||||
|
||||
|
||||
#ifdef SELL
|
||||
|
||||
httplib::Client nutcli(Rqip);
|
||||
nutcli.enable_server_certificate_verification(false);
|
||||
|
||||
|
||||
httplib::Headers headers = {
|
||||
{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
|
||||
};
|
||||
|
||||
auto nutres = nutcli.Get("/client/getclients2", headers);
|
||||
|
||||
if (nutres) {
|
||||
if (nutres->status == 200)//如果返回包正常
|
||||
{
|
||||
Unski(nutres->body, Ti, Dom["key2"].GetString());
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
}
|
||||
}
|
||||
else {
|
||||
}
|
||||
return false;
|
||||
#endif // SELL
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
DNFTOOL::UnHtRe(ippack, Rqip);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DNFTOOL::UnHtRe(ippack, Rqip);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
// 获取HTTP请求的错误码
|
||||
DNFTOOL::UnHtRe(ippack, Rqip);
|
||||
return false;
|
||||
}
|
||||
DNFTOOL::UnHtRe(ippack, Rqip);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
DNFTOOL::DNFTOOL()
|
||||
{
|
||||
}
|
||||
|
||||
DNFTOOL::~DNFTOOL()
|
||||
{
|
||||
}
|
||||
1745
Include/Hook.hpp
Normal file
1745
Include/Hook.hpp
Normal file
File diff suppressed because it is too large
Load Diff
186
Include/HookUi.hpp
Normal file
186
Include/HookUi.hpp
Normal file
@@ -0,0 +1,186 @@
|
||||
#pragma once
|
||||
#include "DNFTOOL.hpp"
|
||||
void HookHudUi() {
|
||||
|
||||
|
||||
|
||||
////角色和PK经验条 提示标识(删除)
|
||||
DNFTOOL::WriteInt(0x004B85EF, -5000);//角色经验条Y
|
||||
DNFTOOL::WriteInt(5007000, 0); //识别区域宽度
|
||||
BYTE M[] = { 0 };
|
||||
DNFTOOL::WriteByteArr(5007018, M, 1); //识别区域高度
|
||||
|
||||
//////lv 等级贴图
|
||||
//DNFTOOL::WriteInt(4953915, 1587);
|
||||
//DNFTOOL::WriteInt(4953931, 1587);
|
||||
//DNFTOOL::WriteInt(4953879, 44 + 170 + 172);
|
||||
//////PK 等级贴图
|
||||
//DNFTOOL::WriteInt(4954030, 44 + 170 + 172);
|
||||
//DNFTOOL::WriteInt(4954109, 44 + 170 + 172);
|
||||
//DNFTOOL::WriteInt(4954079, 1587);
|
||||
//DNFTOOL::WriteInt(4954006, 1587);
|
||||
|
||||
|
||||
////SP点坐标
|
||||
DNFTOOL::WriteInt(5022550, 707);
|
||||
DNFTOOL::WriteInt(5022555, 590);
|
||||
|
||||
////SP点 提示标识
|
||||
DNFTOOL::WriteInt(5008949, 4294966586); //X轴 FFFFFD3A → lea ecx,[edi-000002C6]
|
||||
DNFTOOL::WriteInt(5008960, 4294966711); //Y轴 FFFFFDB7 → lea edx,[esi-00000249]
|
||||
BYTE H[] = { 0 };
|
||||
DNFTOOL::WriteByteArr(5008955, H, 1); //识别区域宽度
|
||||
BYTE I[] = { 0 };
|
||||
DNFTOOL::WriteByteArr(5008966, I, 1); //识别区域高度
|
||||
|
||||
|
||||
////疲劳条(删除)
|
||||
DNFTOOL::WriteInt(4962645, -5150);
|
||||
|
||||
DNFTOOL::WriteInt(4962678, -5539 + 116);
|
||||
DNFTOOL::WriteInt(4962768, -5539 + 116);
|
||||
DNFTOOL::WriteInt(4962667, -5539 + 116);
|
||||
DNFTOOL::WriteInt(4962582, -5539 + 116);
|
||||
|
||||
DNFTOOL::WriteInt(4962763, -5591);
|
||||
DNFTOOL::WriteInt(4962673, -5591);
|
||||
DNFTOOL::WriteInt(4962577, -5591);
|
||||
|
||||
DNFTOOL::WriteInt(5008389, -5413 + 305); //疲劳值文字标识 X轴
|
||||
DNFTOOL::WriteInt(5008384, -5550 + 41); //疲劳值文字标识 Y轴
|
||||
DNFTOOL::WriteInt(5008743, -5413 + 305); //疯狂阶段文字标识① X轴
|
||||
DNFTOOL::WriteInt(5008738, -5550 + 41); //疯狂阶段文字标识① Y轴
|
||||
DNFTOOL::WriteInt(5008868, -5413 + 305); //疯狂阶段文字标识② X轴
|
||||
DNFTOOL::WriteInt(5008863, -5550 + 41); //疯狂阶段文字标识② Y轴
|
||||
|
||||
BYTE N[] = { 0 };
|
||||
DNFTOOL::WriteByteArr(5008027, N, 1); //疲劳条识别区域宽度
|
||||
BYTE O[] = { 0 };
|
||||
DNFTOOL::WriteByteArr(5008045, O, 1); //疲劳条识别区域高度
|
||||
DNFTOOL::WriteInt(5008021, 4294966650); //疲劳条识别区域 X轴 FFFFFEAF → lea edx,[edi-00000151]
|
||||
DNFTOOL::WriteInt(5008039, 4294966706); //疲劳条识别区域 Y轴 FFFFFDDD → lea eax,[esi-00000223]
|
||||
|
||||
//////物品栏坐标
|
||||
//BYTE WPL[] = { 31 };
|
||||
//DNFTOOL::WriteByteArr(5037196, WPL, 1);
|
||||
//DNFTOOL::WriteInt(5037103, 3);
|
||||
//DNFTOOL::WriteInt(5037173, 569);
|
||||
//DNFTOOL::WriteInt(5037202, 271);
|
||||
|
||||
|
||||
//////扩展技能栏坐标
|
||||
//BYTE SPL[] = { 31 };
|
||||
//DNFTOOL::WriteByteArr(5037480, WPL, 1);
|
||||
//DNFTOOL::WriteInt(5037374, 300);
|
||||
//DNFTOOL::WriteInt(5037444, 534);
|
||||
//DNFTOOL::WriteInt(5037486, 478);
|
||||
|
||||
//BYTE buf[] = { 194, 12, 0 };
|
||||
//////干掉nut初始化基础技能栏坐标
|
||||
//DNFTOOL::WriteByteArr(4928048, buf, 3);
|
||||
|
||||
//////基础技能栏坐标
|
||||
//BYTE SSPL[] = { 31 };
|
||||
//DNFTOOL::WriteByteArr(5037302, WPL, 1);
|
||||
//DNFTOOL::WriteInt(5037209, 300);
|
||||
//DNFTOOL::WriteInt(5037279, 565);
|
||||
//DNFTOOL::WriteInt(5037308, 478);
|
||||
|
||||
////支援兵(删除)
|
||||
DNFTOOL::WriteInt(7247082, 1679);
|
||||
DNFTOOL::WriteInt(7247077, -5000);
|
||||
|
||||
////活动按钮图标
|
||||
BYTE J[] = { 114 };
|
||||
DNFTOOL::WriteByteArr(5105455, J, 1);
|
||||
DNFTOOL::WriteInt(5105439, 96527);
|
||||
|
||||
//////buff图标及提示文字坐标
|
||||
//BYTE K[] = { 0 };
|
||||
//DNFTOOL::WriteByteArr(5016598, K, 1);
|
||||
//DNFTOOL::WriteInt(5016565, 96528);
|
||||
//DNFTOOL::WriteByteArr(4978018, K, 1);
|
||||
//DNFTOOL::WriteInt(4978010, 96528);
|
||||
|
||||
////被动技能栏
|
||||
DNFTOOL::WriteInt(5037996, 286);
|
||||
DNFTOOL::WriteInt(5037991, 532);
|
||||
|
||||
//城镇右上角小地图X
|
||||
DNFTOOL::WriteInt(0x01032274, 1059);
|
||||
//副本右上角小地图X
|
||||
DNFTOOL::WriteInt(0x01031D6C, 1059);
|
||||
DNFTOOL::WriteInt(0x0102D605, 1059);
|
||||
DNFTOOL::WriteInt(0x01031CAE, 1063);
|
||||
DNFTOOL::WriteInt(0x01031D21, 1066);
|
||||
DNFTOOL::WriteInt(0x01031D37, 1066);
|
||||
DNFTOOL::WriteInt(0x01031C9F, 1066);
|
||||
|
||||
int offset = 250;
|
||||
*(int*)0x008DEC6E = 348; //被伤害 字 Y轴
|
||||
*(int*)0x008DECF4 = 348; //被伤害 数 Y轴
|
||||
|
||||
//评分系统总体Y轴
|
||||
*(int*)0x008E3363 = -15; //有 志愿兵控件时
|
||||
*(int*)0x008E3389 = -15; //没 志愿兵控件时
|
||||
|
||||
*(int*)0x004B802B = 0x01010101;//从左到右每个字节分别是 伤害点数 技巧 操作 被击数(00关/01开)
|
||||
|
||||
*(int*)0x008E3801 = 499; //被击数 总 Y轴
|
||||
*(int*)0x008E3821 = 748 + offset; //被击数 字 X轴
|
||||
*(int*)0x008E3876 = 728 + offset; //被击数 次 X轴
|
||||
*(int*)0x008E38A2 = 728 + offset; //被击数 数 X轴
|
||||
|
||||
*(int*)0x008E39F3 = 439; //操作 总 Y轴
|
||||
*(int*)0x008E3A13 = 756 + offset; //操作 总 X轴
|
||||
DNFTOOL::WriteInt(0x008E3A69, 744 + offset);// X 符号
|
||||
DNFTOOL::WriteInt(0x008E3A88, 743 + offset);//X 数字
|
||||
|
||||
*(int*)0x008E3BD1 = 439; //技巧 总 Y轴
|
||||
*(int*)0x008E3BE3 = 756 + offset;//技巧 总 X轴
|
||||
DNFTOOL::WriteInt(0x008E3C39, 744 + offset);
|
||||
DNFTOOL::WriteInt(0x008E3C55, 743 + offset);
|
||||
|
||||
*(int*)0x008E34D1 = 761 + offset; //评分 字 X轴
|
||||
*(int*)0x008E363C = 760 + offset; //评分 数 X轴
|
||||
*(int*)0x008E34BF = 479;//评分 字 Y轴
|
||||
*(int*)0x008E3663 = 479;//评分 数 Y轴
|
||||
|
||||
//打击效果评分系统坐标
|
||||
*(int*)0x008DE969 = 718 + offset; //技巧 字 X轴
|
||||
*(int*)0x008DE9D3 = 713 + offset; //技巧 字 X轴修正
|
||||
*(int*)0x008DE9F8 = 368; //技巧 字 Y轴
|
||||
*(int*)0x008DEA15 = 713 + offset; //技巧 数 X轴
|
||||
*(int*)0x008DEA66 = 367; //技巧 数 Y轴
|
||||
|
||||
*(int*)0x008DEAA9 = 718 + offset; //操作 字 X轴
|
||||
*(int*)0x008DEB13 = 713 + offset; //操作 字 X轴修正
|
||||
*(int*)0x008DEB38 = 388; //操作 字 Y轴
|
||||
*(int*)0x008DEB55 = 713 + offset; //操作 数 X轴
|
||||
*(int*)0x008DEBA6 = 389; //操作 数 Y轴
|
||||
|
||||
memcpy((void*)0x008E3675, "\xE9\x14\x01\x00\x00\x90", 6);//关闭 伤害点数
|
||||
|
||||
DNFTOOL::WriteInt(0x008E33D1, 498);//被击伤害率Y
|
||||
DNFTOOL::WriteInt(0x008E33E3, 725 + offset);//被击伤害率X
|
||||
DNFTOOL::WriteInt(0x008E3439, 707 + offset);//符号
|
||||
DNFTOOL::WriteInt(0x008E3473, 705 + offset);//数
|
||||
|
||||
//DNFTOOL::WriteInt(0x008E36E4, 558);//伤害点数Y
|
||||
//DNFTOOL::WriteInt(0x008E3704, 726 + offset);//伤害点数X
|
||||
|
||||
|
||||
DNFTOOL::WriteInt(0x00FC9662, 423);//频道界面版本号
|
||||
DNFTOOL::WriteInt(0x006F469C, 423);//进游戏界面版本号
|
||||
|
||||
|
||||
DNFTOOL::WriteInt(0x1004581, 1067);//NPC交互
|
||||
DNFTOOL::WriteInt(0x8EA429, 1067);//NPC交互
|
||||
|
||||
|
||||
DNFTOOL::WriteInt(0x6F45FB, 504);//载入界面转圈X轴
|
||||
//DNFTOOL::WriteInt(0x6F45F6, 1067);//载入界面转圈Y轴
|
||||
|
||||
|
||||
*(char*)(0x10F17FA) = 235;//跳选择服务器
|
||||
}
|
||||
186
Include/MinHook.h
Normal file
186
Include/MinHook.h
Normal file
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* MinHook - The Minimalistic API Hooking Library for x64/x86
|
||||
* Copyright (C) 2009-2017 Tsuda Kageyu.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__)
|
||||
#error MinHook supports only x86 and x64 systems.
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
// MinHook Error Codes.
|
||||
typedef enum MH_STATUS
|
||||
{
|
||||
// Unknown error. Should not be returned.
|
||||
MH_UNKNOWN = -1,
|
||||
|
||||
// Successful.
|
||||
MH_OK = 0,
|
||||
|
||||
// MinHook is already initialized.
|
||||
MH_ERROR_ALREADY_INITIALIZED,
|
||||
|
||||
// MinHook is not initialized yet, or already uninitialized.
|
||||
MH_ERROR_NOT_INITIALIZED,
|
||||
|
||||
// The hook for the specified target function is already created.
|
||||
MH_ERROR_ALREADY_CREATED,
|
||||
|
||||
// The hook for the specified target function is not created yet.
|
||||
MH_ERROR_NOT_CREATED,
|
||||
|
||||
// The hook for the specified target function is already enabled.
|
||||
MH_ERROR_ENABLED,
|
||||
|
||||
// The hook for the specified target function is not enabled yet, or already
|
||||
// disabled.
|
||||
MH_ERROR_DISABLED,
|
||||
|
||||
// The specified pointer is invalid. It points the address of non-allocated
|
||||
// and/or non-executable region.
|
||||
MH_ERROR_NOT_EXECUTABLE,
|
||||
|
||||
// The specified target function cannot be hooked.
|
||||
MH_ERROR_UNSUPPORTED_FUNCTION,
|
||||
|
||||
// Failed to allocate memory.
|
||||
MH_ERROR_MEMORY_ALLOC,
|
||||
|
||||
// Failed to change the memory protection.
|
||||
MH_ERROR_MEMORY_PROTECT,
|
||||
|
||||
// The specified module is not loaded.
|
||||
MH_ERROR_MODULE_NOT_FOUND,
|
||||
|
||||
// The specified function is not found.
|
||||
MH_ERROR_FUNCTION_NOT_FOUND
|
||||
}
|
||||
MH_STATUS;
|
||||
|
||||
// Can be passed as a parameter to MH_EnableHook, MH_DisableHook,
|
||||
// MH_QueueEnableHook or MH_QueueDisableHook.
|
||||
#define MH_ALL_HOOKS NULL
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Initialize the MinHook library. You must call this function EXACTLY ONCE
|
||||
// at the beginning of your program.
|
||||
MH_STATUS WINAPI MH_Initialize(VOID);
|
||||
|
||||
// Uninitialize the MinHook library. You must call this function EXACTLY
|
||||
// ONCE at the end of your program.
|
||||
MH_STATUS WINAPI MH_Uninitialize(VOID);
|
||||
|
||||
// Creates a Hook for the specified target function, in disabled state.
|
||||
// Parameters:
|
||||
// pTarget [in] A pointer to the target function, which will be
|
||||
// overridden by the detour function.
|
||||
// pDetour [in] A pointer to the detour function, which will override
|
||||
// the target function.
|
||||
// ppOriginal [out] A pointer to the trampoline function, which will be
|
||||
// used to call the original target function.
|
||||
// This parameter can be NULL.
|
||||
MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);
|
||||
|
||||
// Creates a Hook for the specified API function, in disabled state.
|
||||
// Parameters:
|
||||
// pszModule [in] A pointer to the loaded module name which contains the
|
||||
// target function.
|
||||
// pszTarget [in] A pointer to the target function name, which will be
|
||||
// overridden by the detour function.
|
||||
// pDetour [in] A pointer to the detour function, which will override
|
||||
// the target function.
|
||||
// ppOriginal [out] A pointer to the trampoline function, which will be
|
||||
// used to call the original target function.
|
||||
// This parameter can be NULL.
|
||||
MH_STATUS WINAPI MH_CreateHookApi(
|
||||
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);
|
||||
|
||||
// Creates a Hook for the specified API function, in disabled state.
|
||||
// Parameters:
|
||||
// pszModule [in] A pointer to the loaded module name which contains the
|
||||
// target function.
|
||||
// pszTarget [in] A pointer to the target function name, which will be
|
||||
// overridden by the detour function.
|
||||
// pDetour [in] A pointer to the detour function, which will override
|
||||
// the target function.
|
||||
// ppOriginal [out] A pointer to the trampoline function, which will be
|
||||
// used to call the original target function.
|
||||
// This parameter can be NULL.
|
||||
// ppTarget [out] A pointer to the target function, which will be used
|
||||
// with other functions.
|
||||
// This parameter can be NULL.
|
||||
MH_STATUS WINAPI MH_CreateHookApiEx(
|
||||
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);
|
||||
|
||||
// Removes an already created hook.
|
||||
// Parameters:
|
||||
// pTarget [in] A pointer to the target function.
|
||||
MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget);
|
||||
|
||||
// Enables an already created hook.
|
||||
// Parameters:
|
||||
// pTarget [in] A pointer to the target function.
|
||||
// If this parameter is MH_ALL_HOOKS, all created hooks are
|
||||
// enabled in one go.
|
||||
MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);
|
||||
|
||||
// Disables an already created hook.
|
||||
// Parameters:
|
||||
// pTarget [in] A pointer to the target function.
|
||||
// If this parameter is MH_ALL_HOOKS, all created hooks are
|
||||
// disabled in one go.
|
||||
MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget);
|
||||
|
||||
// Queues to enable an already created hook.
|
||||
// Parameters:
|
||||
// pTarget [in] A pointer to the target function.
|
||||
// If this parameter is MH_ALL_HOOKS, all created hooks are
|
||||
// queued to be enabled.
|
||||
MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);
|
||||
|
||||
// Queues to disable an already created hook.
|
||||
// Parameters:
|
||||
// pTarget [in] A pointer to the target function.
|
||||
// If this parameter is MH_ALL_HOOKS, all created hooks are
|
||||
// queued to be disabled.
|
||||
MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);
|
||||
|
||||
// Applies all queued changes in one go.
|
||||
MH_STATUS WINAPI MH_ApplyQueued(VOID);
|
||||
|
||||
// Translates the MH_STATUS to its name as a string.
|
||||
const char * WINAPI MH_StatusToString(MH_STATUS status);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
3006
Include/RegisterSquirrel.hpp
Normal file
3006
Include/RegisterSquirrel.hpp
Normal file
File diff suppressed because it is too large
Load Diff
8170
Include/httplib.h
Normal file
8170
Include/httplib.h
Normal file
File diff suppressed because it is too large
Load Diff
53
Include/inlinehook.h
Normal file
53
Include/inlinehook.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
constexpr int Byte_Length = 6;
|
||||
class inlinehook
|
||||
{
|
||||
private:
|
||||
using uchar = unsigned char;
|
||||
|
||||
//原始函数处的汇编指令
|
||||
uchar m_original_byte[Byte_Length];
|
||||
//我们构造的汇编指令
|
||||
uchar m_self_byte[Byte_Length];
|
||||
|
||||
//原始函数地址
|
||||
int m_original_address;
|
||||
//我们函数地址
|
||||
int m_self_address;
|
||||
|
||||
DWORD Motify_memory_attributes(int address, DWORD attributes = PAGE_EXECUTE_READWRITE);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
inlinehook(int original_address, int self_address) :m_original_address(original_address), m_self_address(self_address)
|
||||
{
|
||||
//构造jmp
|
||||
m_self_byte[0] = '\xe9';
|
||||
//计算偏移
|
||||
int offset = self_address + 1 - (original_address + Byte_Length);
|
||||
|
||||
//构造跳转到我们的函数BYTE
|
||||
memcpy(&m_self_byte[1], &offset, Byte_Length - 2);
|
||||
|
||||
m_self_byte[5] = '\x90';
|
||||
//修改内存属性
|
||||
DWORD attributes = Motify_memory_attributes(original_address);
|
||||
|
||||
//保存原始的函数地址的BYTE
|
||||
memcpy(&m_original_byte, reinterpret_cast<void*>(original_address), Byte_Length);
|
||||
|
||||
//恢复内存属性
|
||||
Motify_memory_attributes(original_address, attributes);
|
||||
}
|
||||
|
||||
|
||||
//修改地址
|
||||
void Motify_address();
|
||||
|
||||
//还原地址
|
||||
void Restore_address();
|
||||
};
|
||||
|
||||
16
Include/sqstdaux.h
Normal file
16
Include/sqstdaux.h
Normal file
@@ -0,0 +1,16 @@
|
||||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_AUXLIB_H_
|
||||
#define _SQSTD_AUXLIB_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API void sqstd_seterrorhandlers(HSQUIRRELVM v);
|
||||
SQUIRREL_API void sqstd_printcallstack(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /* _SQSTD_AUXLIB_H_ */
|
||||
20
Include/sqstdblob.h
Normal file
20
Include/sqstdblob.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTDBLOB_H_
|
||||
#define _SQSTDBLOB_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API SQUserPointer sqstd_createblob(HSQUIRRELVM v, SQInteger size);
|
||||
SQUIRREL_API SQRESULT sqstd_getblob(HSQUIRRELVM v,SQInteger idx,SQUserPointer *ptr);
|
||||
SQUIRREL_API SQInteger sqstd_getblobsize(HSQUIRRELVM v,SQInteger idx);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_bloblib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTDBLOB_H_*/
|
||||
|
||||
53
Include/sqstdio.h
Normal file
53
Include/sqstdio.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTDIO_H_
|
||||
#define _SQSTDIO_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#define SQSTD_STREAM_TYPE_TAG 0x80000000
|
||||
|
||||
struct SQStream {
|
||||
virtual SQInteger Read(void *buffer, SQInteger size) = 0;
|
||||
virtual SQInteger Write(void *buffer, SQInteger size) = 0;
|
||||
virtual SQInteger Flush() = 0;
|
||||
virtual SQInteger Tell() = 0;
|
||||
virtual SQInteger Len() = 0;
|
||||
virtual SQInteger Seek(SQInteger offset, SQInteger origin) = 0;
|
||||
virtual bool IsValid() = 0;
|
||||
virtual bool EOS() = 0;
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SQ_SEEK_CUR 0
|
||||
#define SQ_SEEK_END 1
|
||||
#define SQ_SEEK_SET 2
|
||||
|
||||
typedef void* SQFILE;
|
||||
|
||||
SQUIRREL_API SQFILE sqstd_fopen(const SQChar *,const SQChar *);
|
||||
SQUIRREL_API SQInteger sqstd_fread(SQUserPointer, SQInteger, SQInteger, SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fwrite(const SQUserPointer, SQInteger, SQInteger, SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fseek(SQFILE , SQInteger , SQInteger);
|
||||
SQUIRREL_API SQInteger sqstd_ftell(SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fflush(SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_fclose(SQFILE);
|
||||
SQUIRREL_API SQInteger sqstd_feof(SQFILE);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_createfile(HSQUIRRELVM v, SQFILE file,SQBool own);
|
||||
SQUIRREL_API SQRESULT sqstd_getfile(HSQUIRRELVM v, SQInteger idx, SQFILE *file);
|
||||
|
||||
//compiler helpers
|
||||
SQUIRREL_API SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror);
|
||||
SQUIRREL_API SQRESULT sqstd_dofile(HSQUIRRELVM v,const SQChar *filename,SQBool retval,SQBool printerror);
|
||||
SQUIRREL_API SQRESULT sqstd_writeclosuretofile(HSQUIRRELVM v,const SQChar *filename);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_iolib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTDIO_H_*/
|
||||
|
||||
15
Include/sqstdmath.h
Normal file
15
Include/sqstdmath.h
Normal file
@@ -0,0 +1,15 @@
|
||||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_MATH_H_
|
||||
#define _SQSTD_MATH_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_mathlib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTD_MATH_H_*/
|
||||
31
Include/sqstdstring.h
Normal file
31
Include/sqstdstring.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_STRING_H_
|
||||
#define _SQSTD_STRING_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef unsigned int SQRexBool;
|
||||
typedef struct SQRex SQRex;
|
||||
|
||||
typedef struct {
|
||||
const SQChar *begin;
|
||||
SQInteger len;
|
||||
} SQRexMatch;
|
||||
|
||||
SQUIRREL_API SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error);
|
||||
SQUIRREL_API void sqstd_rex_free(SQRex *exp);
|
||||
SQUIRREL_API SQBool sqstd_rex_match(SQRex* exp,const SQChar* text);
|
||||
SQUIRREL_API SQBool sqstd_rex_search(SQRex* exp,const SQChar* text, const SQChar** out_begin, const SQChar** out_end);
|
||||
SQUIRREL_API SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end);
|
||||
SQUIRREL_API SQInteger sqstd_rex_getsubexpcount(SQRex* exp);
|
||||
SQUIRREL_API SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp);
|
||||
|
||||
SQUIRREL_API SQRESULT sqstd_register_stringlib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*_SQSTD_STRING_H_*/
|
||||
15
Include/sqstdsystem.h
Normal file
15
Include/sqstdsystem.h
Normal file
@@ -0,0 +1,15 @@
|
||||
/* see copyright notice in squirrel.h */
|
||||
#ifndef _SQSTD_SYSTEMLIB_H_
|
||||
#define _SQSTD_SYSTEMLIB_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SQUIRREL_API SQInteger sqstd_register_systemlib(HSQUIRRELVM v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /* _SQSTD_SYSTEMLIB_H_ */
|
||||
422
Include/squirrel.h
Normal file
422
Include/squirrel.h
Normal file
@@ -0,0 +1,422 @@
|
||||
/*
|
||||
Copyright (c) 2003-2006 Alberto Demichelis
|
||||
|
||||
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.
|
||||
|
||||
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:
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
#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_mycompile(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 SQRESULT sq_mycompilebuffer(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_*/
|
||||
Reference in New Issue
Block a user