diff options
author | Filip Gawin <filip.gawin@zoho.com> | 2019-07-02 20:28:20 +0200 |
---|---|---|
committer | Filip Gawin <filip.gawin@zoho.com> | 2019-07-02 21:38:26 +0200 |
commit | b6a70ecb315f2f4c361e33ed2803b1ebfd94f031 (patch) | |
tree | f20bf751d3770460bf8467854e31e4a966d01435 /src/patcher.h | |
parent | Merge pull request #80 from ShFil119/special (diff) | |
download | re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.tar re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.tar.gz re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.tar.bz2 re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.tar.lz re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.tar.xz re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.tar.zst re3-b6a70ecb315f2f4c361e33ed2803b1ebfd94f031.zip |
Diffstat (limited to 'src/patcher.h')
-rw-r--r-- | src/patcher.h | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/src/patcher.h b/src/patcher.h index 43618b47..87a6bea4 100644 --- a/src/patcher.h +++ b/src/patcher.h @@ -9,6 +9,11 @@ #define NOVMT __declspec(novtable) #define SETVMT(a) *((DWORD_PTR*)this) = (DWORD_PTR)a +#include <algorithm> +#include <vector> + +#include "common.h" + enum { PATCH_CALL, @@ -28,6 +33,21 @@ enum extern int gtaversion; +class StaticPatcher +{ +private: + using Patcher = void(*)(); + + Patcher m_func; + StaticPatcher *m_next; + static StaticPatcher *ms_head; + + void Run() { m_func(); } +public: + StaticPatcher(Patcher func); + static void Apply(); +}; + template<typename T> inline T AddressByVersion(uint32_t addressIII10, uint32_t addressIII11, uint32_t addressIIISteam, uint32_t addressvc10, uint32_t addressvc11, uint32_t addressvcSteam) { @@ -110,9 +130,18 @@ ClearCC(AT address, unsigned int nCount) VirtualProtect((void*)address, nCount, dwProtect[0], &dwProtect[1]); } +extern std::vector<int32> usedAddresses; + template<typename AT, typename HT> inline void InjectHook(AT address, HT hook, unsigned int nType=PATCH_NOTHING) { + if(std::any_of(usedAddresses.begin(), usedAddresses.end(), + [address](AT value) { return (int32)value == address; })) { + debug("Used address %#06x twice when injecting hook\n", address); + } + + usedAddresses.push_back((int32)address); + DWORD dwProtect[2]; switch ( nType ) { @@ -159,22 +188,5 @@ inline void InterceptVmethod(void *dst, T func, uint32_t a) Patch(a, func); } - - -class StaticPatcher -{ -private: - using Patcher = void(*)(); - - Patcher m_func; - StaticPatcher *m_next; - static StaticPatcher *ms_head; - - void Run() { m_func(); } -public: - StaticPatcher(Patcher func); - static void Apply(); -}; - #define STARTPATCHES static StaticPatcher Patcher([](){ #define ENDPATCHES }); |