Files
csgo2_tiny_server_plugin_sy…/csgo2/VTHook.h
2023-10-01 02:28:13 +08:00

101 lines
1.5 KiB
C++

#pragma once
#include "pch.h"
class VTHook
{
public:
VTHook()
{
memset( this, 0, sizeof( VTHook) );
}
VTHook( PDWORD64* ppdwClassBase )
{
bInitialize( ppdwClassBase );
}
~VTHook()
{
UnHook();
}
void ClearClassBase()
{
m_ClassBase = NULL;
}
bool bInitialize( PDWORD64* ppdwClassBase )
{
m_ClassBase = ppdwClassBase;
m_OldVT = *ppdwClassBase;
m_VTSize = GetVTCount( *ppdwClassBase );
m_NewVT = new DWORD64[ m_VTSize ];
memcpy( m_NewVT, m_OldVT, sizeof( DWORD64) * m_VTSize );
*ppdwClassBase = m_NewVT;
return true;
}
bool bInitialize( PDWORD64** pppdwClassBase ) // fix for pp
{
return bInitialize( *pppdwClassBase );
}
void UnHook()
{
if( m_ClassBase )
{
*m_ClassBase = m_OldVT;
}
}
void ReHook()
{
if( m_ClassBase )
{
*m_ClassBase = m_NewVT;
}
}
int iGetFuncCount()
{
return ( int )m_VTSize;
}
DWORD64 GetFuncAddress( int Index )
{
if( Index >= 0 && Index <= ( int )m_VTSize && m_OldVT != NULL )
{
return m_OldVT[ Index ];
}
return NULL;
}
PDWORD64 GetOldVT()
{
return m_OldVT;
}
DWORD64 HookFunction( DWORD64 dwNewFunc, unsigned int iIndex )
{
if( m_NewVT && m_OldVT && iIndex <= m_VTSize && iIndex >= 0 )
{
m_NewVT[ iIndex ] = dwNewFunc;
return m_OldVT[ iIndex ];
}
return NULL;
}
private:
DWORD64 GetVTCount( PDWORD64 pdwVMT )
{
DWORD64 dwIndex = 0;
while (IsBadCodePtr((FARPROC)pdwVMT[dwIndex]) == false) {
dwIndex++;
}
return dwIndex;
}
PDWORD64* m_ClassBase;
PDWORD64 m_NewVT, m_OldVT;
DWORD64 m_VTSize;
};