Merge pull request #89 from ShFil119/test

Check if address is used twice in InjectHook
This commit is contained in:
aap 2019-07-03 13:43:40 +02:00 committed by GitHub
commit 738bde1c15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 18 deletions

View File

@ -2084,7 +2084,7 @@ STARTPATCHES
InjectHook(0x4D2BB0, &CPed::Avoid, PATCH_JUMP); InjectHook(0x4D2BB0, &CPed::Avoid, PATCH_JUMP);
InjectHook(0x4C6A50, &CPed::ClearAimFlag, PATCH_JUMP); InjectHook(0x4C6A50, &CPed::ClearAimFlag, PATCH_JUMP);
InjectHook(0x4C64F0, &CPed::ClearLookFlag, PATCH_JUMP); InjectHook(0x4C64F0, &CPed::ClearLookFlag, PATCH_JUMP);
InjectHook(0x4E5BD0, &CPed::IsPedHeadAbovePos, PATCH_JUMP); InjectHook(0x4EB670, &CPed::IsPedHeadAbovePos, PATCH_JUMP);
InjectHook(0x4E68A0, &CPed::FinishedAttackCB, PATCH_JUMP); InjectHook(0x4E68A0, &CPed::FinishedAttackCB, PATCH_JUMP);
InjectHook(0x4E5BD0, &CheckForPedsOnGroundToAttack, PATCH_JUMP); InjectHook(0x4E5BD0, &CheckForPedsOnGroundToAttack, PATCH_JUMP);
InjectHook(0x4E6BA0, &CPed::Attack, PATCH_JUMP); InjectHook(0x4E6BA0, &CPed::Attack, PATCH_JUMP);

View File

@ -9,6 +9,11 @@
#define NOVMT __declspec(novtable) #define NOVMT __declspec(novtable)
#define SETVMT(a) *((DWORD_PTR*)this) = (DWORD_PTR)a #define SETVMT(a) *((DWORD_PTR*)this) = (DWORD_PTR)a
#include <algorithm>
#include <vector>
#include "common.h"
enum enum
{ {
PATCH_CALL, PATCH_CALL,
@ -28,6 +33,21 @@ enum
extern int gtaversion; 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> template<typename T>
inline T AddressByVersion(uint32_t addressIII10, uint32_t addressIII11, uint32_t addressIIISteam, uint32_t addressvc10, uint32_t addressvc11, uint32_t addressvcSteam) 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]); VirtualProtect((void*)address, nCount, dwProtect[0], &dwProtect[1]);
} }
extern std::vector<int32> usedAddresses;
template<typename AT, typename HT> inline void template<typename AT, typename HT> inline void
InjectHook(AT address, HT hook, unsigned int nType=PATCH_NOTHING) 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]; DWORD dwProtect[2];
switch ( nType ) switch ( nType )
{ {
@ -159,22 +188,5 @@ inline void InterceptVmethod(void *dst, T func, uint32_t a)
Patch(a, func); 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 STARTPATCHES static StaticPatcher Patcher([](){
#define ENDPATCHES }); #define ENDPATCHES });

View File

@ -16,6 +16,10 @@
#include "Automobile.h" #include "Automobile.h"
#include "debugmenu_public.h" #include "debugmenu_public.h"
#include <vector>
std::vector<int32> usedAddresses;
void **rwengine = *(void***)0x5A10E1; void **rwengine = *(void***)0x5A10E1;
DebugMenuAPI gDebugMenuAPI; DebugMenuAPI gDebugMenuAPI;