#include "versiondb.h"
void * MyAddress = NULL;
符号なしlong long MyOffset = 0;
ブール型InitializeOffsets()
{
// スタックに割り当てて、この関数を終了するときにアンロードされるようにします。
// データベース全体をロードして、理由もなくメモリを消費する必要はありません。
バージョンデータベースdb;
// 現在の実行可能バージョンでデータベースを読み込みます。
if (!db.Load())
{
_FATALERROR("現在の実行可能ファイルのバージョンデータベースの読み込みに失敗しました!");
false を返します。
}
それ以外
{
// "SkyrimSE.exe", "1.5.97.0"
_MESSAGE("%s バージョン %s のデータベースをロードしました。", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}
// このアドレスにはモジュールのベース アドレスがすでに含まれているため、アドレスを直接使用できます。
私の住所 = db.FindAddressById(123);
(MyAddress == NULL)の場合
{
_FATALERROR("アドレスが見つかりませんでした!");
false を返します。
}
// このオフセットにはベースアドレスは含まれません。実際のアドレスはModuleBase + MyOffsetになります。
if (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("私のもののオフセットが見つかりませんでした!");
false を返します。
}
// すべて成功しました。
true を返します。
}
#include "versiondb.h"
ブールダンプ特定バージョン()
{
バージョンデータベースdb;
// 実行中の実行可能ファイルのバージョンに関係なく、バージョン 1.5.62.0 のデータベースをロードしようとします。
if (!db.Load(1, 5, 62, 0))
{
_FATALERROR("1.5.62.0 のデータベースの読み込みに失敗しました!");
false を返します。
}
// offsets-1.5.62.0.txt というファイルを書き出します。各行は ID とオフセットです。
db.Dump("offsets-1.5.62.0.txt");
_MESSAGE("1.5.62.0 のオフセットをダンプしました");
true を返します。
}
void* 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"
定数std::map& GetOffsetMap() const; // 手動で反復処理する必要がある場合は、ID とオフセットのマップを取得します。
void* FindAddressById(unsigned long long id) const; // 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に変換するための逆引き検索が試行されます。
ブールLoadAll(std::vector& 全て)
{
静的intバージョン[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
(int i = 0; バージョン[i] >= 0; i++)
{
バージョンデータベース * db = 新しいバージョンデータベース();
if (!db->Load(1, 5, バージョン[i], 0))
{
dbを削除します。
false を返します。
}
all.push_back(db);
}
true を返します。
}
ブール型 ExistsInAll(std::vector& すべて、unsigned long long id)
{
unsigned long long 結果 = 0;
(自動データベース: すべて)
{
if (!db->FindOffsetById(id, result))
false を返します。
}
true を返します。
}
void FreeAll(std::vector& 全て)
{
(自動データベース: すべて)
dbを削除します。
すべてクリア();
}
ブール型IsOk()
{
std::vector全て;
if (!LoadAll(すべて))
{
_FATALERROR("現在の実行可能ファイルの 1 つ以上のバージョン データベースの読み込みに失敗しました!");
FreeAll(すべて);
false を返します。
}
if (!ExistsInAll(すべて、517014))
{
_FATALERROR("517014 はデータベースのすべてのバージョンに存在しません!");
FreeAll(すべて);
false を返します。
}
FreeAll(すべて);
// わかりました!
true を返します。
}
int メジャー = 0、マイナー = 0、リビジョン = 0、ビルド = 0;
if (!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