1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2024-12-12 00:08:50 +01:00
HLMetaModOfficial/core/sourcehook/sourcehook_impl_cvfnptr.h

92 lines
1.9 KiB
C++

/* ======== SourceHook ========
* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
*
* Author(s): Pavol "PM OnoTo" Marko
* ============================
*/
#ifndef __SOURCEHOOK_IMPL_CVFNPTR_H__
#define __SOURCEHOOK_IMPL_CVFNPTR_H__
#include "sh_list.h"
#include "sh_memory.h"
#include "sh_pagealloc.h"
#include "sourcehook_impl_cleanuptask.h"
namespace SourceHook
{
namespace Impl
{
class CVfnPtr
{
static CPageAlloc ms_AlignedPageAllocator;
// *** Data ***
void *m_Ptr;
void *m_OrigEntry;
void *m_OrigCallThunk; // See Init() method
List<CHookManager*> m_HookMans;
List<CIface> m_IfaceList;
public:
// *** Descriptor ***
typedef void* Descriptor;
// *** Interface ***
CVfnPtr(void *ptr);
~CVfnPtr();
bool Init();
inline bool operator==(const Descriptor &other);
inline void *GetPtr() const;
inline void *GetOrigEntry() const;
void *GetOrigCallAddr() const;
inline List<CIface> &GetIfaceList();
inline const List<CIface> &GetIfaceList() const;
CIface *FindIface(void *iface);
CIface &GetIface(void *iface);
bool Patch(void *newValue);
bool Revert();
ICleanupTask *GetCleanupTask();
void AddHookMan(CHookManager *pHookMan);
// If this returns false, it means that there is no hook manager left
// to use and that this vfnptr should be removed.
bool HookManRemoved(CHookManager *pHookMan);
};
// *** Implementation ***
inline bool CVfnPtr::operator==(const Descriptor &other)
{
return m_Ptr == other;
}
inline void *CVfnPtr::GetPtr() const
{
return m_Ptr;
}
inline void *CVfnPtr::GetOrigEntry() const
{
return m_OrigEntry;
}
inline List<CIface> &CVfnPtr::GetIfaceList()
{
return m_IfaceList;
}
inline const List<CIface> &CVfnPtr::GetIfaceList() const
{
return m_IfaceList;
}
}
}
#endif