34 lines
717 B
C++
34 lines
717 B
C++
|
||
|
||
class vmt_hook
|
||
{
|
||
public:
|
||
vmt_hook(void* classptr)
|
||
{
|
||
this->m_class_pointer = reinterpret_cast<void***>(classptr);
|
||
m_old_vmt = *m_class_pointer;
|
||
|
||
size_t table_size = 0;
|
||
while (m_old_vmt[table_size])
|
||
table_size++;
|
||
|
||
m_new_vmt = new void*[table_size + 1];
|
||
memcpy(&m_new_vmt[1], m_old_vmt, sizeof(void*) * table_size);
|
||
m_new_vmt[0] = m_old_vmt[-1];
|
||
|
||
*m_class_pointer = &m_new_vmt[1];
|
||
}
|
||
|
||
template<typename fn = void*>
|
||
fn hook(size_t index, void* new_function)
|
||
{
|
||
if (new_function)
|
||
m_new_vmt[index + 1] = new_function;
|
||
return reinterpret_cast<fn>(m_old_vmt[index]);
|
||
}
|
||
|
||
private:
|
||
void*** m_class_pointer = nullptr;
|
||
void** m_old_vmt = nullptr;
|
||
void** m_new_vmt = nullptr;
|
||
}; |