#pragma once #include "FunctionAddressProvider.h" #include "PatchedFunctionData.h" #include "utils/logger.h" #include #include #include #include #include #include #include #include #include #include #include class PatchedFunctionData { public: ~PatchedFunctionData(); explicit PatchedFunctionData(std::shared_ptr functionAddressProvider) : functionAddressProvider(std::move(functionAddressProvider)) { } static std::optional> make_shared_v2(std::shared_ptr functionAddressProvider, function_replacement_data_v2_t *replacementData, MEMHeapHandle heapHandle); static std::optional> make_shared_v3(std::shared_ptr functionAddressProvider, function_replacement_data_v3_t *replacementData, MEMHeapHandle heapHandle); bool allocateDataForJumps(); bool getAddressForExecutable(uint32_t *outAddress) const; bool updateFunctionAddresses(); void generateJumpToOriginal(); void generateReplacementJump(); [[nodiscard]] bool shouldBePatched() const; uint32_t getHandle() { return (uint32_t) this; } uint32_t *jumpToOriginal = {}; uint32_t *jumpData = {}; uint32_t realEffectiveFunctionAddress = {}; uint32_t realPhysicalFunctionAddress = {}; uint32_t *realCallFunctionAddressPtr = {}; uint32_t replacementFunctionAddress = {}; uint32_t replacedInstruction = {}; uint32_t replaceWithInstruction = {}; uint32_t jumpDataSize = 15; MEMHeapHandle heapHandle = nullptr; FunctionPatcherFunctionType type = {}; std::set titleIds; uint16_t titleVersionMin = 0; uint16_t titleVersionMax = 0xFFFF; std::optional executableName = {}; uint32_t textOffset = 0; bool isPatched = {}; std::optional library = {}; FunctionPatcherTargetProcess targetProcess = {}; std::optional functionName = {}; std::shared_ptr functionAddressProvider = {}; };