// + IMPLEMENTATION FOR MANAGING MEMORY class CMemManager { public: void RevertAll( ) { for( std::deque::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::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 _blocks; }; CMemManager memmgr;