Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class CVMTHookManager
- {
- public:
- CVMTHookManager( void )
- {
- memset( this, 0, sizeof( CVMTHookManager ) );
- }
- CVMTHookManager( PDWORD* ppdwClassBase )
- {
- bInitialize( ppdwClassBase );
- }
- bool UnhookVMT( PDWORD* ppdwClassBase )
- {
- *ppdwClassBase = m_pdwOldVMT;
- return true;
- }
- bool bInitialize( PDWORD* ppdwClassBase )
- {
- m_pdwOldVMT = *ppdwClassBase;
- m_dwVMTSize = dwGetVMTCount( *ppdwClassBase );
- m_pdwNewVMT = new DWORD[ m_dwVMTSize + 2 ];
- memcpy( m_pdwNewVMT, m_pdwOldVMT, sizeof( DWORD ) * m_dwVMTSize );
- *ppdwClassBase = m_pdwNewVMT;
- return true;
- }
- bool bInitialize( PDWORD** pppdwClassBase )
- {
- return bInitialize( *pppdwClassBase );
- }
- DWORD dwHookMethod( DWORD dwNewFunc, int iIndex )
- {
- if ( m_pdwNewVMT && m_pdwOldVMT && iIndex >= 0 && iIndex <= m_dwVMTSize )
- {
- m_pdwNewVMT[ iIndex ] = dwNewFunc;
- return m_pdwOldVMT[ iIndex ];
- }
- return NULL;
- }
- VOID dwUnHookMethod( int iIndex )
- {
- m_pdwNewVMT[ iIndex ] = m_pdwOldVMT[ iIndex ];
- }
- private:
- DWORD dwGetVMTCount( PDWORD pdwVMT )
- {
- DWORD dwIndex;
- for ( dwIndex = 0; pdwVMT[ dwIndex ]; dwIndex++ )
- {
- if ( IsBadCodePtr( ( FARPROC ) pdwVMT[ dwIndex ] ) )
- {
- break;
- }
- }
- return dwIndex;
- }
- PDWORD m_pdwNewVMT, m_pdwOldVMT;
- DWORD m_dwVMTSize;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement