#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)
{
// 東西 ... ?
}
Larvas Limited
Room 1201, 12/F Tai Sang Bank Building 130-132 Des Voeux Road Central HK