作者:meh321最后更新:2020-02-24 19:31:542021.2万2.8MB
#include "versiondb.h"
void * 我的地址 = NULL;
无符号长整型 MyOffset = 0;
bool 初始化偏移量()
{
// 在堆栈上分配,以便我们退出此函数时它将被卸载。
// 不需要无缘无故地加载整个数据库并占用内存。
版本数据库;
// 使用当前可执行版本加载数据库。
如果(!db.Load())
{
_FATALERROR("无法加载当前可执行文件的版本数据库!");
返回 false;
}
别的
{
//“SkyrimSE.exe”,“1.5.97.0”
_MESSAGE("已加载 %s 版本 %s 的数据库。", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}
// 该地址已经包含模块的基地址,因此我们可以直接使用该地址。
我的地址 = db.FindAddressById(123);
如果(我的地址 == NULL)
{
_FATALERROR("找不到地址!");
返回 false;
}
// 此偏移量不包含基址。实际地址为 ModuleBase + MyOffset。
如果(!db.FindOffsetById(123,MyOffset))
{
_FATALERROR("无法找到我的东西的偏移量!");
返回 false;
}
// 一切顺利。
返回 true;
}
#include "versiondb.h"
bool DumpSpecificVersion()
{
版本数据库;
// 无论运行的可执行文件版本如何,都尝试加载版本 1.5.62.0 的数据库。
如果(!db.Load(1,5,62,0))
{
_FATALERROR("无法加载 1.5.62.0 数据库!");
返回 false;
}
// 写出一个名为 offsets-1.5.62.0.txt 的文件,其中每一行都是 ID 和偏移量。
db.Dump("偏移量-1.5.62.0.txt");
_MESSAGE("转储 1.5.62.0 的偏移量");
返回 true;
}
无效* addressOf142F4DEF8 = db.FindAddressById(517014);
bool Dump(const std::string& path); // 将当前加载的数据库转储到文件
bool Load(int major, int minor, int revision, int build); // 如果 Data/SKSE/Plugins 目录中存在 db-major-minor-revision-build.bin,则加载特定版本
bool Load(); // 加载当前应用程序的版本
void Clear(); // 清除当前加载的数据库
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // 获取我们现在加载的数据库文件的版本
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // 获取当前正在执行的应用程序的版本
const std::string& GetModuleName() const; // 获取当前加载的数据库模块的名称,这应该显示“SkyrimSE.exe”
const std::string& GetLoadedVersionString() const; // 获取当前加载的版本作为字符串,例如“1.5.62.0”
const std::map& GetOffsetMap() const; // 如果需要手动迭代,则获取ID到偏移量的映射
void* FindAddressById(unsigned long long id) const; // 通过 ID 查找地址,该 ID 已包含基址且为正确地址。如果未找到,则返回 NULL!
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // 通过 ID 查找偏移量,这只是不包含基数的偏移量。
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // 通过地址查找 ID,这将尝试反向查找以将地址转换为 ID
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // 通过偏移量查找 ID,这将尝试反向查找以将偏移量转换为 ID
bool LoadAll(std::vector& 全部)
{
静态 int 版本[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
对于(int i = 0;版本[i]> = 0; i ++)
{
版本数据库 * db = 新的版本数据库();
如果(!db->Load(1,5,版本[i],0))
{
删除数据库;
返回 false;
}
全部.push_back(db);
}
返回 true;
}
bool ExistsInAll(std::vector&全部,无符号长整型 id)
{
无符号长整型结果 = 0;
对于(自动数据库:全部)
{
如果(!db->FindOffsetById(id,结果))
返回 false;
}
返回 true;
}
无效的FreeAll(std ::向量& 全部)
{
对于(自动数据库:全部)
删除数据库;
全部.清除();
}
bool IsOk()
{
std::vector全部;
如果(!LoadAll(全部))
{
_FATALERROR("无法为当前可执行文件加载一个或多个版本数据库!");
免费全部(全部);
返回 false;
}
如果(!ExistsInAll(全部,517014))
{
_FATALERROR("517014 在所有版本的数据库中都不存在!");
免费全部(全部);
返回 false;
}
免费全部(全部);
// 好的!
返回 true;
}
int major = 0, minor = 0, revision = 0, build = 0;
如果(!db.GetExecutableVersion(主要,次要,修订,构建))
{
_FATALERROR("出现错误!");
返回 false;
}
// 正在运行的游戏是 1.5.x 并且至少是版本 1.5.39.0
if (主要 == 1 && 次要 == 5 && 修订 >= 39)
{
// 东西 ... ?
}
立即下载模组
下载客户端搜索上古卷轴5:天际 特别版后使用Mod大师工具。