Skip to content

Commit

Permalink
Several fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
rafradek committed May 11, 2024
1 parent 5e3e408 commit 5a68dc1
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/mem/detour.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,7 @@ void CDetouredFunc::Reconfigure()
assert(detour->EnsureUniqueInnerPtrs());
}

this->m_VirtualHookOptional = CVirtualHookBase(first->m_pCallback, CVirtualHookBase::DETOUR_HOOK);
this->m_VirtualHookOptional = CVirtualHookBase(first->m_pCallback, CVirtualHookBase::DETOUR_HOOK, first->GetName());
for (auto &[pVFuncPtr, pVT] : this->m_FoundFuncPtrAndVTablePtr) {
CVirtualHookFunc::Find(pVFuncPtr, pVT).AddVirtualHook(&this->m_VirtualHookOptional);
}
Expand Down
10 changes: 10 additions & 0 deletions src/mem/virtual_hook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "addr/addr.h"
#include "mem/protect.h"
#include "util/rtti.h"
#include "stub/server.h"

bool CVirtualHook::DoLoad()
{
Expand Down Expand Up @@ -282,12 +283,15 @@ void CVirtualHookFunc::AddVirtualHook(CVirtualHookBase *hook)
return a->GetPriority() > b->GetPriority();
});
DoHook();
this->m_szName = this->m_Hooks.front()->GetName();
}
void CVirtualHookFunc::RemoveVirtualHook(CVirtualHookBase *hook)
{
int prec = this->m_Hooks.size();
this->m_Hooks.erase(std::remove(this->m_Hooks.begin(), this->m_Hooks.end(), hook), this->m_Hooks.end());
DoHook();
if (!this->m_Hooks.empty())
this->m_szName = this->m_Hooks.front()->GetName();
}


Expand All @@ -302,6 +306,11 @@ void CVirtualHookFunc::CleanUp()
void CVirtualHookFunc::UnloadAll()
{
if (this->m_bHooked) {
// Check if some extension had overriden our hook, but not when the game is in shutdown/restart state as it does not matter by then
int state = g_HostState.GetRef().m_currentState;
if (this->m_pFuncFirst != *this->m_pFuncPtr && (state == 6 || state == 7)) {
ConColorMsg(Color(0xff, 0x20, 0x20), "[Sigsegv-MvM] Some plugin/extension had hooked a virtual %s after this extension. It should be unloaded first (but it wasn't) before this extension. This can cause issues\n", this->m_szName.c_str());
}
this->m_bHooked = false;
MemProtModifier_RX_RWX(this->m_pFuncPtr, sizeof(void **));
*this->m_pFuncPtr = this->m_pFuncInner;
Expand All @@ -328,4 +337,5 @@ void CVirtualHookFunc::DoHook()
}
MemProtModifier_RX_RWX(this->m_pFuncPtr, sizeof(void **));
*this->m_pFuncPtr = first->m_pCallback;
this->m_pFuncFirst = first->m_pCallback;
}
13 changes: 9 additions & 4 deletions src/mem/virtual_hook.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ class CVirtualHookBase

CVirtualHookBase() {}

CVirtualHookBase(void *callback, HookPriority priority = NORMAL) : m_pCallback(callback), m_Priority(priority) {}
CVirtualHookBase(void *callback, HookPriority priority = NORMAL, std::string name = ""s) : m_pCallback(callback), m_Priority(priority), m_szName(name) {}

virtual const char *GetName() { return m_szName.c_str(); };

virtual void SetInner(void *inner, void *vtable) { }

Expand All @@ -35,7 +37,10 @@ class CVirtualHookBase

void *m_pCallback;
HookPriority m_Priority;
friend class CVirtualHookFunc;

std::string m_szName;

friend class CVirtualHookFunc;
};

class CVirtualHook : public CVirtualHookBase
Expand All @@ -51,8 +56,6 @@ class CVirtualHook : public CVirtualHookBase
virtual void DoEnable();
virtual void DoDisable();

virtual const char *GetName() { return m_szName.c_str(); };

virtual void SetInner(void *inner, void *vtable) { *m_pInner = inner; }

// Change VTable, keep offset.
Expand Down Expand Up @@ -172,6 +175,8 @@ class CVirtualHookFunc

std::vector<CVirtualHookBase *> m_Hooks;
static inline std::map<void **, CVirtualHookFunc> s_FuncMap;
void *m_pFuncFirst = nullptr;
std::string m_szName;
};

#define VHOOK_CALL(name) (this->*Actual)
Expand Down
10 changes: 6 additions & 4 deletions src/mod/etc/mapentity_additions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,8 @@ namespace Mod::Etc::Mapentity_Additions
ActivateLoadedInput();
}

RefCount rc_SpecialParsedNameFail;

CBaseEntity *DoSpecialParsing(const char *szName, CBaseEntity *pStartEntity, const std::function<CBaseEntity *(CBaseEntity *, const char *)>& functor)
{
if (szName[0] == '@' && szName[1] != '\0') {
Expand Down Expand Up @@ -582,8 +584,8 @@ namespace Mod::Etc::Mapentity_Additions
}
}
}

return functor(pStartEntity, szName+1);
SCOPED_INCREMENT(rc_SpecialParsedNameFail);
return functor(pStartEntity, szName);
}

std::string last_entity_name;
Expand All @@ -600,7 +602,7 @@ namespace Mod::Etc::Mapentity_Additions
auto entList = reinterpret_cast<CGlobalEntityList *>(this);
if (szName == nullptr || szName[0] == '\0') return nullptr;

if (szName[0] == '@') return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return entList->FindEntityByClassname(entity, realname, filter);});
if (szName[0] == '@' && !rc_SpecialParsedNameFail) return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return entList->FindEntityByClassname(entity, realname, filter);});

if (!cvar_fast_lookup.GetBool()) return DETOUR_MEMBER_CALL(CGlobalEntityList_FindEntityByClassname)(pStartEntity, szName, filter);

Expand Down Expand Up @@ -656,7 +658,7 @@ namespace Mod::Etc::Mapentity_Additions

if (szName[0] == '@' && szName[1] == 'h' && szName[2] == '@') { return pStartEntity == nullptr ? CHandle<CBaseEntity>::FromIndex(atoi(szName+3)) : nullptr; }

if (szName[0] == '@') return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return servertools->FindEntityByName(entity, realname, pSearchingEntity, pActivator, pCaller, pFilter);});
if (szName[0] == '@' && !rc_SpecialParsedNameFail) return DoSpecialParsing(szName, pStartEntity, [&](CBaseEntity *entity, const char *realname) {return servertools->FindEntityByName(entity, realname, pSearchingEntity, pActivator, pCaller, pFilter);});

if (szName[0] == '!' || !cvar_fast_lookup.GetBool()) return DETOUR_MEMBER_CALL(CGlobalEntityList_FindEntityByName)(pStartEntity, szName, pSearchingEntity, pActivator, pCaller, pFilter);

Expand Down
10 changes: 4 additions & 6 deletions src/mod/mvm/human_death_yells.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,11 @@ namespace Mod::MvM::Human_Death_Yells
{
// Avoid going into the branch playing mvm sound

// Change cmp 0 to 0x55
buf[0x06] = 0x55;
// Change jnz to jz
buf[0x08] = 0x84;
/* make the conditional jump unconditional */
buf[0x07] = 0x90;
buf[0x08] = 0xe9;


mask[0x06] = 0xFF;
mask[0x07] = 0xFF;
mask[0x08] = 0xFF;
return true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/mod/pop/tank_extensions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1054,8 +1054,8 @@ namespace Mod::Pop::Tank_Extensions

DETOUR_DECL_MEMBER(int, CTFTankBoss_GetCurrencyValue)
{
if (rc_CTFTankBoss_Event_Killed && restOfCurrency != -1) return restOfCurrency;
auto result = DETOUR_MEMBER_CALL(CTFTankBoss_GetCurrencyValue)();
if (rc_CTFTankBoss_Event_Killed && restOfCurrency != -1) return restOfCurrency;
return result;
}

Expand Down

0 comments on commit 5a68dc1

Please sign in to comment.