#include "versiondb.h"
void * 내 주소 = NULL;
부호 없는 long long MyOffset = 0;
bool InitializeOffsets()
{
// 스택에 할당하여 이 함수를 종료할 때 언로드되도록 합니다.
// 아무 이유 없이 전체 데이터베이스를 로드하고 메모리를 사용할 필요는 없습니다.
버전Db db;
// 현재 실행 가능한 버전으로 데이터베이스를 로드합니다.
if (!db.Load())
{
_FATALERROR("현재 실행 파일의 버전 데이터베이스를 로드하는 데 실패했습니다!");
거짓을 반환합니다.
}
또 다른
{
// "스카이림SE.exe", "1.5.97.0"
_MESSAGE("%s 버전 %s에 대한 데이터베이스가 로드되었습니다.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}
// 이 주소에는 모듈의 기본 주소가 이미 포함되어 있으므로 주소를 직접 사용할 수 있습니다.
내 주소 = db.FindAddressById(123);
내 주소가 NULL인 경우
{
_FATALERROR("주소를 찾을 수 없습니다!");
거짓을 반환합니다.
}
// 이 오프셋에는 기본 주소가 포함되지 않습니다. 실제 주소는 ModuleBase + MyOffset입니다.
if (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("내 항목에 대한 오프셋을 찾을 수 없습니다!");
거짓을 반환합니다.
}
// 모든 것이 성공적이었습니다.
true를 반환합니다.
}
#include "versiondb.h"
bool DumpSpecificVersion()
{
버전Db db;
// 실행 파일 버전에 관계 없이 버전 1.5.62.0의 데이터베이스를 로드하려고 시도합니다.
if (!db.Load(1, 5, 62, 0))
{
_FATALERROR("1.5.62.0에 대한 데이터베이스를 로드하는 데 실패했습니다!");
거짓을 반환합니다.
}
// 각 줄에 ID와 오프셋을 포함하는 offsets-1.5.62.0.txt라는 파일을 작성합니다.
db.Dump("오프셋-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); // db-major-minor-revision-build.bin이 Data/SKSE/Plugins 디렉토리에 있는 경우 특정 버전을 로드합니다.
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로 변환하기 위해 역방향 조회를 시도합니다.
bool 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, version[i], 0))
{
db 삭제;
거짓을 반환합니다.
}
모든.푸시백(db);
}
true를 반환합니다.
}
bool ExistsInAll(std::vector& 모두, unsigned long long id)
{
unsigned long long 결과 = 0;
(자동 DB : 모두)
{
if (!db->FindOffsetById(id, result))
거짓을 반환합니다.
}
true를 반환합니다.
}
void FreeAll(std::vector& 모두)
{
(자동 DB : 모두)
db 삭제;
모두 지우기();
}
bool IsOk()
{
std::벡터모두;
if (!LoadAll(all))
{
_FATALERROR("현재 실행 파일에 대한 하나 이상의 버전 데이터베이스를 로드하는 데 실패했습니다!");
FreeAll(모두);
거짓을 반환합니다.
}
if (!ExistsInAll(모두, 517014))
{
_FATALERROR("517014는 모든 버전의 데이터베이스에 존재하지 않습니다!");
FreeAll(모두);
거짓을 반환합니다.
}
FreeAll(모두);
// 좋아요!
true를 반환합니다.
}
int major = 0, minor = 0, revision = 0, build = 0;
if (!db.GetExecutableVersion(major, minor, revision, build))
{
_FATALERROR("뭔가 잘못되었습니다!");
거짓을 반환합니다.
}
// 실행 중인 게임은 1.5.x이고 최소 버전은 1.5.39.0입니다.
if (major == 1 && minor == 5 && revision >= 39)
{
// 물건 ... ?
}
Larvas Limited
Room 1201, 12/F Tai Sang Bank Building 130-132 Des Voeux Road Central HK