rendered paste body// + IMPLEMENTATION FOR MANAGING MEMORY
class CMemManager
{
public:
void RevertAll( )
{
for( std::deque<MemBlock>::iterator i = _blocks.begin( ); i != _blocks.end( ); i++ )
{
DWORD dwOldProtection;
VirtualProtect( (*i).addr, (*i).size, PAGE_EXECUTE_READWRITE, &dwOldProtection );
memcpy( (*i).addr, (*i).olddata, (*i).size );
VirtualProtect( (*i).addr, (*i).size, dwOldProtection, &dwOldProtection );
}
_blocks.clear( );
}
void Revert( int id )
{
for( std::deque<MemBlock>::iterator i = _blocks.begin( ); i != _blocks.end( ); i++ )
{
if( (*i).id == id )
{
DWORD dwOldProtection;
VirtualProtect( (*i).addr, (*i).size, PAGE_EXECUTE_READWRITE, &dwOldProtection );
memcpy( (*i).addr, (*i).olddata, (*i).size );
VirtualProtect( (*i).addr, (*i).size, dwOldProtection, &dwOldProtection );
_blocks.erase( i );
Revert( id );
break;
}
}
}
void WriteBlock( void* addr, int size, char* newdata, int id = -1 )
{
DWORD dwOldProtection;
VirtualProtect( addr, size, PAGE_EXECUTE_READWRITE, &dwOldProtection );
char* tmp = new char[ size ];
memcpy( tmp, addr, size );
MemBlock d = { addr, size, tmp, id };
_blocks.push_back( d );
memcpy( addr, newdata, size );
VirtualProtect( addr, size, dwOldProtection, &dwOldProtection );
}
enum BlockType { NOCLIP };
protected:
struct MemBlock { void* addr; int size; char* olddata; int id; };
std::deque<MemBlock> _blocks;
};
CMemManager memmgr;