Skip to content

Commit

Permalink
Merge pull request #107 from WopsS/feature/universal-addresses
Browse files Browse the repository at this point in the history
Implement version agnostic addresses
  • Loading branch information
wopss authored Feb 16, 2024
2 parents 94e1a89 + b5730a3 commit c3d87c2
Show file tree
Hide file tree
Showing 35 changed files with 478 additions and 342 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ include(CMakeDependentOption)

project(
RED4ext.SDK
VERSION 0.4.0
VERSION 0.5.0
LANGUAGES CXX
)

Expand Down
4 changes: 0 additions & 4 deletions cmake/pch.hpp.in
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,3 @@
#include <vector>

#include <Windows.h>

#include <RED4ext/Addresses.hpp>
#include <RED4ext/Common.hpp>
#include <RED4ext/Relocation.hpp>
205 changes: 0 additions & 205 deletions include/RED4ext/Addresses.hpp

This file was deleted.

2 changes: 2 additions & 0 deletions include/RED4ext/Api/Version.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,7 @@
#define RED4EXT_SDK_0_1_0 RED4EXT_V0_SDK_0_1_0
#define RED4EXT_SDK_0_2_0 RED4EXT_V0_SDK_0_2_0
#define RED4EXT_SDK_0_3_0 RED4EXT_V0_SDK_0_3_0
#define RED4EXT_SDK_0_4_0 RED4EXT_V0_SDK_0_4_0
#define RED4EXT_SDK_0_5_0 RED4EXT_V0_SDK_0_5_0

#define RED4EXT_SDK_LATEST RED4EXT_V0_SDK_LATEST
1 change: 1 addition & 0 deletions include/RED4ext/Api/v0/Version.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
#define RED4EXT_V0_SDK_0_2_0 RED4EXT_V0_SEMVER(0, 2, 0)
#define RED4EXT_V0_SDK_0_3_0 RED4EXT_V0_SEMVER(0, 3, 0)
#define RED4EXT_V0_SDK_0_4_0 RED4EXT_V0_SEMVER(0, 4, 0)
#define RED4EXT_V0_SDK_0_5_0 RED4EXT_V0_SEMVER(0, 5, 0)

#define RED4EXT_V0_SDK_LATEST RED4EXT_V0_SEMVER(RED4EXT_VER_MAJOR, RED4EXT_VER_MINOR, RED4EXT_VER_PATCH)
10 changes: 5 additions & 5 deletions include/RED4ext/CNamePool-inl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
#include <RED4ext/CNamePool.hpp>
#endif

#include <RED4ext/Addresses.hpp>
#include <RED4ext/Detail/AddressHashes.hpp>
#include <RED4ext/Common.hpp>
#include <RED4ext/Relocation.hpp>

RED4EXT_INLINE RED4ext::CName RED4ext::CNamePool::Add(const char* aText)
{
CName result;

RelocFunc<CName* (*)(CName&, const char*)> func(Addresses::CNamePool_AddCstr);
UniversalRelocFunc<CName* (*)(CName&, const char*)> func(Detail::AddressHashes::CNamePool_AddCstr);
func(result, aText);
return result;
}
Expand All @@ -21,14 +21,14 @@ RED4EXT_INLINE RED4ext::CName RED4ext::CNamePool::Add(const CString& aText)
{
CName result;

RelocFunc<CName* (*)(CName&, const CString&)> func(Addresses::CNamePool_AddCString);
UniversalRelocFunc<CName* (*)(CName&, const CString&)> func(Detail::AddressHashes::CNamePool_AddCString);
func(result, aText);
return result;
}

RED4EXT_INLINE void RED4ext::CNamePool::Add(const CName& aName, const char* aText)
{
RelocFunc<uint8_t (*)(const CName&, const char*)> func(Addresses::CNamePool_AddPair);
UniversalRelocFunc<uint8_t (*)(const CName&, const char*)> func(Detail::AddressHashes::CNamePool_AddPair);
func(aName, aText);
}

Expand All @@ -39,7 +39,7 @@ RED4EXT_INLINE void RED4ext::CNamePool::Add(const CName& aName, const CString& a

RED4EXT_INLINE const char* RED4ext::CNamePool::Get(const CName& aName)
{
RelocFunc<const char* (*)(const CName&)> func(Addresses::CNamePool_Get);
UniversalRelocFunc<const char* (*)(const CName&)> func(Detail::AddressHashes::CNamePool_Get);
auto result = func(aName);
if (result)
{
Expand Down
16 changes: 8 additions & 8 deletions include/RED4ext/CString-inl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#include <cstring>

#include <RED4ext/Addresses.hpp>
#include <RED4ext/Detail/AddressHashes.hpp>
#include <RED4ext/Relocation.hpp>

RED4EXT_INLINE RED4ext::CString::CString(Memory::IAllocator* aAllocator)
Expand All @@ -19,41 +19,41 @@ RED4EXT_INLINE RED4ext::CString::CString(Memory::IAllocator* aAllocator)
RED4EXT_INLINE RED4ext::CString::CString(const char* aText, Memory::IAllocator* aAllocator)
: CString(aAllocator)
{
RelocFunc<CString* (*)(CString*, const char*)> func(Addresses::CString_ctor_str);
UniversalRelocFunc<CString* (*)(CString*, const char*)> func(Detail::AddressHashes::CString_ctor_str);
func(this, aText);
}

RED4EXT_INLINE RED4ext::CString::CString(const char* aText, uint32_t aLength, Memory::IAllocator* aAllocator)
: CString(aAllocator)
{
RelocFunc<CString* (*)(CString*, const char*, uint32_t)> func(Addresses::CString_ctor_span);
UniversalRelocFunc<CString* (*)(CString*, const char*, uint32_t)> func(Detail::AddressHashes::CString_ctor_span);
func(this, aText, aLength);
}

RED4EXT_INLINE RED4ext::CString::CString(const std::string& aText, Memory::IAllocator* aAllocator)
: CString(aAllocator)
{
RelocFunc<CString* (*)(CString*, const char*)> func(Addresses::CString_ctor_str);
UniversalRelocFunc<CString* (*)(CString*, const char*)> func(Detail::AddressHashes::CString_ctor_str);
func(this, aText.data());
}

RED4EXT_INLINE RED4ext::CString::CString(const std::string_view& aText, Memory::IAllocator* aAllocator)
: CString(aAllocator)
{
RelocFunc<CString* (*)(CString*, const char*, uint32_t)> func(Addresses::CString_ctor_span);
UniversalRelocFunc<CString* (*)(CString*, const char*, uint32_t)> func(Detail::AddressHashes::CString_ctor_span);
func(this, aText.data(), static_cast<uint32_t>(aText.size()));
}

RED4EXT_INLINE RED4ext::CString::CString(const CString& aOther)
: CString()
{
RelocFunc<CString* (*)(CString*, const CString&)> func(Addresses::CString_copy);
UniversalRelocFunc<CString* (*)(CString*, const CString&)> func(Detail::AddressHashes::CString_copy);
func(this, aOther);
}

RED4EXT_INLINE RED4ext::CString::~CString()
{
RelocFunc<CString* (*)(CString*)> func(Addresses::CString_dtor);
UniversalRelocFunc<CString* (*)(CString*)> func(Detail::AddressHashes::CString_dtor);
func(this);
}

Expand All @@ -70,7 +70,7 @@ RED4EXT_INLINE RED4ext::CString::CString(CString&& aOther) noexcept

RED4EXT_INLINE RED4ext::CString& RED4ext::CString::operator=(const CString& aRhs)
{
RelocFunc<CString* (*)(CString*, const CString&)> func(Addresses::CString_copy);
UniversalRelocFunc<CString* (*)(CString*, const CString&)> func(Detail::AddressHashes::CString_copy);
func(this, aRhs);
return *this;
}
Expand Down
198 changes: 198 additions & 0 deletions include/RED4ext/Detail/AddressHashes.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
#pragma once

#include <cstdint>

#include <RED4ext/Hashing/FNV1a.hpp>

// clang-format off
namespace RED4ext::Detail::AddressHashes
{
#pragma region CBaseFunction
constexpr std::uint32_t CBaseFunction_Handlers = 0x5A7D28A9;
constexpr std::uint32_t CBaseFunction_ExecuteScripted = 0xE1F920D6;
constexpr std::uint32_t CBaseFunction_ExecuteNative = 0xE1321AEB;
constexpr std::uint32_t CBaseFunction_InternalExecute = 0x1817231D;
#pragma endregion

#pragma region CBaseRTTIType
constexpr std::uint32_t CBaseRTTIType_sub_80 = 0xE46F169E;
constexpr std::uint32_t CBaseRTTIType_sub_88 = 0x15BE1744;
constexpr std::uint32_t CBaseRTTIType_sub_90 = 0xA45935A1;
constexpr std::uint32_t CBaseRTTIType_sub_98 = 0xAEA91F1D;
constexpr std::uint32_t CBaseRTTIType_sub_A0 = 0x8ED61BC2;
#pragma endregion

#pragma region CBitfield
constexpr std::uint32_t CBitfield_Unserialize = 0xA6981914;
constexpr std::uint32_t CBitfield_ToString = 0x54231404;
constexpr std::uint32_t CBitfield_FromString = 0xA09B15A8;
#pragma endregion

#pragma region CClass
constexpr std::uint32_t CClass_Unserialize = 0xE4AA0CAD;
constexpr std::uint32_t CClass_ToString = 0x65293F06;
constexpr std::uint32_t CClass_sub_80 = 0x11D11B0C;
constexpr std::uint32_t CClass_sub_88 = 0x4BDF1BB2;
constexpr std::uint32_t CClass_sub_90 = 0xA26D374E;
constexpr std::uint32_t CClass_sub_98 = 0x48C020CA;
constexpr std::uint32_t CClass_sub_A0 = 0x15F21D6F;
constexpr std::uint32_t CClass_sub_B0 = 0xA0911974;
constexpr std::uint32_t CClass_sub_C0 = 0x7DD010C3;
constexpr std::uint32_t CClass_GetMaxAlignment = 0xD14E1230;
constexpr std::uint32_t CClass_sub_D0 = 0x37750EBF;
constexpr std::uint32_t CClass_CreateInstance = 0x5A800F1D;
constexpr std::uint32_t CClass_GetProperty = 0x8F031512;
constexpr std::uint32_t CClass_GetProperties = 0xB412121B;
constexpr std::uint32_t CClass_ClearScriptedData = 0x31F20E93;
constexpr std::uint32_t CClass_InitializeProperties = 0xF4AC12B0;
constexpr std::uint32_t CClass_AssignDefaultValuesToProperties = 0x97DF1590;
#pragma endregion

#pragma region CClassFunction
constexpr std::uint32_t CClassFunction_ctor = 0x602D29F3;
#pragma endregion

#pragma region CClassStaticFunction
constexpr std::uint32_t CClassStaticFunction_ctor = 0x235013BB;
#pragma endregion

#pragma region CEnum
constexpr std::uint32_t CEnum_Unserialize = 0x40D317A6;
constexpr std::uint32_t CEnum_ToString = 0x41A1296;
constexpr std::uint32_t CEnum_FromString = 0x21CA1EC1;
#pragma endregion

#pragma region CGameEngine
constexpr std::uint32_t CGameEngine = 0x97F209D6; // TODO: Check next update, there is hash conflict.
#pragma endregion

#pragma region CGlobalFunction
constexpr std::uint32_t CGlobalFunction_ctor = 0xFA6B24D0;
#pragma endregion

#pragma region CNamePool
constexpr std::uint32_t CNamePool_AddCstr = 0xA00C9B;
constexpr std::uint32_t CNamePool_AddCString = 0xFFD61709;
constexpr std::uint32_t CNamePool_AddPair = 0xD9840BD8;
constexpr std::uint32_t CNamePool_Get = 0x68DF07DC;
#pragma endregion

#pragma region CRTTIRegistrator
constexpr std::uint32_t CRTTIRegistrator_RTTIAsyncId = 0xDDBD19E8;
#pragma endregion

#pragma region CRTTIScriptReferenceType
constexpr std::uint32_t CRTTIScriptReferenceType_ctor = 0xCB8A115C;
constexpr std::uint32_t CRTTIScriptReferenceType_Set = 0x22EE172F;
#pragma endregion

#pragma region CRTTISystem
constexpr std::uint32_t CRTTISystem_Get = 0x4A610F64;
#pragma endregion

#pragma region CStack
constexpr std::uint32_t CStack_vtbl = 0x33175496;
#pragma endregion

#pragma region CString
constexpr std::uint32_t CString_ctor_str = 0xC81F0AAB;
constexpr std::uint32_t CString_ctor_span = 0x7B210877;
constexpr std::uint32_t CString_copy = 0xE8B40B51;
constexpr std::uint32_t CString_dtor = 0x5405072C;
#pragma endregion

#pragma region DynArray
constexpr std::uint32_t DynArray_Realloc = 0x7AA013D2;
#pragma endregion

#pragma region Handle
constexpr std::uint32_t Handle_ctor = 0xBA0C115D;
constexpr std::uint32_t Handle_DecWeakRef = 0x333B1404;
#pragma endregion

#pragma region IScriptable
constexpr std::uint32_t IScriptable_sub_D8 = 0xF8E41DDF;
constexpr std::uint32_t IScriptable_DestructValueHolder = 0x3521331;
#pragma endregion

#pragma region ISerializable
constexpr std::uint32_t ISerializable_sub_30 = 0x6D63649;
constexpr std::uint32_t ISerializable_sub_40 = 0x88B30FF9;
constexpr std::uint32_t ISerializable_sub_78 = 0xA1D93993;
constexpr std::uint32_t ISerializable_sub_A0 = 0xED221B32;
constexpr std::uint32_t ISerializable_sub_C0 = 0x80201C35;
#pragma endregion

#pragma region JobDispatcher
constexpr std::uint32_t JobDispatcher = 0xBAD50B3D; // TODO: Check next update, there is hash conflict.
constexpr std::uint32_t JobDispatcher_DispatchJob = 0x9C441E82;
#pragma endregion

#pragma region JobHandle
constexpr std::uint32_t JobHandle_ctor = 0x6EFF1BD2;
constexpr std::uint32_t JobHandle_dtor = 0x9E480A2E;
constexpr std::uint32_t JobHandle_Join = 0x9C9C097C;
#pragma endregion

#pragma region JobQueue
constexpr std::uint32_t JobQueue_ctor_FromGroup = 0xE750D4B;
constexpr std::uint32_t JobQueue_ctor_FromParams = 0x82BD14F8;
constexpr std::uint32_t JobQueue_dtor = 0x5AF4077C;
constexpr std::uint32_t JobQueue_Capture = 0x41D12C4;
constexpr std::uint32_t JobQueue_SyncWait = 0xD9AD0C00;
#pragma endregion

#pragma region Memory
constexpr std::uint32_t Memory_Vault = 0x1B530DEC;
constexpr std::uint32_t Memory_Vault_Alloc = 0x902A14E0;
constexpr std::uint32_t Memory_Vault_AllocAligned = 0x516917DD;
constexpr std::uint32_t Memory_Vault_Realloc = 0x770A17AC;
constexpr std::uint32_t Memory_Vault_ReallocAligned = 0x56961AA9;
constexpr std::uint32_t Memory_Vault_Free = 0x33421332;
constexpr std::uint32_t Memory_Vault_Unk1 = 0x19EC1367;
constexpr std::uint32_t Memory_PoolStorage_OOM = 0xD54F163A;
#pragma endregion

#pragma region OpcodeHandlers
constexpr std::uint32_t OpcodeHandlers = 0x39532858;
#pragma endregion

#pragma region ResourceDepot
constexpr std::uint32_t ResourceDepot = 0x659A0FC7;
#pragma endregion

#pragma region ResourceLoader
constexpr std::uint32_t ResourceLoader = 0x783C1034;
constexpr std::uint32_t ResourceLoader_FindTokenFast = 0xC86F39B7;
constexpr std::uint32_t ResourceLoader_LoadAsync = 0x4A863580;
#pragma endregion

#pragma region ResourceReference
constexpr std::uint32_t ResourceReference_Load = 0xEB0DA9;
constexpr std::uint32_t ResourceReference_Fetch = 0xB69D158E;
constexpr std::uint32_t ResourceReference_Reset = 0x2308246B;
#pragma endregion

#pragma region ResourceToken
constexpr std::uint32_t ResourceToken_dtor = 0x9A5F0A0D;
constexpr std::uint32_t ResourceToken_Fetch = 0x8C0918CA;
constexpr std::uint32_t ResourceToken_OnLoaded = 0xEB4B25AB;
constexpr std::uint32_t ResourceToken_CancelUnk38 = 0xF6E20CE6;
constexpr std::uint32_t ResourceToken_DestructUnk38 = 0x95831FEE;
#pragma endregion

#pragma region TTypedClass
constexpr std::uint32_t TTypedClass_IsEqual = 0x58630EE8;
#pragma endregion

#pragma region TweakDB
constexpr std::uint32_t TweakDB_Get = 0x36800DE4;
constexpr std::uint32_t TweakDB_CreateRecord = 0x3201127A;
#pragma endregion

#pragma region UpdateRegistrar
constexpr std::uint32_t UpdateRegistrar_RegisterGroupUpdate = 0xFD914605;
constexpr std::uint32_t UpdateRegistrar_RegisterBucketUpdate = 0x192F4EA2;
#pragma endregion
}
// clang-format on
4 changes: 2 additions & 2 deletions include/RED4ext/DynArray.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <functional>
#include <type_traits>

#include <RED4ext/Addresses.hpp>
#include <RED4ext/Detail/AddressHashes.hpp>
#include <RED4ext/Common.hpp>
#include <RED4ext/Relocation.hpp>
#include <RED4ext/Utils.hpp>
Expand Down Expand Up @@ -188,7 +188,7 @@ struct DynArray
using func_t = void (*)(DynArray * aThis, uint32_t aCapacity, uint32_t aElementSize, uint32_t aAlignment,
void (*a5)(int64_t, int64_t, int64_t, int64_t));

RelocFunc<func_t> func(Addresses::DynArray_Realloc);
UniversalRelocFunc<func_t> func(Detail::AddressHashes::DynArray_Realloc);
func(this, newCapacity, sizeof(T), alignment, nullptr);
}

Expand Down
4 changes: 2 additions & 2 deletions include/RED4ext/GameEngine-inl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
#include <RED4ext/GameEngine.hpp>
#endif

#include <RED4ext/Addresses.hpp>
#include <RED4ext/Detail/AddressHashes.hpp>
#include <RED4ext/Relocation.hpp>

RED4EXT_INLINE RED4ext::CGameEngine* RED4ext::CGameEngine::Get()
{
RelocPtr<CGameEngine*> ptr(Addresses::CGameEngine);
UniversalRelocPtr<CGameEngine*> ptr(Detail::AddressHashes::CGameEngine);
return ptr;
}
4 changes: 2 additions & 2 deletions include/RED4ext/Handle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <type_traits>

#include <RED4ext/Addresses.hpp>
#include <RED4ext/Detail/AddressHashes.hpp>
#include <RED4ext/Memory/SharedPtr.hpp>
#include <RED4ext/Relocation.hpp>

Expand All @@ -26,7 +26,7 @@ class Handle : public SharedPtrWithAccess<T>

explicit Handle(T* aPtr)
{
RelocFunc<Handle* (*)(Handle*, T*)> ctor(Addresses::Handle_ctor);
UniversalRelocFunc<Handle* (*)(Handle*, T*)> ctor(Detail::AddressHashes::Handle_ctor);
ctor(this, aPtr);
}

Expand Down
Loading

0 comments on commit c3d87c2

Please sign in to comment.